Skip to content

Commit

Permalink
feat: add feature to reuse previous kite connect instance
Browse files Browse the repository at this point in the history
  • Loading branch information
ranjanrak committed May 20, 2021
1 parent b6c34a8 commit eecc3c6
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 16 deletions.
14 changes: 10 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,16 +16,22 @@ pip install optionchain_stream
| api_key | string | Kite connect API key |
| secret_key | string | Kite connect API secret |
| request_token | string | Kite connect one-time token obtained after the [login flow](https://kite.trade/docs/connect/v3/user/#login-flow) |
| access_token | string | The authentication token obtained post the [login flow](https://kite.trade/docs/connect/v3/user/#login-flow) using request_token and secret_key
| option_symbol | string | Symbol of the instrument(eg: NIFTY, SBIN, ONGC, etc) |
| option_expiry_date | string | Option expiry date in yyyy-mm-dd format(eg: '2021-02-25', '2021-04-29')|

#### Usage
```
from optionchain_stream import OptionChain
OptionStream = OptionChain("api_key", "secret_key", "request_token",
"option_symbol", "option_expiry_date in yyyy-mm-dd format")
# Eg: OptionChain('XXXXXX', 'XXXXXXX', 'XXXXXX',
'ONGC', '2021-02-25')
OptionStream = OptionChain("option_symbol", "option_expiry_date in yyyy-mm-dd format", "api_key",
"api_secret=None", "request_token=None", "access_token=None")
# You can directly pass access_token from previous active session
Eg: OptionStream = OptionChain("ONGC", "2021-02-25", "your_api_key", access_token="XXXXXX")
# Generate new session by passing api_secret and request_token
Eg: OptionStream = OptionChain("ONGC", "2021-02-25", "your_api_key", api_secret="XXXXX",
request_token="XXXXXX")
# Sync master instrument data to DB(redis)
# This sync is required only once daily at initial run
Expand Down
19 changes: 14 additions & 5 deletions optionchain_stream/option_chain.py
Original file line number Diff line number Diff line change
@@ -1,20 +1,21 @@
"""
@author: rakeshr
"""
import time
from kiteconnect import KiteConnect
from optionchain_stream.websocket import WebsocketClient
from optionchain_stream.instrument_file import InstrumentMaster

class OptionChain():
"""
Wrapper class to fetch option chain steaming data
"""
def __init__(self, api_key, api_secret, request_token, symbol, expiry):
def __init__(self, symbol, expiry, api_key, api_secret=None, request_token=None, access_token=None):
self.symbol = symbol
self.expiry = expiry
self.api_key = api_key
self.api_secret = api_secret
self.request_token = request_token
self.symbol = symbol
self.expiry = expiry
self.access_token = access_token
self.instrumentClass = InstrumentMaster(self.api_key)

def sync_instruments(self):
Expand All @@ -27,7 +28,15 @@ def create_option_chain(self):
"""
Wrapper method to fetch sreaming option chain for requested symbol/expiry
"""
self.socketClient = WebsocketClient(self.api_key, self.api_secret, self.request_token, self.symbol, self.expiry)
# Assign/generate access_token using request_token and api_secret
if self.api_secret and self.request_token:
self.kite = KiteConnect(api_key=self.api_key)
self.data = self.kite.generate_session(self.request_token, api_secret=self.api_secret)
self.access_token = self.data["access_token"]
elif self.access_token:
self.access_token = self.access_token

self.socketClient = WebsocketClient(self.symbol, self.expiry, self.api_key, self.access_token)
# create streaming websocket data
self.socketClient.queue_callBacks()
# Keep fetching streaming Queue
Expand Down
12 changes: 5 additions & 7 deletions optionchain_stream/websocket.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,16 @@
for requested option symbol
"""

import json, logging, asyncio, time
import logging, time
from multiprocessing import Process, Queue
from kiteconnect import KiteConnect, KiteTicker
from kiteconnect import KiteTicker
from optionchain_stream.instrument_file import InstrumentMaster


class WebsocketClient:
def __init__(self, api_key, api_secret, request_token, symbol, expiry):
# Create kite connect instance
self.kite = KiteConnect(api_key=api_key)
self.data = self.kite.generate_session(request_token, api_secret=api_secret)
self.kws = KiteTicker(api_key, self.data["access_token"], debug=True)
def __init__(self, symbol, expiry, api_key, acess_token):
# Create kite ticker instance
self.kws = KiteTicker(api_key, acess_token, debug=True)
self.symbol = symbol
self.expiry = expiry
self.instrumentClass = InstrumentMaster(api_key)
Expand Down

0 comments on commit eecc3c6

Please sign in to comment.