Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //@version=5
- indicator("Entry helper",overlay=true)
- //---------------INPUT VALUES---------------
- //CREATE GROUPS
- var CAPITAL_SETTINGS = "CAPITAL SETTNGS"
- var TRADE_SETTINGS = "TRADE SETTNGS"
- var ENTRY_SETTINGS = "ENTRY SETTNGS"
- var SL_SETTINGS = "STOP LOSS SETTINGS"
- var TP_SETTINGS = "TAKE PROFIT SETTINGS"
- var CURRENCY_SETTINGS = "CURRENCY SETTINGS"
- var TAB_SETTINGS = "TAB SETTINGS"
- var VISUAL_SETTINGS = "VISUAL SETTINGS"
- //INPUTS
- //CAPITAL OF THE TRADE
- CAPITAL = input.int(15000,"Capital ($)",group=CAPITAL_SETTINGS)
- //SIDE AND RISK MANAGEMENT SETTIGNS
- SIDE = input.string(title="Trade side", defval="BUY", options=["BUY","SELL"],group=TRADE_SETTINGS)
- RISK_PERCENT = input.float(0.25,"Risk per trade (%)",group=TRADE_SETTINGS)
- //ENTRY LEVEL
- ENTRY_PLACEMENT = input.string(title="Entry placement", defval="MARKET", options=["MARKET","LIMIT"],group=ENTRY_SETTINGS)
- LIMIT_PRICE = input.float(0,"Limit price",group=ENTRY_SETTINGS)
- //STOP LOSS PLACEMENT SETTINGS
- STOP_LOSS_PLACEMENT = input.string("EXTREMA","Stop loss placement", options=["EXTREMA","ATR EXTREMA","TICKS EXTREMA","PRICE LEVEL"],group=SL_SETTINGS)
- N_CANDLES = input.int(5,"Number of candles to check for extrema",group=SL_SETTINGS)
- ATR_COEFF = input.float(1,"ATR Coefficient",group=SL_SETTINGS,inline="31")
- ATR_L = input.int(14,"ATR Length",group=SL_SETTINGS,inline="31")
- TICKS = input.int(10,"Number of ticks for the stop loss",group=SL_SETTINGS)
- SL_LEVEL = input.float(0,"Price level for the stop loss",group=SL_SETTINGS)
- //TAKE PROFIT PLACEMENT
- TAKE_PROFIT_PLACEMENT = input.string("NONE","Take profit placement", options=["NONE","RR","PRICE LEVEL"],group=TP_SETTINGS)
- TRADE_RR = input.float(2,"RR",group=TP_SETTINGS)
- TP_LEVEL = input.float(0,"Price level for the take profit",group=TP_SETTINGS)
- //QUANTITY VALUE
- QUANTITY_VALUE = input.float(100000,"Quantity per lot",group=CURRENCY_SETTINGS)
- //FEE
- FEE_PER_LOT = input.float(0,"Fee per turning lot ($)",group=CURRENCY_SETTINGS)
- //VISUAL
- SHOW_TAB = input.bool(true,"Show tab with data",group=VISUAL_SETTINGS)
- //TAB SETTIGNS
- SHOW_CAPITAL = input.bool(true,"Capital",group=TAB_SETTINGS,inline="21")
- SHOW_RISK = input.bool(true,"Risk",group=TAB_SETTINGS,inline="21")
- SHOW_PROFIT = input.bool(true,"Profit",group=TAB_SETTINGS,inline="21")
- SHOW_RR = input.bool(true,"RR",group=TAB_SETTINGS,inline="21")
- SHOW_SIDE = input.bool(true,"Side",group=TAB_SETTINGS,inline="21")
- SHOW_FEE = input.bool(true,"Fee",group=TAB_SETTINGS,inline="21")
- SHOW_LEVERAGE = input.bool(true,"Leverage",group=TAB_SETTINGS,inline="21")
- SHOW_POSITION_SIZE = input.bool(true,"Position",group=TAB_SETTINGS,inline="21")
- //---------------END OF INPUT VALUES---------------
- //CALCULATE RISK
- RISK = RISK_PERCENT*CAPITAL/100
- //GET STOP LOSS
- STOP_LOSS = 0.0
- if SIDE == "BUY"
- STOP_LOSS := ta.lowest(low,N_CANDLES)
- if STOP_LOSS_PLACEMENT == "ATR EXTREMA"
- STOP_LOSS := STOP_LOSS - ta.atr(ATR_L)*ATR_COEFF
- if STOP_LOSS_PLACEMENT == "TICKS EXTREMA"
- STOP_LOSS := STOP_LOSS - TICKS*syminfo.mintick
- if SIDE == "SELL"
- STOP_LOSS := ta.highest(high,N_CANDLES)
- if STOP_LOSS_PLACEMENT == "ATR EXTREMA"
- STOP_LOSS := STOP_LOSS + ta.atr(ATR_L)*ATR_COEFF
- if STOP_LOSS_PLACEMENT == "TICKS EXTREMA"
- STOP_LOSS := STOP_LOSS + TICKS*syminfo.mintick
- if STOP_LOSS_PLACEMENT == "PRICE LEVEL"
- STOP_LOSS := SL_LEVEL
- //ROUND EXTREMA TO ASSET PRECISION
- STOP_LOSS := math.round_to_mintick(STOP_LOSS)
- //DEFINE ENTRY PRICE
- ENTRY_PRICE = 0.0
- if ENTRY_PLACEMENT == "LIMIT"
- ENTRY_PRICE := LIMIT_PRICE
- if ENTRY_PLACEMENT == "MARKET"
- ENTRY_PRICE := close
- //CALCULATE TAKE PROFIT
- TAKE_PROFIT = 0.0
- if SIDE == "BUY" and TAKE_PROFIT_PLACEMENT == "RR"
- TAKE_PROFIT := ENTRY_PRICE + (ENTRY_PRICE-STOP_LOSS)*TRADE_RR
- if SIDE == "SELL" and TAKE_PROFIT_PLACEMENT == "RR"
- TAKE_PROFIT := ENTRY_PRICE - (STOP_LOSS-ENTRY_PRICE)*TRADE_RR
- if TAKE_PROFIT_PLACEMENT == "PRICE LEVEL"
- TAKE_PROFIT := TP_LEVEL
- //ROUND EXTREMA TO ASSET PRECISION
- TAKE_PROFIT := math.round_to_mintick(TAKE_PROFIT)
- //CALCULATE LOT SIZE
- QUANTITY = 0.0
- if SIDE == "BUY"
- QUANTITY := (RISK/(ENTRY_PRICE-STOP_LOSS))/QUANTITY_VALUE
- if SIDE == "SELL"
- QUANTITY := (RISK/(STOP_LOSS-ENTRY_PRICE))/QUANTITY_VALUE
- //ROUND QUANTITY TO .1 PRECISION
- QUANTITY := math.floor(QUANTITY*10)/10
- //CALCULATE LEVERAGE
- LEVERAGE = QUANTITY*QUANTITY_VALUE*ENTRY_PRICE/CAPITAL
- LEVERAGE := math.floor(10*QUANTITY*QUANTITY_VALUE*ENTRY_PRICE/CAPITAL)/10
- //GET INDEX OF EXTREMA
- INDEX = 0
- if SIDE == "BUY"
- INDEX := ((ta.lowestbars(low, N_CANDLES) - 1)/ -1) -1
- if SIDE == "SELL"
- INDEX := ((ta.highestbars(high, N_CANDLES) - 1)/ -1) -1
- //GET FEE AND ROUND FEE
- TOTAL_FEE = FEE_PER_LOT*QUANTITY
- TOTAL_FEE := math.floor(TOTAL_FEE*10)/10
- //GET RR
- RR = SIDE == "SELL" ? (ENTRY_PRICE-TAKE_PROFIT)/(STOP_LOSS-ENTRY_PRICE) : (TAKE_PROFIT-ENTRY_PRICE)/(ENTRY_PRICE-STOP_LOSS)
- RR := math.floor(RR*100)/100
- if TAKE_PROFIT_PLACEMENT == "NONE"
- RR := na
- //INVALID SCENARIO
- if (STOP_LOSS >= ENTRY_PRICE and SIDE == "BUY") or (STOP_LOSS <= ENTRY_PRICE and SIDE == "SELL")
- QUANTITY := na
- LEVERAGE := na
- STOP_LOSS := na
- TOTAL_FEE := na
- //LABELS AND LINES
- var SL_LABELS = array.new_label()
- var TP_LABELS = array.new_label()
- var ENTRY_LABELS = array.new_label()
- var SL_LINES = array.new_line()
- var TP_LINES = array.new_line()
- var ENTRY_LINES = array.new_line()
- var VERTICAL_LINES = array.new_line()
- //DELETE PREVIOUS LABELS AND LINES
- i = 0
- while i < array.size(SL_LABELS)
- //STOP LOSS LABELS
- label.delete(array.get(SL_LABELS,i))
- array.remove(SL_LABELS,i)
- //TAKE PROFIT LABELS
- if TAKE_PROFIT_PLACEMENT != "NONE"
- label.delete(array.get(TP_LABELS,i))
- array.remove(TP_LABELS,i)
- //STOP LOSS LINES
- line.delete(array.get(SL_LINES,i))
- array.remove(SL_LINES,i)
- //TAKE PROFIT LINES
- if TAKE_PROFIT_PLACEMENT != "NONE"
- line.delete(array.get(TP_LINES,i))
- array.remove(TP_LINES,i)
- //ENTRY LINES
- line.delete(array.get(ENTRY_LINES,i))
- array.remove(ENTRY_LINES,i)
- //ENTRY LINES
- label.delete(array.get(ENTRY_LABELS,i))
- array.remove(ENTRY_LABELS,i)
- //VERTICAL LINES
- line.delete(array.get(VERTICAL_LINES,i))
- array.remove(VERTICAL_LINES,i)
- i := i + 1
- //VISUAL OPTIONS COUNTER
- VISUAL_OPTIONS_COUNTER = 0
- if SHOW_CAPITAL
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_RISK
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_PROFIT
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_RR
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_SIDE
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_FEE
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_LEVERAGE
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- if SHOW_POSITION_SIZE
- VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
- //TAB CREATION AND PLOTTING
- if SHOW_TAB and barstate.islast
- //CREATE TAB WITH DATA
- var TABLE = table.new(position.top_right, 2, VISUAL_OPTIONS_COUNTER)
- i := 0
- //VISUAL OPTIONS
- if SHOW_CAPITAL
- table.cell(TABLE, 0, i, "CAPITAL", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(CAPITAL) + "$", bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_RISK
- table.cell(TABLE, 0, i, "RISK", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(RISK_PERCENT) + "%", bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_PROFIT
- table.cell(TABLE, 0, i, "PROFIT", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(math.floor(RR*RISK_PERCENT*100)/100) + "%", bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_RR
- table.cell(TABLE, 0, i, "RR", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(RR), bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_SIDE
- table.cell(TABLE, 0, i, "SIDE", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(SIDE), bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_FEE
- table.cell(TABLE, 0, i, "FEE", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(TOTAL_FEE) + "$", bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_LEVERAGE
- table.cell(TABLE, 0, i, "LEVERAGE", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(LEVERAGE) + "x", bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if SHOW_POSITION_SIZE
- table.cell(TABLE, 0, i, "QUANTITY", bgcolor = #aaaaaa, width = 7, height = 7)
- table.cell(TABLE, 1, i, str.tostring(QUANTITY), bgcolor = #aaaaaa, width = 7, height = 7)
- i := i + 1
- if barstate.islast
- //SHOW PRICE USED AS REFERENCE FOR THE STOP LOSS AND TAKE PROFIT
- if SIDE == "BUY"
- //STOP LOSS
- array.push(SL_LABELS,label.new(x=bar_index[INDEX], y=STOP_LOSS,text="STOP at " + str.tostring(STOP_LOSS),size = size.large,style=label.style_label_up,textcolor = color.rgb(0,0,0,0),color = color.red))
- //TAKE TAKE PROFIT
- if TAKE_PROFIT_PLACEMENT != "NONE"
- array.push(TP_LABELS,label.new(x=bar_index[INDEX], y=TAKE_PROFIT,text="PROFIT at " + str.tostring(TAKE_PROFIT),size = size.large,style=label.style_label_down,textcolor = color.rgb(0,0,0,0),color = color.green))
- if SIDE == "SELL"
- //STOP LOSS
- array.push(SL_LABELS,label.new(x=bar_index[INDEX], y=STOP_LOSS,text="STOP at " + str.tostring(STOP_LOSS),size = size.large,style=label.style_label_down,textcolor = color.rgb(0,0,0,0),color = color.red))
- //TAKE TAKE PROFIT
- if TAKE_PROFIT_PLACEMENT != "NONE"
- array.push(TP_LABELS,label.new(x=bar_index[INDEX], y=TAKE_PROFIT,text="PROFIT at " + str.tostring(TAKE_PROFIT),size = size.large,style=label.style_label_up,textcolor = color.rgb(0,0,0,0),color = color.green))
- //ENTRY LEVEL
- array.push(ENTRY_LABELS,label.new(x=bar_index[INDEX], y=ENTRY_PRICE,text=SIDE + " " + str.tostring(QUANTITY) + " at " + str.tostring(ENTRY_PRICE),size = size.large,textcolor = color.rgb(0,0,0,0),style=label.style_label_right,color = color.blue))
- //PLOT HORINZONTAL LINES
- //PLOT STOP LOSS
- array.push(SL_LINES,line.new(bar_index[INDEX],STOP_LOSS,bar_index+500,STOP_LOSS,color=color.red))
- //PLOT TAKE PROFIT
- if TAKE_PROFIT_PLACEMENT != "NONE"
- array.push(TP_LINES,line.new(bar_index[INDEX],TAKE_PROFIT,bar_index+500,TAKE_PROFIT,color=color.green))
- //PLOT ENTRY LINE
- array.push(ENTRY_LINES,line.new(bar_index[INDEX],ENTRY_PRICE,bar_index+500,ENTRY_PRICE,color=color.blue))
- //PLOT VERTICAL LINE TO SITUATE CALCULATION POINT
- array.push(VERTICAL_LINES,line.new(bar_index[INDEX],close,bar_index[INDEX],close*1.01,color=color.white,style=line.style_dashed,extend = extend.both))
Advertisement
Add Comment
Please, Sign In to add comment