This code is working, but it only keeps on searching. It doesn’t take any orders. and no any error mentioning.
please help me
import pdb
import time
import datetime
import traceback
from Dhan_Tradehull import Tradehull
import pandas as pd
from pprint import pprint
import talib
import pandas_ta as ta
import xlwings as xw
import winsound
client_code = "client_code"
token_id = "token_id"
tsl = Tradehull(client_code,token_id)
opening_balance = tsl.get_balance()
base_capital = 900
market_money = max(0, opening_balance - base_capital)
if market_money == 0:
base_capital = opening_balance
market_money_risk = (market_money * 1) / 100
base_capital_risk = (base_capital * 0.5) / 100
max_risk_for_today = base_capital_risk + market_money_risk
max_order_for_today = 5
risk_per_trade = max_risk_for_today / max_order_for_today
atr_multipler = 2
risk_reward = 3
watchlist = ['IDFCFIRSTB', 'NMDC', 'UJJIVANSFB', 'SOUTHBANK', 'PATELENG', 'COALINDIA', 'LLOYDSENGG', 'DABUR', 'ITC']
single_order = {
'name': None, 'date': None, 'entry_time': None, 'entry_price': None, 'buy_sell': None,
'qty': None, 'sl': None, 'exit_time': None, 'exit_price': None, 'pnl': None,
'remark': None, 'traded': None
}
orderbook = {name: single_order.copy() for name in watchlist}
wb = xw.Book('Live Trade Data.xlsx')
live_Trading = wb.sheets['Live_Trading']
completed_orders_sheet = wb.sheets['completed_orders']
reentry = "yes"
completed_orders = []
bot_token = "bot_token"
receiver_chat_id = "receiver_chat_id"
live_Trading.range("A2:Z100").value = None
completed_orders_sheet.range("A2:Z100").value = None
while True:
current_time = datetime.datetime.now().time()
if current_time < datetime.time(9, 15):
print(f"Waiting for market to open: {current_time}")
time.sleep(1)
continue
if current_time > datetime.time(15, 15):
tsl.cancel_all_orders()
print(f"Market over. Closing all trades at {current_time}.")
break
all_ltp = tsl.get_ltp_data(names=watchlist)
for name in watchlist:
try:
orderbook_df = pd.DataFrame(orderbook).T
live_Trading.range('A1').value = orderbook_df
completed_orders_df = pd.DataFrame(completed_orders)
completed_orders_sheet.range('A1').value = completed_orders_df
current_time = datetime.datetime.now()
print(f"Scanning {name} at {current_time}")
chart = tsl.get_historical_data(tradingsymbol=name, exchange='NSE', timeframe="5")
chart['ema9'] = ta.ema(chart['close'], length=9)
chart['ema21'] = ta.ema(chart['close'], length=21)
macd = ta.macd(chart['close'], fast=12, slow=26, signal=9)
chart['macd'] = macd['MACD_12_26_9']
chart['macd_signal'] = macd['MACDs_12_26_9']
supertrend = ta.supertrend(high=chart['high'], low=chart['low'], close=chart['close'], period=10, multiplier=3.0)
chart['supertrend'] = supertrend['SUPERT_10_3.0']
chart['supertrend_direction'] = supertrend['SUPERTd_10_3.0']
chart['atr'] = talib.ATR(chart['high'], chart['low'], chart['close'], timeperiod=14)
cc = chart.iloc[-2]
bc1 = cc['macd'] > cc['macd_signal']
bc2 = cc['close'] > cc['supertrend']
bc3 = cc['ema9'] > cc['ema21']
bc4 = cc['supertrend_direction'] == 1.0
if bc1 and bc2 and bc3 and bc4 and orderbook[name]['traded'] is None:
print(f"Buy signal for {name}")
margin_avialable = tsl.get_balance()
margin_required = cc['close'] / 4.5
if margin_avialable < margin_required:
print(f"Insufficient margin for {name}")
continue
orderbook[name] = single_order.copy()
orderbook[name].update({
'name': name,
'date': str(current_time.date()),
'entry_time': str(current_time.time())[:8],
'max_holding_time': datetime.datetime.now() + datetime.timedelta(hours=2),
'buy_sell': "BUY"
})
sl_points = cc['atr'] * atr_multipler
orderbook[name]['qty'] = int((risk_per_trade * 0.7) / sl_points)
try:
entry_orderid = tsl.order_placement(
tradingsymbol=name, exchange='NSE', quantity=orderbook[name]['qty'],
price=0, trigger_price=0, order_type='MARKET',
transaction_type='BUY', trade_type='MIS')
orderbook[name]['entry_orderid'] = entry_orderid
orderbook[name]['entry_price'] = tsl.get_executed_price(orderid=entry_orderid)
orderbook[name]['sl'] = round(orderbook[name]['entry_price'] - sl_points, 1)
orderbook[name]['tg'] = round(orderbook[name]['entry_price'] + sl_points * risk_reward, 1)
sl_orderid = tsl.order_placement(
tradingsymbol=name, exchange='NSE', quantity=orderbook[name]['qty'],
price=0, trigger_price=orderbook[name]['sl'], order_type='STOPMARKET',
transaction_type='SELL', trade_type='MIS')
orderbook[name]['sl_orderid'] = sl_orderid
orderbook[name]['traded'] = "yes"
message = f"Entry_done {name}\n\n" + "\n".join(
f"{key}: {repr(value)}" for key, value in orderbook[name].items())
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
except Exception as e:
print(f"Error during entry for {name}: {e}")
continue
if orderbook[name]['traded'] == "yes":
try:
ltp = all_ltp[name]
sl_hit = tsl.get_order_status(orderid=orderbook[name]['sl_orderid']) == "TRADED"
tg_hit = ltp > orderbook[name]['tg']
holding_time_exceeded = datetime.datetime.now() > orderbook[name]['max_holding_time']
current_pnl = round((ltp - orderbook[name]['entry_price']) * orderbook[name]['qty'], 1)
def handle_exit(reason):
tsl.cancel_order(OrderID=orderbook[name]['sl_orderid'])
time.sleep(2)
exit_order = tsl.order_placement(
tradingsymbol=name, exchange='NSE', quantity=orderbook[name]['qty'],
price=0, trigger_price=0, order_type='MARKET',
transaction_type='SELL', trade_type='MIS')
orderbook[name]['exit_time'] = str(current_time.time())[:8]
orderbook[name]['exit_price'] = tsl.get_executed_price(orderid=exit_order)
orderbook[name]['pnl'] = round((orderbook[name]['exit_price'] - orderbook[name]['entry_price']) * orderbook[name]['qty'], 1)
orderbook[name]['remark'] = reason
tsl.send_telegram_alert(
message=f"{reason} {name}\n\n" + "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items()),
receiver_chat_id=receiver_chat_id, bot_token=bot_token)
if reentry == "yes":
completed_orders.append(orderbook[name])
orderbook[name] = single_order.copy()
winsound.Beep(1500, 10000)
if sl_hit:
orderbook[name]['exit_price'] = tsl.get_executed_price(orderid=orderbook[name]['sl_orderid'])
orderbook[name]['exit_time'] = str(current_time.time())[:8]
orderbook[name]['pnl'] = round((orderbook[name]['exit_price'] - orderbook[name]['entry_price']) * orderbook[name]['qty'], 1)
orderbook[name]['remark'] = "Bought_SL_hit"
tsl.send_telegram_alert(
message=f"SL_HIT {name}\n\n" + "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items()),
receiver_chat_id=receiver_chat_id, bot_token=bot_token)
if reentry == "yes":
completed_orders.append(orderbook[name])
orderbook[name] = single_order.copy()
elif tg_hit:
handle_exit("Bought_TG_hit")
elif holding_time_exceeded and current_pnl < 0:
handle_exit("holding_time_exceeded_and_I_am_still_facing_loss")
except Exception as e:
print(f"Error during exit check for {name}: {e}")
continue
except Exception as e:
print(f"General error in scanning loop for {name}: {e}")
continue