forked from jigneshpylab/ZerodhaPythonScripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsample_algo_banknifty_options.py
110 lines (102 loc) · 4.34 KB
/
sample_algo_banknifty_options.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import numpy as np
import sys
import pandas as pd
import time
import datetime
import pickle
quantity = 25
strike = 35000
option_type = "CE"
scantime = 5 #second
#You need to manually login and save your kite object to disc as kitetoken.pkl
try:
with open('kitetoken.pkl', 'rb') as input:
kite = pickle.load(input)
print(kite.profile())
except Exception as e:
print("ERROR in kite token")
sys.exit()
df_inst = pd.read_csv("https://api.kite.trade/instruments")
def get_trading_symbol():
df = df_inst[df_inst['segment'] == "NFO-OPT"]
df = df[df['tradingsymbol'].str.startswith("{}".format("BANKNIFTY"))]
df['expiry'] = pd.to_datetime(df['expiry'])
expirylist = list(set(df[['tradingsymbol', 'expiry']].sort_values(by=['expiry'])['expiry'].values))
expirylist = np.array([np.datetime64(x, 'D') for x in expirylist])
expirylist = np.sort(expirylist)
today = np.datetime64('today', 'D') + np.timedelta64(0,'D')
expirylist = expirylist[expirylist >= today]
expiry_index = 0
next_expiry = expirylist[expiry_index]
print("Selected expiry :", next_expiry)
df = df[(df['expiry'] == next_expiry)]
RHATM = int((round((strike) / 100) * 100))
tradingsymbol = df[df['strike'] == RHATM]
tradingsymbol = tradingsymbol[tradingsymbol['instrument_type'] == option_type]
instrument_token = tradingsymbol.instrument_token.values[0]
tradingsymbol = tradingsymbol.tradingsymbol.values[0]
return tradingsymbol,instrument_token
tradingsymbol,instrument_token = get_trading_symbol()
print("tradingsymbol",tradingsymbol)
def get_RSI(df, base="close", period=14):
delta = df[base].diff()
up, down = delta.copy(), delta.copy()
up[up < 0] = 0
down[down > 0] = 0
rUp = up.ewm(com=period - 1, adjust=False).mean()
rDown = down.ewm(com=period - 1, adjust=False).mean().abs()
df['RSI'] = 100 - 100 / (1 + rUp / rDown)
df['RSI'].fillna(0, inplace=True)
return df.RSI.values[-1]
def get_historicaldata(token=instrument_token):
enddate = datetime.datetime.today()
startdate = enddate - datetime.timedelta(15)
df = pd.DataFrame(columns=['date', 'open', 'high', 'low', 'close', 'volume'])
try :
data = kite.historical_data(token, startdate, enddate, interval='minute')
df = pd.DataFrame.from_dict(data, orient='columns', dtype=None)
if not df.empty:
df = df[['date', 'open', 'high', 'low', 'close', 'volume']]
df['date'] = df['date'].astype(str).str[:-6]
else:
print("Error in getting historical data")
except Exception as e:
print("Error in getting historical data",e)
return df
def place_order(tradingsymbol,transaction_type,quantity,product='MIS'):
print("New_order : {},{},{}.......{}".format(transaction_type,quantity,tradingsymbol, datetime.datetime.now()))
quantity = int(quantity)
ret = 0
try:
order_id = kite.place_order(exchange='NFO',tradingsymbol=tradingsymbol,transaction_type=transaction_type,
quantity=quantity,product=product,order_type='MARKET',validity='DAY',
trigger_price='0',variety="regular")
ret = order_id
except Exception as e:
print(e)
return ret
order_placed = False
def run():
order_placed = False
while not order_placed:
if order_placed == True:
break
df = get_historicaldata()
rsi = get_RSI(df)
rsi_cond = False
if rsi > 50 :
rsi_cond = True
ohlc_dict = kite.quote(['NFO:{}'.format(tradingsymbol)])['NFO:{}'.format(tradingsymbol)]
vwap = ohlc_dict['average_price']
last_price = ohlc_dict['last_price']
vwap_cond = False
if last_price > vwap:
vwap_cond = True
cond_xyz = True
print("\n",tradingsymbol,"RSI {:.2f} {} ,".format(rsi,rsi_cond),"last_price {:.2f} ,".format(last_price),
"vwap {:.2f} {}".format(vwap,vwap_cond), datetime.datetime.now())
if all([rsi_cond,vwap_cond,cond_xyz]):
order_placed = True
place_order(tradingsymbol=tradingsymbol, transaction_type="BUY", quantity=quantity,product='MIS')
time.sleep(scantime)
run()