HII @Tradehull_Imran Sir Please Help me to solve this problem Why ‘traded’ is showing hear is the problem image and code also
import time
import datetime
from Dhan_Tradehull import Tradehull
import talib
import winsound
import openpyxl
from openpyxl.styles import Font, Alignment
# ------------------------------ DHAN API LOGIN SETUP ------------------------------
client_code = ""
token_id = ""
tsl = Tradehull(client_code, token_id)
watchlist = ['ICICIBANK']
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 = {}
reentry = "yes" # "yes/no"
completed_orders = []
# Calculate current loss
my_loss = 0
max_loss = -150
# Maximum allowed open positions
max_open_positions = 2
# ---------------------------- TELEGRAM ALERT FUNCTION ------------------------------
bot_token = ""
receiver_chat_id = ""
# ---------------------------- FUNCTION TO GET LIVE DATA ------------------------------
for name in watchlist:
orderbook[name] = single_order.copy()
# ------------------------------ SOUND FUNCTION ------------------------------
def play_sound():
winsound.Beep(9500, 500)
#----------------------------------- EXCEL DATA --------------------------------------
def create_and_write_to_excel(file_name, sheet_name, data):
"""
Creates an Excel file and writes data to it.
Args:
file_name (str): The name of the Excel file (e.g., 'output.xlsx').
sheet_name (str): The name of the sheet in the Excel file.
data (list of dict): List of dictionaries where keys are column headers and values are row data.
"""
# Check if the data is empty
if not data:
print(f"No data to write for sheet '{sheet_name}'. Skipping Excel file creation.")
return
# Create a new workbook
wb = openpyxl.Workbook()
sheet = wb.active
sheet.title = sheet_name
# Add headers
headers = list(data[0].keys())
for col_num, header in enumerate(headers, 1):
cell = sheet.cell(row=1, column=col_num, value=header)
cell.font = Font(bold=True)
cell.alignment = Alignment(horizontal='center', vertical='center')
# Add rows
for row_num, row_data in enumerate(data, start=2):
for col_num, header in enumerate(headers, start=1):
sheet.cell(row=row_num, column=col_num, value=row_data[header])
# Adjust column widths
for col_num, header in enumerate(headers, start=1):
column_width = max(len(header), 15) # Minimum column width
sheet.column_dimensions[openpyxl.utils.get_column_letter(col_num)].width = column_width
# Save the file
wb.save(file_name)
print(f"Excel file '{file_name}' created and data written successfully.")
# Initialize orderbook for each stock in the watchlist
for name in watchlist:
orderbook[name] = {
'single_order': single_order.copy(),
'completed_orders': [] # Initialize as an empty list
}
# Process completed orders for each stock
for name in orderbook:
completed_orders = orderbook[name]['completed_orders']
if completed_orders: # Only process non-empty lists
create_and_write_to_excel(file_name='trade_log.xlsx', sheet_name='TradeLog', data=completed_orders)
else:
print(f"No completed orders for {name}. Skipping Excel creation.")
# ------------------------------- QTY FUNCTION ------------------------------
def calculate_trade_quantity(balance, risk_per_trade, stock_price):
risk_amount = balance * risk_per_trade
quantity = risk_amount // stock_price
return max(5, int(quantity))
# ------------------------------ MAIN ALGO ------------------------------
while True:
live_pnl = tsl.get_live_pnl()
current_time = datetime.datetime.now().time()
if current_time < datetime.time(9, 30):
print(f"Wait for market to start Chetan", {str(current_time.time())[:8]})
time.sleep(1)
continue
if current_time > datetime.time(14, 45):
order_details = tsl.cancel_all_orders()
print(f"Market over Chetan. Closing all trades! Logging data to Excel. {str(current_time.time())[:8]}")
create_and_write_to_excel("trades.xlsx", "Trade Log", completed_orders)
break
if my_loss <= int(max_loss) and tsl.cancel_all_orders == "yes" and tsl.kill_switch == 'ON':
print("Max loss reached! Cancelling all orders and stopping trading.")
tsl.cancel_all_orders()
break
print("\n started while Loop \n")
all_ltp = tsl.get_ltp_data(names=watchlist)
for name in watchlist:
current_time = datetime.datetime.now()
print(f"Scanning {name} {str(current_time.time())[:8]}")
try:
chart_1 = tsl.get_historical_data(tradingsymbol=name.upper(),exchange='NSE',timeframe='5')
chart_1['upperband'], chart_1['middleband'], chart_1['lowerband'] = talib.BBANDS(chart_1['close'], timeperiod=20, nbdevup=1.5, nbdevdn=1.5, matype=0)
# Define index for the latest candle
index = len(chart_1) - 1 # Last index in the DataFrame
# Reference the latest two candles (previous and current)
alert_candle = chart_1.iloc[index - 1] # Second last candle (previous candle)
letest_candle = chart_1.iloc[index] # Last candle (current candle)
# BUY ENTRY CONDITION
bc1 = alert_candle['close'] < alert_candle['lowerband']
bc6 = orderbook[name]['traded'] is None
# SELL ENTRY CONDITION
sc1 = alert_candle['close'] > alert_candle['upperband']
sc6 = orderbook[name]['traded'] is None
except Exception as e:
print(e)
continue
if bc1 and bc6:
print("buy ", name, "\t")
margin_available = tsl.get_balance()
margin_required = alert_candle['close'] / 5.0 # LEVERAGE AMOUNT
if margin_available < margin_required:
print(f"Less margin, not taking order: margin_available is {margin_available} and margin_required is {margin_required} for {name}")
continue
# Calculating the quantity to trade
stock_price = alert_candle['close'] # Use the close price of the alert candle as the stock price
risk_per_trade = 0.04 # Risk 4%
trade_quantity = calculate_trade_quantity(balance=margin_available, risk_per_trade=risk_per_trade, stock_price=stock_price)
orderbook[name]['name'] = name
orderbook[name]['date'] = str(current_time.date())
orderbook[name]['entry_time'] = str(current_time.time())[:8]
orderbook[name]['buy_sell'] = "BUY"
orderbook[name]['qty'] = trade_quantity
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=orderbook[name]['entry_orderid'])
# Stop-loss and target calculations
stop_loss_amount = alert_candle['high'] - alert_candle['low']
stop_loss_price = orderbook[name]['entry_price'] - stop_loss_amount
target_profit_price = orderbook[name]['entry_price'] + (4 * stop_loss_amount)
orderbook[name]['sl'] = round(stop_loss_price, 2)
orderbook[name]['tg'] = round(target_profit_price, 2)
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 = "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items())
message = f"Entry_done {name} \n\n {message}"
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
max_open_positions += 1
except Exception as e:
print(e)
if orderbook[name]['traded'] == "yes":
bought = orderbook[name]['buy_sell'] == "BUY"
if bought:
try:
ltp = all_ltp[name]
sl_hit = tsl.get_order_status(orderid=orderbook[name]['sl_orderid']) == "TRADED"
tg_hit = ltp > orderbook[name]['tg']
except Exception as e:
print(e)
if sl_hit:
try:
orderbook[name]['exit_time'] = str(current_time.time())[:8]
orderbook[name]['exit_price'] = tsl.get_executed_price(orderid=orderbook[name]['sl_orderid'])
orderbook[name]['pnl'] = round((orderbook[name]['exit_price'] - orderbook[name]['entry_price']) * orderbook[name]['qty'], 1)
orderbook[name]['remark'] = "Bought_SL_hit"
# TELEGRAM MESSAGE
message = "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items())
message = f"SL_HIT {name} \n\n {message}"
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
if reentry == "yes":
completed_orders.append(orderbook[name])
orderbook[name] = single_order.copy()
except Exception as e:
print(e)
if tg_hit:
try:
tsl.cancel_order(OrderID=orderbook[name]['sl_orderid'])
time.sleep(2)
square_off_buy_order = tsl.order_placement(
tradingsymbol=orderbook[name]['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=square_off_buy_order)
orderbook[name]['pnl'] = (orderbook[name]['exit_price'] - orderbook[name]['entry_price']) * orderbook[name]['qty']
orderbook[name]['remark'] = "Bought_TG_hit"
# TELEGRAM MESSAGE
message = "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items())
message = f"TG_HIT {name} \n\n {message}"
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
if reentry == "yes":
completed_orders.append(orderbook[name])
orderbook[name] = single_order.copy()
play_sound()
except Exception as e:
print(e)
# SELL ENTRY LOGIC
elif sc1 and sc6:
print("sell ", name, "\t")
margin_available = tsl.get_balance()
margin_required = alert_candle['close'] / 5.0 # LEVERAGE AMOUNT
if margin_available < margin_required:
print(f"Less margin, not taking order: margin_available is {margin_available} and margin_required is {margin_required} for {name}")
continue
# Calculating the quantity to trade
stock_price = alert_candle['close'] # Use the close price of the alert candle as the stock price
risk_per_trade = 0.04 # Risk 4%
trade_quantity = calculate_trade_quantity(balance=margin_available, risk_per_trade=risk_per_trade, stock_price=stock_price)
orderbook[name]['name'] = name
orderbook[name]['date'] = str(current_time.date())
orderbook[name]['entry_time'] = str(current_time.time())[:8]
orderbook[name]['buy_sell'] = "SELL"
orderbook[name]['qty'] = trade_quantity
try:
entry_orderid = 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]['entry_orderid'] = entry_orderid
orderbook[name]['entry_price'] = tsl.get_executed_price(orderid=orderbook[name]['entry_orderid'])
# Stop-loss and target calculations
stop_loss_amount = alert_candle['high'] - alert_candle['low']
stop_loss_price = orderbook[name]['entry_price'] + stop_loss_amount
target_profit_price = orderbook[name]['entry_price'] - (4 * stop_loss_amount)
orderbook[name]['sl'] = round(stop_loss_price, 2)
orderbook[name]['tg'] = round(target_profit_price, 2)
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='BUY',
trade_type='MIS'
)
orderbook[name]['sl_orderid'] = sl_orderid
orderbook[name]['traded'] = "yes"
message = "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items())
message = f"Entry_done {name} \n\n {message}"
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
max_open_positions += 1
except Exception as e:
print(e)
# Exit Logic for Sell Positions
if orderbook[name]['traded'] == "yes":
sold = orderbook[name]['buy_sell'] == "SELL"
if sold:
try:
ltp = all_ltp[name]
sl_hit = tsl.get_order_status(orderid=orderbook[name]['sl_orderid']) == "TRADED"
tg_hit = ltp < orderbook[name]['tg']
except Exception as e:
print(e)
if sl_hit:
try:
orderbook[name]['exit_time'] = str(current_time.time())[:8]
orderbook[name]['exit_price'] = tsl.get_executed_price(orderid=orderbook[name]['sl_orderid'])
orderbook[name]['pnl'] = round((orderbook[name]['entry_price'] - orderbook[name]['exit_price']) * orderbook[name]['qty'], 1)
orderbook[name]['remark'] = "Sold_SL_hit"
message = "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items())
message = f"SL_HIT {name} \n\n {message}"
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
if reentry == "yes":
completed_orders.append(orderbook[name])
orderbook[name] = single_order.copy()
except Exception as e:
print(e)
if tg_hit:
try:
tsl.cancel_order(OrderID=orderbook[name]['sl_orderid'])
time.sleep(2)
square_off_sell_order = tsl.order_placement(
tradingsymbol=orderbook[name]['name'],
exchange='NSE',
quantity=orderbook[name]['qty'],
price=0,
trigger_price=0,
order_type='MARKET',
transaction_type='BUY',
trade_type='MIS'
)
orderbook[name]['exit_time'] = str(current_time.time())[:8]
orderbook[name]['exit_price'] = tsl.get_executed_price(orderid=square_off_sell_order)
orderbook[name]['pnl'] = (orderbook[name]['entry_price'] - orderbook[name]['exit_price']) * orderbook[name]['qty']
orderbook[name]['remark'] = "Sold_TG_hit"
message = "\n".join(f"{key}: {repr(value)}" for key, value in orderbook[name].items())
message = f"TG_HIT {name} \n\n {message}"
tsl.send_telegram_alert(message=message, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
if reentry == "yes":
completed_orders.append(orderbook[name])
orderbook[name] = single_order.copy()
play_sound()
except Exception as e:
print(e)
Also Please @Tradehull_Imran Sir Do Check The Code Is It Completely Correct Or Not