AUTOMATIC GRID BOT STRATEGY [ilovealgotrading]
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © lovealgotrading

// First of all I want to say thank you to © thequantscience. 

//@version=5
strategy(
     title = 'AUTOMATIC GRID BOT STRATEGY [lovealgotrading]', 
     overlay = true,
     commission_type = strategy.commission.percent, 
     commission_value = 0.075, 
     pyramiding = 20,
     default_qty_type = strategy.percent_of_equity,
     close_entries_rule = 'ANY',
     initial_capital = 1000
     )


/////////////////////////////// ALGORITHM BACKTEST SOURCE CODE ////////////////////////////////////
startDate  = input.time(defval=timestamp('1 nov 2022 13:30 +0000'), title='Start_Date', group = " ############# ⏰ BACKTEST DATE ⏰ ############ " )
endDate = input.time(defval=timestamp('20 oct  2030 13:30 +0000'), title='End_Date', group = " ############# ⏰ BACKTEST DATE ⏰ ############ " )

inDateRange  = time > startDate  and time < endDate


high_price = input.price(
      defval = 0.00, 
      title = 'Range High price: ',
      group = " ############## ➡️ HIGH GRID PRICE  ⬅️ ############ ", 
      confirm = true,
      tooltip = "Top grid price."
      )

low_price = input.price(
      defval = 0.00, 
      title = 'Range Low price: ',
      group = " ############## ➡️ LOW GRID PRICE  ⬅️ ############# ", 
      confirm = true,
      tooltip = "Bottom grid price."
      )


// ###########################################################################################

trade_direction = input.string(title='Trade Direction', group = " ##############🎯 TRADE DIRECTION 🎯############# ", options=['LONG', 'SHORT', 'BOTH'], defval='BOTH')

// ###########################################################################################

use_stop = input.bool(defval = false , title = "Use StopLoss", group = " ############# ⛔️ Strategy STOP Settings ⛔️ ############ ")

close_bot_after_stop = input.bool(defval = false , title = "Close Bot After Stop Loss",tooltip = "Dont open new positions after stop loss", group = " ############# ⛔️ Strategy STOP Settings ⛔️ ############ ")

stop_close_all = ""

if stop_close_all[1] != "" and close_bot_after_stop
    stop_close_all := "DONT"

use_stop_default = input.bool(defval = true , title = "Use StopLoss Where HIGH and LOW GRID PRICE", group = " ############# ⛔️ Strategy STOP Settings ⛔️ ############ ")


high_price_stop = input.price(
      defval = 99999, 
      title = 'High STOP Price: ',
      group =  " ############# ⛔️ Strategy STOP Settings ⛔️ ############ ", 
      confirm = false,
      tooltip = "Top STOP price."
      )

low_price_stop = input.price(
      defval = 0.00, 
      title = 'Low STOP Price: ',
      group =  " ############# ⛔️ Strategy STOP Settings ⛔️ ############ ", 
      confirm = false,
      tooltip = "Bottom STOP price."
      )

if use_stop_default 
    high_price_stop := high_price
    low_price_stop := low_price

// ###########################################################################################

dolar = input.int(defval = 100, title = "$ Per Position", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")

// ###########################################################################################


Long_message = input("", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")
Long_Exit_message = input("", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")
Long_Stop_message = input("", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")


Short_message = input("", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")
Short_Exit_message = input("", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")
Short_Stop_message = input("", group = " ############# 🤖 ALGO TRADE ALERTS 🤖 ############ ")


// ###########################################################################################


float qty_new = dolar / close 


if close > 5000 
    qty_new :=  math.round(dolar / close, 3)
else if close < 5000 and close > 200
    qty_new :=  math.round(dolar / close, 2)
else if close < 200 and close > 50
    qty_new :=  math.round(dolar / close, 1)
else if close < 50
    qty_new :=  math.round(dolar / close, 0)

// ###########################################################################################

ten_grid = input.bool(
     defval = false,
     title = "10 grid levels",
     group = " ############ GRID CONFIGURATION ############ ",
     tooltip = "10 grid levels",
     confirm = true
     )

tewnty_grid = input.bool(
     defval = true,
     title = "20 grid levels",
     group = " ############ GRID CONFIGURATION ############ ",
     tooltip = "20 grid levels",
     confirm = true
     )


// ###########################################################################################

show_stop_res = input.bool(true, title = "Show Stop Price",group = " ############# 📈 Graphics Settings 📈 ########### ")
show_grid_level_bg = input.bool(true, title = "Show Grid Levels BG",group = " ############# 📈 Graphics Settings 📈 ########### ")

// ###########################################################################################


grid_range = high_price - low_price

percent_change = ((high_price - low_price) / low_price) * (1.00 / 9.00)


var float grid_1 = 0
var float grid_2 = 0
var float grid_3 = 0
var float grid_4 = 0
var float grid_5 = 0
var float grid_6 = 0
var float grid_7 = 0
var float grid_8 = 0
var float grid_9 = 0
var float grid_10 = 0
var float grid_11 = 0
var float grid_12 = 0
var float grid_13 = 0
var float grid_14 = 0
var float grid_15 = 0
var float grid_16 = 0
var float grid_17 = 0
var float grid_18 = 0
var float grid_19 = 0
var float grid_20 = 0

var float factor = 0 

long_1 = false
long_2 = false
long_3 = false
long_4 = false
long_5 = false
long_6 = false
long_7 = false
long_8 = false
long_9 = false
long_10 = false

short_1 = false
short_2 = false
short_3 = false
short_4 = false
short_5 = false
short_6 = false
short_7 = false
short_8 = false
short_9 = false
short_10 = false


if ten_grid == true

    percent_change := ((high_price - low_price) / low_price) * (1.00 / 9.00)

    factor := grid_range / 9

    grid_1 := (high_price) 
    grid_2 := (high_price - (factor * 1)) 
    grid_3 := (high_price - (factor * 2)) 
    grid_4 := (high_price - (factor * 3)) 
    grid_5 := (high_price - (factor * 4)) 
    grid_6 := (high_price - (factor * 5)) 
    grid_7 := (high_price - (factor * 6)) 
    grid_8 := (high_price - (factor * 7)) 
    grid_9 := (high_price - (factor * 8))
    grid_10 := (low_price)

    long_1 := ta.crossunder(close, ((grid_5+grid_6)/2)) 
    long_2 := ta.crossunder(close, ((grid_6+grid_7)/2)) 
    long_3 := ta.crossunder(close, ((grid_7+grid_8)/2)) 
    long_4 := ta.crossunder(close, ((grid_8+grid_9)/2)) 
    long_5 := ta.crossunder(close, ((grid_9+grid_10)/2)) 

    short_1 := ta.crossover(close, ((grid_6+grid_5)/2))
    short_2 := ta.crossover(close, ((grid_5+grid_4)/2))
    short_3 := ta.crossover(close, ((grid_4+grid_3)/2))
    short_4 := ta.crossover(close, ((grid_3+grid_2)/2))
    short_5 := ta.crossover(close, ((grid_2+grid_1)/2))


if tewnty_grid == true

    percent_change := ((high_price - low_price) / low_price) * (1.00 / 19.00)

    factor := grid_range / 19

    grid_1 := (high_price) 
    grid_2 := (high_price - (factor * 1)) 
    grid_3 := (high_price - (factor * 2)) 
    grid_4 := (high_price - (factor * 3)) 
    grid_5 := (high_price - (factor * 4)) 
    grid_6 := (high_price - (factor * 5)) 
    grid_7 := (high_price - (factor * 6)) 
    grid_8 := (high_price - (factor * 7)) 
    grid_9 := (high_price - (factor * 8)) 
    grid_10 := (high_price - (factor * 9)) 
    grid_11 := (high_price - (factor * 10)) 
    grid_12 := (high_price - (factor * 11)) 
    grid_13 := (high_price - (factor * 12)) 
    grid_14 := (high_price - (factor * 13)) 
    grid_15 := (high_price - (factor * 14)) 
    grid_16 := (high_price - (factor * 15)) 
    grid_17 := (high_price - (factor * 16)) 
    grid_18 := (high_price - (factor * 17)) 
    grid_19 := (high_price - (factor * 18))
    grid_20 := (low_price)

    long_1 := close < ((grid_10+grid_11)/2)
    long_2 := close < ((grid_11+grid_12)/2)
    long_3 := close < ((grid_12+grid_13)/2)
    long_4 := close < ((grid_13+grid_14)/2)
    long_5 := close < ((grid_14+grid_15)/2) 
    long_6 := close < ((grid_15+grid_16)/2) 
    long_7 := close < ((grid_16+grid_17)/2) 
    long_8 := close < ((grid_17+grid_18)/2) 
    long_9 := close < ((grid_18+grid_19)/2) 
    long_10 := close < ((grid_19+grid_20)/2) 

    short_10 := close >((grid_1+grid_2)/2)
    short_9 := close >((grid_2+grid_3)/2)
    short_8 := close >((grid_3+grid_4)/2)
    short_7 := close >((grid_4+grid_5)/2)
    short_6 := close >((grid_5+grid_6)/2)
    short_5 := close >((grid_6+grid_7)/2)
    short_4 := close >((grid_7+grid_8)/2)
    short_3 := close >((grid_8+grid_9)/2)
    short_2 := close >((grid_9+grid_10)/2)
    short_1 := close > ((grid_10+grid_11)/2)

// ###########################################################################################

// ###########################################################################################

if ten_grid and ( trade_direction == 'LONG' or trade_direction == 'BOTH')
    if long_1 and strategy.opentrades == 0  and inDateRange  and stop_close_all == ""
        strategy.entry(id = "L_1",  direction =   strategy.long,alert_message = Long_message,  qty = qty_new   )
         
    if strategy.opentrades == 1 
        strategy.exit(id = "E_1",from_entry = "L_1", qty_percent = 100,alert_message =Long_Exit_message,stop = 0, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
           

    if long_2 and strategy.opentrades == 1  and inDateRange    and stop_close_all == ""
        strategy.entry(id = "L_2",   direction =   strategy.long,alert_message = Long_message,  qty = qty_new  )
                   

    if strategy.opentrades == 2
        strategy.exit(id = "E_2",from_entry = "L_2", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
           

    if long_3 and strategy.opentrades == 2  and inDateRange  and stop_close_all == ""
        strategy.entry(id = "L_3",  direction =   strategy.long,alert_message = Long_message, qty = qty_new  )
                    

    if strategy.opentrades == 3
        strategy.exit(id = "E_3",from_entry = "L_3", qty_percent = 100,alert_message =Long_Exit_message,limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
            


    if long_4 and strategy.opentrades == 3  and inDateRange    and stop_close_all == ""
        strategy.entry(id = "L_4",  direction =   strategy.long,alert_message = Long_message, qty = qty_new  )
                    
            

    if strategy.opentrades == 4
        strategy.exit(id = "E_4",from_entry = "L_4", qty_percent = 100,alert_message =Long_Exit_message,limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
            


    if long_5 and strategy.opentrades == 4  and inDateRange  and stop_close_all == ""
        strategy.entry(id = "L_5",   direction =   strategy.long,alert_message = Long_message,  qty = qty_new  )
                   

    if strategy.opentrades == 5
        strategy.exit(id = "E_5",from_entry = "L_5", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
    

// ###########################################################################################

if ten_grid and ( trade_direction == 'SHORT' or trade_direction == 'BOTH')

    if short_1 and strategy.opentrades == 0  and inDateRange   and stop_close_all == ""
        strategy.entry(id = "S_1",  direction =  strategy.short,alert_message = Short_message, qty = qty_new   )
                        
    if strategy.opentrades == 1
        strategy.exit(id = "ES_1",from_entry = "S_1", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            
    if short_2 and strategy.opentrades == 1  and inDateRange   and stop_close_all == ""
        strategy.entry(id = "S_2",direction =  strategy.short,alert_message = Short_message,  qty = qty_new   )
                    
        
    if strategy.opentrades == 2
        strategy.exit(id = "ES_2",from_entry = "S_2", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_3 and strategy.opentrades == 2  and inDateRange   and stop_close_all == ""
        strategy.entry(id = "S_3",   direction =  strategy.short,alert_message = Short_message,  qty = qty_new   )
                               

    if strategy.opentrades == 3 
        strategy.exit(id = "ES_3",from_entry = "S_3", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_4 and strategy.opentrades == 3  and inDateRange   and stop_close_all == ""
        strategy.entry(id = "S_4",   direction =  strategy.short,alert_message = Short_message, qty = qty_new    )
                        
            
    if strategy.opentrades == 4 
        strategy.exit(id = "ES_4",from_entry = "S_4", qty_percent = 100,alert_message =Short_Exit_message,limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_5 and strategy.opentrades == 4  and inDateRange   and stop_close_all == ""
        strategy.entry(id = "S_5",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new   )
                    

    if strategy.opentrades == 5 
        strategy.exit(id = "ES_5",from_entry = "S_5", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
    


// ###########################################################################################

// ###########################################################################################
long_exit_price = str.tostring(math.round_to_mintick(close*(1+percent_change)))
short_exit_price = str.tostring(math.round_to_mintick(close*(1-percent_change))) 


if  tewnty_grid and close > low_price and ( trade_direction == 'LONG' or trade_direction == 'BOTH')

    if long_1 and strategy.opentrades == 0  and inDateRange  and stop_close_all == ""
        strategy.entry(id = "L_1",  direction =  strategy.long,alert_message = Long_message,  qty = qty_new    )
         
    if strategy.opentrades == 1 
        strategy.exit(id = "E_1",from_entry = "L_1", qty_percent = 100,alert_message = Long_Exit_message,stop = 0, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
           

    if long_2 and strategy.opentrades == 1  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_2",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   

    if strategy.opentrades == 2
        strategy.exit(id = "E_2",from_entry = "L_2", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
           

    if long_3 and strategy.opentrades == 2  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_3",  direction =  strategy.long,alert_message = Long_message, qty = qty_new   )
                    

    if strategy.opentrades == 3
        strategy.exit(id = "E_3",from_entry = "L_3", qty_percent = 100,alert_message =Long_Exit_message,limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
            

    if long_4 and strategy.opentrades == 3  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_4",  direction =  strategy.long,alert_message = Long_message, qty = qty_new   )
                    
            
    if strategy.opentrades == 4
        strategy.exit(id = "E_4",from_entry = "L_4", qty_percent = 100,alert_message =Long_Exit_message,limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
            

    if long_5 and strategy.opentrades == 4  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_5",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   
    if strategy.opentrades == 5
        strategy.exit(id = "E_5",from_entry = "L_5", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
    

    if long_6 and strategy.opentrades == 5  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_6",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   
    if strategy.opentrades == 6
        strategy.exit(id = "E_6",from_entry = "L_6", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
    
    if long_7 and strategy.opentrades == 6  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_7",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   
    if strategy.opentrades == 7
        strategy.exit(id = "E_7",from_entry = "L_7", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
    
    if long_8 and strategy.opentrades == 7  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_8",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   
    if strategy.opentrades == 8
        strategy.exit(id = "E_8",from_entry = "L_8", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
    
    if long_9 and strategy.opentrades == 8  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_9",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   
    if strategy.opentrades == 9
        strategy.exit(id = "E_9",from_entry = "L_9", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))
                     
    if long_10 and strategy.opentrades == 9  and inDateRange   and close < strategy.opentrades.entry_price(strategy.opentrades - 1) * (1-percent_change) and stop_close_all == ""
        strategy.entry(id = "L_10",   direction =  strategy.long,alert_message = Long_message,  qty = qty_new   )
                   
    if strategy.opentrades == 10
        strategy.exit(id = "E_10",from_entry = "L_10", qty_percent = 100,alert_message =Long_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change))


// ##### STOP LOSS CODES  #####

if  use_stop and   low < low_price_stop and strategy.position_size > 0
    strategy.close_all(alert_message =Long_Stop_message, immediately = true)
    stop_close_all := "DONT"


// ###########################################################################################

if tewnty_grid and close < high_price and ( trade_direction == 'SHORT' or trade_direction == 'BOTH')

    if short_1 and strategy.opentrades == 0  and inDateRange   and stop_close_all == ""
        strategy.entry(id = "S_1",  direction =  strategy.short,alert_message = Short_message, qty = qty_new    )
                    
    if strategy.opentrades == 1
        strategy.exit(id = "ES_1",from_entry = "S_1", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_2 and strategy.opentrades == 1  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_2",direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )
                                   

    if strategy.opentrades == 2
        strategy.exit(id = "ES_2",from_entry = "S_2", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_3 and strategy.opentrades == 2  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_3",   direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )
                    
            
    if strategy.opentrades == 3 
        strategy.exit(id = "ES_3",from_entry = "S_3", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_4 and strategy.opentrades == 3  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_4",   direction =  strategy.short,alert_message = Short_message, qty = qty_new     )
                        
            
    if strategy.opentrades == 4 
        strategy.exit(id = "ES_4",from_entry = "S_4", qty_percent = 100,alert_message =Short_Exit_message,limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
            

    if short_5 and strategy.opentrades == 4  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_5",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )
                    

    if strategy.opentrades == 5 
        strategy.exit(id = "ES_5",from_entry = "S_5", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
    
    
    if short_6 and strategy.opentrades == 5  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_6",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )
                    

    if strategy.opentrades == 6 
        strategy.exit(id = "ES_6",from_entry = "S_6", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
        

    if short_7 and strategy.opentrades == 6  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_7",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )             

    if strategy.opentrades == 7 
        strategy.exit(id = "ES_7",from_entry = "S_7", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
       

    if short_8 and strategy.opentrades == 7  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_8",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )             

    if strategy.opentrades == 8 
        strategy.exit(id = "ES_8",from_entry = "S_8", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
    
    if short_9 and strategy.opentrades == 8  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_9",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )             

    if strategy.opentrades == 9 
        strategy.exit(id = "ES_9",from_entry = "S_9", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))
    
    if short_10 and strategy.opentrades == 9  and inDateRange   and close > strategy.opentrades.entry_price(strategy.opentrades - 1) * (1+percent_change) and stop_close_all == ""
        strategy.entry(id = "S_10",  direction =  strategy.short,alert_message = Short_message,  qty = qty_new    )             

    if strategy.opentrades == 10
        strategy.exit(id = "ES_10",from_entry = "S_10", qty_percent = 100,alert_message =Short_Exit_message, limit = strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change))


// ###########################################################################################

if  use_stop and  high > high_price_stop and strategy.position_size < 0
    strategy.close_all(alert_message =Short_Stop_message, immediately = true)
    stop_close_all := "DONT"


bgcolor(stop_close_all == "DONT" and stop_close_all[1] != "DONT" ? color.rgb(255, 42, 42) : na )

//// ########################################################################
// Plot Functions

plot(strategy.position_size < 0 ? strategy.opentrades.entry_price(strategy.opentrades - 1)*(1-percent_change) : na , color= color.rgb(247, 85, 85), linewidth= 1, style=plot.style_cross)
plot(strategy.position_size > 0 ? strategy.opentrades.entry_price(strategy.opentrades - 1)*(1+percent_change) : na , color= color.rgb(136, 247, 85), linewidth= 1, style=plot.style_cross)

plot(inDateRange ? high_price_stop : na, color= color.rgb(255, 37, 37), linewidth =4 )
plot(inDateRange ? low_price_stop : na, color= color.rgb(255, 34, 37), linewidth =4 )

plot(inDateRange ? high_price : na, color= color.rgb(0, 0, 0), linewidth =3 )
plot(inDateRange ? low_price : na, color= color.rgb(255, 255, 255), linewidth =3 )
plot(inDateRange ? (high_price + low_price) / 2 : na , color= color.rgb(0, 68, 255), linewidth = 2 )

// ###########################################################################################


var float new_ten_grid_1 = na 
var float new_ten_grid_2 = na 
var float new_ten_grid_3 = na 
var float new_ten_grid_4 = na 
var float new_ten_grid_5 = na 
var float new_ten_grid_6 = na 
var float new_ten_grid_7 = na 
var float new_ten_grid_8 = na 
var float new_ten_grid_9 = na 
var float new_ten_grid_10 = na 


if ten_grid == true and show_grid_level_bg and inDateRange 

    new_ten_grid_1 := grid_1
    new_ten_grid_2 := grid_2
    new_ten_grid_3 := grid_3
    new_ten_grid_4 := grid_4
    new_ten_grid_5 := grid_5
    new_ten_grid_6 := grid_6
    new_ten_grid_7 := grid_7
    new_ten_grid_8 := grid_8
    new_ten_grid_9 := grid_9
    new_ten_grid_10 := grid_10


else if ten_grid == false

    new_ten_grid_1 := na
    new_ten_grid_2 := na
    new_ten_grid_3 := na
    new_ten_grid_4 := na
    new_ten_grid_5 := na
    new_ten_grid_6 := na
    new_ten_grid_7 := na
    new_ten_grid_8 := na
    new_ten_grid_9 := na
    new_ten_grid_10 := na


fill(plot(inDateRange ? new_ten_grid_1 : na , color = color.new(color.green, 90)), 
     plot(inDateRange ? new_ten_grid_2 : na , color = color.new(color.green, 90)), 
         color = color.new(color.green, 90))
fill(plot(inDateRange ?  new_ten_grid_2 : na , color = color.new(color.green, 85)), 
     plot(inDateRange ? new_ten_grid_3 : na , color = color.new(color.green, 85)), 
         color = color.new(color.green, 85))
fill(plot(inDateRange ? new_ten_grid_3 : na , color = color.new(color.green, 80)), 
     plot(inDateRange ? new_ten_grid_4 : na , color = color.new(color.green, 80)), 
         color = color.new(color.green, 80))
fill(plot(inDateRange ? new_ten_grid_4 : na , color = color.new(color.green, 70)), 
     plot(inDateRange ? new_ten_grid_5 : na , color = color.new(color.green, 70)), 
         color = color.new(color.green, 70))
fill(plot(inDateRange ?  new_ten_grid_5 : na , color = color.new(color.green, 60)), 
     plot(inDateRange ? new_ten_grid_6 : na, color = color.new(color.green, 60)), 
         color = color.new(color.green, 60))
fill(plot(inDateRange ? new_ten_grid_6 : na, color = color.new(color.red, 60)), 
     plot(inDateRange ? new_ten_grid_7 : na, color = color.new(color.red, 60)), 
         color = color.new(color.red, 60))
fill(plot(inDateRange ? new_ten_grid_7 : na, color = color.new(color.red, 70)), 
     plot(inDateRange ? new_ten_grid_8 : na, color = color.new(color.red, 70)), 
         color = color.new(color.red, 70))
fill(plot(inDateRange ? new_ten_grid_8 : na, color = color.new(color.red, 80)), 
     plot(inDateRange ? new_ten_grid_9 : na, color = color.new(color.red, 80)), 
         color = color.new(color.red, 80))
fill(plot(inDateRange ? new_ten_grid_9 : na, color = color.new(color.red, 85)), 
     plot(inDateRange ? new_ten_grid_10 : na, color = color.new(color.red, 85)), 
         color = color.new(color.red, 85))



// // ###########################################################################################

var float new_twenty_grid_1 = na 
var float new_twenty_grid_2 = na 
var float new_twenty_grid_3 = na 
var float new_twenty_grid_4 = na 
var float new_twenty_grid_5 = na 
var float new_twenty_grid_6 = na 
var float new_twenty_grid_7 = na 
var float new_twenty_grid_8 = na 
var float new_twenty_grid_9 = na 
var float new_twenty_grid_10 = na 
var float new_twenty_grid_11 = na 
var float new_twenty_grid_12 = na 
var float new_twenty_grid_13 = na 
var float new_twenty_grid_14 = na 
var float new_twenty_grid_15 = na 
var float new_twenty_grid_16 = na 
var float new_twenty_grid_17 = na 
var float new_twenty_grid_18 = na 
var float new_twenty_grid_19 = na 
var float new_twenty_grid_20 = na 



if tewnty_grid == true and show_grid_level_bg and inDateRange 

    new_twenty_grid_1 := grid_1
    new_twenty_grid_2 := grid_2
    new_twenty_grid_3 := grid_3
    new_twenty_grid_4 := grid_4
    new_twenty_grid_5 := grid_5
    new_twenty_grid_6 := grid_6
    new_twenty_grid_7 := grid_7
    new_twenty_grid_8 := grid_8
    new_twenty_grid_9 := grid_9
    new_twenty_grid_10 := grid_10
    new_twenty_grid_11 := grid_11
    new_twenty_grid_12 := grid_12
    new_twenty_grid_13 := grid_13
    new_twenty_grid_14 := grid_14
    new_twenty_grid_15 := grid_15
    new_twenty_grid_16 := grid_16
    new_twenty_grid_17 := grid_17
    new_twenty_grid_18 := grid_18
    new_twenty_grid_19 := grid_19
    new_twenty_grid_20 := grid_20



else if tewnty_grid == false

    new_twenty_grid_1 := na
    new_twenty_grid_2 := na
    new_twenty_grid_3 := na
    new_twenty_grid_4 := na
    new_twenty_grid_5 := na
    new_twenty_grid_6 := na
    new_twenty_grid_7 := na
    new_twenty_grid_8 := na
    new_twenty_grid_9 := na
    new_twenty_grid_10 := na
    new_twenty_grid_11 := na
    new_twenty_grid_12 := na
    new_twenty_grid_13 := na
    new_twenty_grid_14 := na
    new_twenty_grid_15 := na
    new_twenty_grid_16 := na
    new_twenty_grid_17 := na
    new_twenty_grid_18 := na
    new_twenty_grid_19 := na
    new_twenty_grid_20 := na



fill(plot(inDateRange ? new_twenty_grid_1 : na , color = color.new(color.green, 90)), 
     plot(inDateRange ? new_twenty_grid_2 : na , color = color.new(color.green, 90)), 
         color = color.new(color.green, 90))
fill(plot(inDateRange ? new_twenty_grid_2 : na , color = color.new(color.green, 85)), 
     plot(inDateRange ? new_twenty_grid_3 : na , color = color.new(color.green, 85)), 
         color = color.new(color.green, 85))
fill(plot(inDateRange ? new_twenty_grid_3 : na , color = color.new(color.green, 80)), 
     plot(inDateRange ? new_twenty_grid_4 : na , color = color.new(color.green, 80)), 
         color = color.new(color.green, 80))
fill(plot(inDateRange ? new_twenty_grid_4 : na , color = color.new(color.green, 70)), 
     plot(inDateRange ? new_twenty_grid_5 : na , color = color.new(color.green, 70)), 
         color = color.new(color.green, 70))
fill(plot(inDateRange ? new_twenty_grid_5 : na , color = color.new(color.green, 60)), 
     plot(inDateRange ? new_twenty_grid_6 : na , color = color.new(color.green, 60)), 
         color = color.new(color.green, 60))
fill(plot(inDateRange ? new_twenty_grid_6 : na , color = color.new(color.green, 60)), 
     plot(inDateRange ? new_twenty_grid_7 : na , color = color.new(color.green, 60)), 
         color = color.new(color.green, 60))
fill(plot(inDateRange ? new_twenty_grid_7 : na , color = color.new(color.green, 70)), 
     plot(inDateRange ? new_twenty_grid_8 : na , color = color.new(color.green, 70)), 
         color = color.new(color.green, 70))
fill(plot(inDateRange ? new_twenty_grid_8 : na , color = color.new(color.green, 80)), 
     plot(inDateRange ? new_twenty_grid_9 : na , color = color.new(color.green, 80)), 
         color = color.new(color.green, 80))
fill(plot(inDateRange ? new_twenty_grid_9 : na , color = color.new(color.green, 85)), 
     plot(inDateRange ? new_twenty_grid_10 : na , color = color.new(color.green, 85)), 
         color = color.new(color.green, 85))
fill(plot(inDateRange ? new_twenty_grid_10 : na , color = color.new(color.red, 90)), 
     plot(inDateRange ? new_twenty_grid_11 : na , color = color.new(color.red, 90)), 
         color = color.new(color.red, 90))
fill(plot(inDateRange ? new_twenty_grid_11 : na , color = color.new(color.red, 85)), 
     plot(inDateRange ? new_twenty_grid_12 : na , color = color.new(color.red, 85)), 
         color = color.new(color.red, 85))
fill(plot(inDateRange ? new_twenty_grid_12 : na , color = color.new(color.red, 80)), 
     plot(inDateRange ? new_twenty_grid_13 : na , color = color.new(color.red, 80)), 
         color = color.new(color.red, 80))
fill(plot(inDateRange ? new_twenty_grid_13 : na , color = color.new(color.red, 70)), 
     plot(inDateRange ? new_twenty_grid_14 : na , color = color.new(color.red, 70)), 
         color = color.new(color.red, 70))
fill(plot(inDateRange ? new_twenty_grid_14 : na , color = color.new(color.red, 60)), 
     plot(inDateRange ? new_twenty_grid_15 : na , color = color.new(color.red, 60)), 
         color = color.new(color.red, 60))
fill(plot(inDateRange ? new_twenty_grid_15 : na , color = color.new(color.red, 60)), 
     plot(inDateRange ? new_twenty_grid_16 : na , color = color.new(color.red, 60)), 
         color = color.new(color.red, 60))
fill(plot(inDateRange ? new_twenty_grid_16 : na , color = color.new(color.red, 70)), 
     plot(inDateRange ? new_twenty_grid_17 : na , color = color.new(color.red, 70)), 
         color = color.new(color.red, 70))
fill(plot(inDateRange ? new_twenty_grid_17 : na , color = color.new(color.red, 80)), 
     plot(inDateRange ? new_twenty_grid_18 : na , color = color.new(color.red, 80)), 
         color = color.new(color.red, 80))
fill(plot(inDateRange ? new_twenty_grid_18 : na , color = color.new(color.red, 85)), 
     plot(inDateRange ? new_twenty_grid_19 : na , color = color.new(color.red, 85)), 
         color = color.new(color.red, 85))
fill(plot(inDateRange ? new_twenty_grid_19 : na , color = color.new(color.red, 85)), 
     plot(inDateRange ? new_twenty_grid_20 : na , color = color.new(color.red, 85)), 
         color = color.new(color.red, 85))

// // ###########################################################################################

//###############################################################################################
//------------------------------Table
//###############################################################################################
showDashboard     = input.bool(true, "Show Table", group=" ############# 🔳 TABLE Settings 🔳 ############ ")
locationDashboard = input.string("Top Right", "Table Location", ["Top Right", "Middle Right", "Bottom Right", "Top Center", "Middle Center", "Bottom Center", "Top Left", "Middle Left", "Bottom Left"], group=" ############# 🔳 TABLE Settings 🔳 ############ ")
sizeDashboard     = input.string("Normal", "Table Size", ["Large", "Normal", "Small", "Tiny"], group=" ############# 🔳 TABLE Settings 🔳 ############ ")

var dashboard_loc  = locationDashboard == "Top Right" ? position.top_right : locationDashboard == "Middle Right" ? position.middle_right : locationDashboard == "Bottom Right" ? position.bottom_right : locationDashboard == "Top Center" ? position.top_center : locationDashboard == "Middle Center" ? position.middle_center : locationDashboard == "Bottom Center" ? position.bottom_center : locationDashboard == "Top Left" ? position.top_left : locationDashboard == "Middle Left" ? position.middle_left : position.bottom_left
var dashboard_size = sizeDashboard == "Large" ? size.large : sizeDashboard == "Normal" ? size.normal : sizeDashboard == "Small" ? size.small : size.tiny

if showDashboard
    var myTable =  table.new(position = dashboard_loc, columns = 5, rows = 2,bgcolor = color.white, border_width = 1, frame_color = color.rgb(25, 150, 25), frame_width = 3, border_color = color.rgb(25, 150, 25)) 


    table.cell(table_id = myTable, column = 0, row = 0, text = "Open positions"      , text_color = color.white, bgcolor = color.orange, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 1, row = 0, text = "Open profit"         , text_color = color.white, bgcolor = color.orange, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 2, row = 0, text = "Total trades"        , text_color = color.white, bgcolor = color.orange, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 3, row = 0, text = "Total profit"        , text_color = color.white, bgcolor = color.orange, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 4, row = 0, text = "Current equity"      , text_color = color.white, bgcolor = color.orange, text_size=dashboard_size)



    table.cell(table_id = myTable, column = 0, row = 1, text =       str.tostring(strategy.opentrades)                                                                                      , text_font_family = font.family_monospace, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 1, row = 1, text = "$" + str.tostring(math.round(strategy.openprofit, 1)) , bgcolor = strategy.openprofit >= 0 ? color.green : color.red  , text_font_family = font.family_monospace, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 2, row = 1, text =       str.tostring(strategy.closedtrades)                                                                                    , text_font_family = font.family_monospace, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 3, row = 1, text = "$" + str.tostring(math.round(strategy.netprofit, 1)) , bgcolor = strategy.netprofit  >= 0 ? color.green : color.red  , text_font_family = font.family_monospace, text_size=dashboard_size)
    table.cell(table_id = myTable, column = 4, row = 1, text = "$" + str.tostring(math.round(strategy.equity, 1)) , bgcolor = strategy.equity     >= 0 ? color.green : color.red  , text_font_family = font.family_monospace, text_size=dashboard_size)