SIR @Tradehull_Imran , JUST CHECK HOW IT IS, ANY FLAWS IF YOU FIND
I HAVE MADE IT FOR SINGLE ORDER MANAGEMENT (STATIC)
ONCE ORDER IS PLACED IF WENT BELOW SL BEFORE EXECUTION IT WILL CANCEL ORDER, IF EXECUTED IT WILL PLACE SL ORDER AND IF TARGET REACHED IT MODIFY TO MARKET FOR BOOKING PROFIT, IF SL ORDER SKIPS IT WILL MODIFY SL-LIMIT TO MARKET FOR SAFETY.
import tkinter as tk
from tkinter import messagebox
import time
import traceback
import threading
from queue import Queue
from Dhan_Tradehull_V2 import Tradehull
import logging
import os
import winsound
# Logging Setup
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', filename='trade_execution.log', filemode='a')
# Client Credentials (ensure these are securely stored and retrieved)
CLIENT_CODE = os.getenv("CLIENT_CODE", "1100578034")
TOKEN_ID = os.getenv("TOKEN_ID",
# Initialize Tradehull
tsl = Tradehull(CLIENT_CODE, TOKEN_ID)
# Telegram Credentials
bot_token = "000000"
receiver_chat_id = "0000000"
# Send login confirmation to Telegram
try:
tsl.send_telegram_alert(message="Login Done Successfully", receiver_chat_id=receiver_chat_id, bot_token=bot_token)
except Exception as e:
logging.error(f"Failed to send Telegram login confirmation: {e}")
# Tkinter Root Window
root = tk.Tk()
root.title("Trading Strategy GUI")
root.geometry("400x400")
# Tkinter Variables
trading_symbol_var = tk.StringVar(value="NIFTY 06 MAR 22200 PUT")
qty_var = tk.IntVar(value=75)
buying_trigger_var = tk.DoubleVar(value=270.35)
stop_loss_offset_var = tk.DoubleVar(value=245.95)
target_offset_var = tk.DoubleVar(value=35.0)
profit_lock_point_var = tk.DoubleVar(value=29.0)
sltrail_var = tk.DoubleVar(value=1.0)
# Log queue for updating UI
log_queue = []
def play_sound(frequency, duration, repeat=1, pause=0.2):
for _ in range(repeat):
winsound.Beep(frequency, duration)
time.sleep(pause)
def log_message(msg):
log_queue.append(msg)
log_text.insert(tk.END, msg + "\n")
log_text.see(tk.END)
try:
tsl.send_telegram_alert(message=msg, receiver_chat_id=receiver_chat_id, bot_token=bot_token)
except Exception as e:
logging.error(f"Failed to send Telegram alert: {e}")
def execute_order():
order_thread = threading.Thread(target=execute_order_thread_function)
order_thread.start()
def execute_order_thread_function():
trading_symbol = trading_symbol_var.get()
qty = qty_var.get()
buying_trigger = buying_trigger_var.get()
stop_loss_offset = stop_loss_offset_var.get()
target_offset = target_offset_var.get()
profit_lock_point = profit_lock_point_var.get()
try:
log_message(f"Placing buy order for {trading_symbol}...")
buy_entry_orderid = tsl.order_placement(trading_symbol, "NFO", qty, buying_trigger + 0.50, buying_trigger, "STOPLIMIT", 'BUY', 'MIS')
log_message(f"Buy Order Placed. Order ID: {buy_entry_orderid}")
message = (f"Buy Order Placed. Order ID: {buy_entry_orderid}")
time.sleep(0.2)
while True:
order_status = tsl.get_order_status(orderid=buy_entry_orderid)
log_message(f"Order Status: {order_status}")
time.sleep(1)
if order_status == "PENDING":
current_market_price_dict = tsl.get_ltp_data(names=[trading_symbol])
current_market_price = current_market_price_dict[trading_symbol]
if current_market_price <= stop_loss_offset:
log_message(f"Market price {current_market_price} is below stop-loss offset. Canceling order.")
tsl.Dhan.cancel_order(buy_entry_orderid)
break
elif order_status == "TRADED":
manage_trade_logic(trading_symbol, qty, buying_trigger, target_offset, stop_loss_offset, profit_lock_point)
break
except Exception as e:
log_message(f"Error during order execution: {traceback.format_exc()}")
def manage_trade_logic(stoploss_orderid, trading_symbol, qty, buy_price, target_offset, stop_loss_offset, profit_lock_point):
try:
target_price = buy_price + target_offset
stop_loss_price = buy_price - stop_loss_offset
sl_limit_price = stop_loss_price - 1
stoploss_orderid = tsl.order_placement(trading_symbol, "NFO", qty, sl_limit_price, stop_loss_price, 'STOPLIMIT', 'SELL', 'MIS')
log_message(f"Initial Stop Loss Order Placed. Order ID: {stoploss_orderid}")
play_sound(3468, 300, 2, 0.1)
time.sleep(0.2)
profit_locked = False
last_sl_price = stop_loss_price
last_trail_price = buy_price + profit_lock_point
while True:
current_market_price_dict = tsl.get_ltp_data(names=[trading_symbol])
current_market_price = current_market_price_dict[trading_symbol]
if current_market_price >= target_price:
tsl.modify_order(order_id=stoploss_orderid, order_type="MARKET", quantity=qty, price=0, trigger_price=0)
log_message(f"Target reached. Selling at market price.")
play_sound(3468, 300, 3, 0.1)
break
if current_market_price < sl_limit_price:
tsl.modify_order(order_id=stoploss_orderid, order_type="MARKET", quantity=qty, price=0, trigger_price=0)
log_message("Stop-loss limit skipped, modifying to market order.")
break
if not profit_locked and current_market_price >= (buy_price + profit_lock_point):
profit_locked = True
last_sl_price = buy_price + profit_lock_point
tsl.modify_order(order_id=stoploss_orderid, order_type="STOPLIMIT", quantity=qty, price=last_sl_price - 1, trigger_price=last_sl_price)
log_message(f"Profit locked. Stop Loss set to ₹{last_sl_price}.")
play_sound(3468, 300, 5, 0.1)
elif profit_locked and current_market_price >= last_trail_price + sltrail_var.get():
last_trail_price += sltrail_var.get()
last_sl_price = last_trail_price
tsl.modify_order(order_id=stoploss_orderid, order_type="STOPLIMIT", quantity=qty, price=last_sl_price - 1, trigger_price=last_sl_price)
log_message(f"Trailing Stop Loss updated to ₹{last_sl_price}.")
play_sound(3468, 300, 1, 0.1)
time.sleep(0.2)
except Exception as e:
log_message(f"Error in trade management: {traceback.format_exc()}")
# GUI Layout
tk.Label(root, text="Trading Symbol:").grid(row=0, column=0, padx=5, pady=5, sticky="e")
tk.Entry(root, textvariable=trading_symbol_var, width=25).grid(row=0, column=1, padx=5, pady=5)
tk.Label(root, text="Quantity:").grid(row=1, column=0, padx=5, pady=5, sticky="e")
qty_dropdown = tk.OptionMenu(root, qty_var, *[75, 150, 225, 300, 375, 450, 525, 600, 675, 750, 825, 900])
qty_dropdown.grid(row=1, column=1, padx=5, pady=5)
tk.Label(root, text="Buying Trigger Price:").grid(row=2, column=0, padx=5, pady=5, sticky="e")
tk.Entry(root, textvariable=buying_trigger_var, width=25).grid(row=2, column=1, padx=5, pady=5)
tk.Label(root, text="Stop Loss Offset:").grid(row=3, column=0, padx=5, pady=5, sticky="e")
tk.Entry(root, textvariable=stop_loss_offset_var, width=25).grid(row=3, column=1, padx=5, pady=5)
tk.Label(root, text="Target Offset:").grid(row=4, column=0, padx=5, pady=5, sticky="e")
tk.Entry(root, textvariable=target_offset_var, width=25).grid(row=4, column=1, padx=5, pady=5)
tk.Label(root, text="Profit Lock At:").grid(row=5, column=0, padx=5, pady=5, sticky="e")
tk.Entry(root, textvariable=profit_lock_point_var, width=25).grid(row=5, column=1, padx=5, pady=5)
tk.Label(root, text="SL Trail Step:").grid(row=6, column=0, padx=5, pady=5, sticky="e")
tk.Entry(root, textvariable=sltrail_var, width=25).grid(row=6, column=1, padx=5, pady=5)
tk.Button(root, text="Login", command=lambda: threading.Thread(target=lambda: log_message("Login Triggered")).start()).grid(row=7, column=0, padx=5, pady=5)
tk.Button(root, text="Execute Order", command=execute_order).grid(row=7, column=1, padx=5, pady=5)
# Log Display
log_text = tk.Text(root, height=10, width=50)
log_text.grid(row=8, column=0, columnspan=2, padx=5, pady=5)
# Run the Tkinter Main Loop
root.mainloop()