Pure price action trading algo required with out using any price lagging indicators

any one had ever did Pure price action trading algo required with out using any price lagging indicators, please give that code to learn

Read here.

For the starter I will suggest find a popular strategy from trading view and using claude convert pine script into a algo trading.

Hi @munibabu_BODAGALA

This is a reference code that contains price action and indicator conditions as well.

from Dhan_Tradehull import Tradehull
from rich import print
import talib
import pandas as pd
import datetime
import time
import xlwings as xw
import pretty_errors
import tradehull_backtesting as tb
import os
print()

book                  = xw.Book('Algo1.xlsx')
orderbook_sheet       = book.sheets['Live Orderbook']
completed_sheet       = book.sheets['Completed_Orderbook']
config_sheet          = book.sheets['Strategy Config']
client_code           = str(int(config_sheet.range('B1').value))
access_token          = config_sheet.range('B2').value.replace(" ", "")
tsl                   = Tradehull(client_code, access_token)
watchlist             = [name for name in config_sheet.range('D2:D1000').value if name is not None]
status                = {'traded':None, 'options_name':None}
re_entry              = True
max_orders            = int(config_sheet.range('B10').value)
orderbook             = {name:status.copy() for name in watchlist}
complted_orderbook    = []
EXIT_TIME             = datetime.time(15, 35, 59)
ENTRY_TIME            = datetime.time(9, 35, 40)
opening_balance       = 100000#tsl.get_balance()
max_loss_pct          = config_sheet.range('B9').value
max_loss              = opening_balance * max_loss_pct * -1


orderbook_sheet.range('A1:Z100').value = None
completed_sheet.range('A1:Z100').value = None


# Pre calculate data
sr_data = {}
for name in watchlist:
	print(f"Calculating data for support and resistance for {name}")
	daily         = tsl.get_historical_data(tradingsymbol=name, exchange='NSE', timeframe="DAY")
	sr            = tb.get_support_and_resistance(daily.iloc[-2])
	sr_data[name] = sr
	time.sleep(0.35)



while True:


	current_time = datetime.datetime.now().time()

	if current_time < ENTRY_TIME:
		print(f"{current_time}Waiting for the market to open")
		continue

	current_pnl  = tsl.get_live_pnl()
	market_over  = current_time > EXIT_TIME
	panic_exit   = config_sheet.range('B8').value is not None
	max_loss_hit = current_pnl < max_loss


	# Todo : Testing Pedning
	if market_over or panic_exit or max_loss_hit:
		print(f"{current_time} Exiting the Algo")


		order_details = tsl.cancel_all_orders()
		dhan_orderbook = tsl.get_orderbook()
		logs           = pd.DataFrame(orderbook).T
		positionbook   = tsl.get_positions()

		path = f"Logs/{str(datetime.datetime.now().date())}"
		os.makedirs(f"{path}", exist_ok=True)

		dhan_orderbook.to_csv(f"{path}/dhan_orderbook.csv")
		logs.to_csv(f"{path}/logs.csv")
		positionbook.to_csv(f"{path}/positionbook.csv")

		break






	for name in watchlist:        

		print(f"Scanning {name}")
		odf                               = pd.DataFrame(orderbook).T
		orderbook_sheet.range('A1').value = odf
		completed_sheet.range('A1').value = pd.DataFrame(complted_orderbook)
		current_dt                        = datetime.datetime.now()

		chart        = tsl.get_historical_data(tradingsymbol=name, exchange='NSE', timeframe="5") # in get_start_date.. use timedelta for 15 days only
		chart        = chart.set_index('timestamp')
		chart['rsi'] = talib.RSI(chart['close'], timeperiod=14)
		chart        = tb.supertrend(df=chart, atr_period=15, atr_multiplier=3)

		comp_candle  = pd.Series(datetime.datetime.now()).dt.floor('5min')[0] - datetime.timedelta(minutes=5)
		comp_candle  = comp_candle.strftime("%Y-%m-%d %H:%M:%S+05:30")
		comp_candle  = chart.loc[comp_candle]

		# comp_candle  = chart.iloc[-1]
		sr           = sr_data[name]


		
		bc1 = True#comp_candle['rsi'] > 60
		bc2 = comp_candle['STX_15_3'] == 'up'
		bc3 = orderbook[name]['traded'] is None
		bc4 = comp_candle['close'] > sr['r1']
		bc5 = (len(complted_orderbook) +  odf[odf["traded"].notna()].shape[0]) < max_orders

		sc1 = True#comp_candle['rsi'] < 40
		sc2 = comp_candle['STX_15_3'] == 'down'
		sc3 = orderbook[name]['traded'] is None
		sc4 = comp_candle['close'] < sr['s1']
		sc5 = (len(complted_orderbook) +  odf[odf["traded"].notna()].shape[0]) < max_orders




		# logger.info(f"{name} {bc1} {bc2} {bc3} {bc4} {bc5} {sc1} {sc2} {sc3} {sc4} {sc5}")
		# logger.info(f"{comp_candle}")


		if bc1 and bc2 and bc3 and bc4 and bc5:

			print(f"{name}  Uptrend")
			ce_name, pe_name, strike = tsl.ATM_Strike_Selection(Underlying=name, Expiry=0)
			lot_size                 = tsl.get_lot_size(ce_name)


			try:
				orderbook[name]['qty']               = lot_size*6
				entry_orderid                        = tsl.order_placement(tradingsymbol=ce_name, exchange='NFO', quantity=lot_size, price=0, trigger_price=0,order_type='MARKET', transaction_type='BUY', trade_type='MIS')
				orderbook[name]['entry_price']       = tsl.get_ltp_data(names=[ce_name])[ce_name] # tsl.get_executed_price(orderid=orderid)
			except Exception as e:
				print(f"Error placing entry order: {e}")
				continue
			
			
			try:
				trigger_price                  = round(orderbook[name]['entry_price']*0.7, 1)
				price                          = max(trigger_price - 0.5, 0.1)
				sl_orderid                     = tsl.order_placement(tradingsymbol=ce_name, exchange='NFO', quantity=lot_size, price=price, trigger_price=trigger_price,order_type='STOPLIMIT', transaction_type='SELL', trade_type='MIS')
			except Exception as e:
				print(f"Error placing SL order: {e}")
				cancel_entry_order             = tsl.cancel_order(OrderID=entry_orderid)
				orderbook[name]                = {'traded':"TRADE_NOT_POSSIBLE", 'options_name':None}
				continue





			orderbook[name]['options_name']      = ce_name
			orderbook[name]['date']              = str(current_dt.date())
			orderbook[name]['entry_time']        = str(current_dt.time())
			orderbook[name]['sl_price']          = trigger_price
			orderbook[name]['tg_price']          = round(orderbook[name]['entry_price']*1.3, 1)
			orderbook[name]['buy_sell']          = 'BUY_CE'
			orderbook[name]['traded']            = True
			orderbook[name]['entry_orderid']     = entry_orderid
			orderbook[name]['sl_orderid']         = sl_orderid
			orderbook[name]['entry_datetime']    = current_dt
			orderbook[name]['breaked_even']      = False



		if sc1 and sc2 and sc3 and sc4 and sc5:

			print(f"{name}  Downtrend")
			ce_name, pe_name, strike = tsl.ATM_Strike_Selection(Underlying=name, Expiry=0)
			lot_size                 = tsl.get_lot_size(pe_name)


			try:
				orderbook[name]['qty']               = lot_size*6
				orderid                              = tsl.order_placement(tradingsymbol=pe_name, exchange='NFO', quantity=lot_size, price=0, trigger_price=0,order_type='MARKET', transaction_type='BUY', trade_type='MIS')
				orderbook[name]['entry_price']       = tsl.get_ltp_data(names=[pe_name])[pe_name] # tsl.get_executed_price(orderid=orderid)
			except Exception as e:
				print(f"Error placing entry order: {e}")
				continue

			try:
				trigger_price            = round(orderbook[name]['entry_price']*0.7, 1)
				price                    = max(trigger_price - 0.5, 0.1)
				sl_orderid               = tsl.order_placement(tradingsymbol=pe_name, exchange='NFO', quantity=lot_size, price=price, trigger_price=trigger_price,order_type='STOPLIMIT', transaction_type='SELL', trade_type='MIS')
			except Exception as e:
				print(f"Error placing SL order: {e}")
				cancel_entry_order             = tsl.cancel_order(OrderID=entry_orderid)
				orderbook[name]                = {'traded':"TRADE_NOT_POSSIBLE", 'options_name':None}
				continue



			orderbook[name]['options_name']      = pe_name
			orderbook[name]['date']              = str(current_dt.date())
			orderbook[name]['entry_time']        = str(current_dt.time())
			orderbook[name]['sl_price']          = trigger_price
			orderbook[name]['tg_price']          = round(orderbook[name]['entry_price']*1.3, 1)
			orderbook[name]['buy_sell']          = 'BUY_PE'
			orderbook[name]['traded']            = True
			orderbook[name]['entry_orderid']     = orderid
			orderbook[name]['sl_orderid']         = sl_orderid
			orderbook[name]['entry_datetime']    = current_dt
			orderbook[name]['breaked_even']      = False




		if orderbook[name]['traded']:

			buy_call = orderbook[name]['buy_sell'] == 'BUY_CE'
			buy_put  = orderbook[name]['buy_sell'] == 'BUY_PE'

			if buy_call or buy_put:

				options_name    = orderbook[name]['options_name']

				options_ltp      = tsl.get_ltp_data(names=[options_name])[options_name]
				time_exit        = datetime.datetime.now() >  orderbook[name]['entry_datetime'] + datetime.timedelta(minutes=30)
				sl_hit           = options_ltp <  orderbook[name]['sl_price']
				tg_hit           = options_ltp >  orderbook[name]['tg_price']


				if buy_call:
					trailing_exit   = comp_candle['STX_15_3'] == 'down'
				if buy_put:
					trailing_exit   = comp_candle['STX_15_3'] == 'up'


				orderbook[name]['pnl']         = round((options_ltp - orderbook[name]['entry_price']) * orderbook[name]['qty'], 2)



				# Trailing Start 
				if orderbook[name]['breaked_even'] == False:
					if orderbook[name]['pnl'] > 2000:
						trigger_price     = round(orderbook[name]['entry_price'],1)
						price             = max(trigger_price - 0.5, 0.1)
						orderbook[name]['sl_price']          = trigger_price
						modified_order_id                    = tsl.modify_order(order_id=orderbook[name]['sl_orderid'],order_type="STOPLIMIT",quantity=50,price=price,trigger_price=trigger_price)
						orderbook[name]['breaked_even']      = True
						orderbook[name]['next_trailing_pnl'] = 2000 + 500


				if orderbook[name]['breaked_even']:
					if orderbook[name]['pnl'] > orderbook[name]['next_trailing_pnl']:
						
						trigger_price     = round(orderbook[name]['entry_price'] + (500/orderbook[name]['qty']),1)
						price             = max(trigger_price - 0.5, 0.1)
						orderbook[name]['sl_price']          = trigger_price

						try:
							modified_order_id = tsl.modify_order(order_id=orderbook[name]['sl_orderid'],order_type="STOPLIMIT",quantity=50,price=price,trigger_price=trigger_price)
						except Exception as e:
							print(f"Error modifying order: {e}")
							cancel_sl_order   = tsl.cancel_order(OrderID=orderbook[name]['sl_orderid'])
							sl_orderid        = tsl.order_placement(tradingsymbol=orderbook[name]['options_name'], exchange='NFO', quantity=orderbook[name]['qty'], price=price, trigger_price=trigger_price,order_type='STOPLIMIT', transaction_type='SELL', trade_type='MIS')
							orderbook[name]['sl_orderid'] = sl_orderid
							orderbook[name]['next_trailing_pnl'] = orderbook[name]['next_trailing_pnl'] + 500

				# Trailing End



				if trailing_exit or sl_hit:
					orderbook[name]['remark']                          = "trailing_exit" if trailing_exit else "sl_hit"
					orderbook[name]['exit_orderid'] = orderbook[name]['sl_orderid']


				if time_exit or tg_hit:
					orderbook[name]['remark']                          = "time_exit" if time_exit else "tg_hit"
					cancel_sl_order                 = tsl.cancel_order(OrderID=orderbook[name]['sl_orderid'])
					orderbook[name]['exit_orderid'] = tsl.order_placement(tradingsymbol=orderbook[name]['options_name'], exchange='NFO', quantity=orderbook[name]['qty'], price=0, trigger_price=0,order_type='MARKET', transaction_type='SELL', trade_type='MIS')


				if trailing_exit or sl_hit or time_exit or tg_hit:

					orderbook[name]['exit_price']  = tsl.get_ltp_data(names=[options_name])[options_name] # tsl.get_executed_price(orderid=orderbook[name]['exit_orderid'])
					orderbook[name]['exit_time']   = str(current_dt.time())
					orderbook[name]['pnl']         = round((orderbook[name]['exit_price'] - orderbook[name]['entry_price']) * orderbook[name]['qty'], 2)

					if re_entry:
						complted_orderbook.append(orderbook[name])						
						orderbook[name] = status.copy()