xmd79

Entry helper

Dec 11th, 2022
287
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.99 KB | None | 0 0
  1. //@version=5
  2. indicator("Entry helper",overlay=true)
  3.  
  4. //---------------INPUT VALUES---------------
  5.  
  6. //CREATE GROUPS
  7. var CAPITAL_SETTINGS = "CAPITAL SETTNGS"
  8. var TRADE_SETTINGS = "TRADE SETTNGS"
  9. var ENTRY_SETTINGS = "ENTRY SETTNGS"
  10. var SL_SETTINGS = "STOP LOSS SETTINGS"
  11. var TP_SETTINGS = "TAKE PROFIT SETTINGS"
  12. var CURRENCY_SETTINGS = "CURRENCY SETTINGS"
  13. var TAB_SETTINGS = "TAB SETTINGS"
  14. var VISUAL_SETTINGS = "VISUAL SETTINGS"
  15. //INPUTS
  16. //CAPITAL OF THE TRADE
  17. CAPITAL = input.int(15000,"Capital ($)",group=CAPITAL_SETTINGS)
  18. //SIDE AND RISK MANAGEMENT SETTIGNS
  19. SIDE = input.string(title="Trade side", defval="BUY", options=["BUY","SELL"],group=TRADE_SETTINGS)
  20. RISK_PERCENT = input.float(0.25,"Risk per trade (%)",group=TRADE_SETTINGS)
  21. //ENTRY LEVEL
  22. ENTRY_PLACEMENT = input.string(title="Entry placement", defval="MARKET", options=["MARKET","LIMIT"],group=ENTRY_SETTINGS)
  23. LIMIT_PRICE = input.float(0,"Limit price",group=ENTRY_SETTINGS)
  24. //STOP LOSS PLACEMENT SETTINGS
  25. STOP_LOSS_PLACEMENT = input.string("EXTREMA","Stop loss placement", options=["EXTREMA","ATR EXTREMA","TICKS EXTREMA","PRICE LEVEL"],group=SL_SETTINGS)
  26. N_CANDLES = input.int(5,"Number of candles to check for extrema",group=SL_SETTINGS)
  27. ATR_COEFF = input.float(1,"ATR Coefficient",group=SL_SETTINGS,inline="31")
  28. ATR_L = input.int(14,"ATR Length",group=SL_SETTINGS,inline="31")
  29. TICKS = input.int(10,"Number of ticks for the stop loss",group=SL_SETTINGS)
  30. SL_LEVEL = input.float(0,"Price level for the stop loss",group=SL_SETTINGS)
  31. //TAKE PROFIT PLACEMENT
  32. TAKE_PROFIT_PLACEMENT = input.string("NONE","Take profit placement", options=["NONE","RR","PRICE LEVEL"],group=TP_SETTINGS)
  33. TRADE_RR = input.float(2,"RR",group=TP_SETTINGS)
  34. TP_LEVEL = input.float(0,"Price level for the take profit",group=TP_SETTINGS)
  35. //QUANTITY VALUE
  36. QUANTITY_VALUE = input.float(100000,"Quantity per lot",group=CURRENCY_SETTINGS)
  37. //FEE
  38. FEE_PER_LOT = input.float(0,"Fee per turning lot ($)",group=CURRENCY_SETTINGS)
  39. //VISUAL
  40. SHOW_TAB = input.bool(true,"Show tab with data",group=VISUAL_SETTINGS)
  41. //TAB SETTIGNS
  42. SHOW_CAPITAL = input.bool(true,"Capital",group=TAB_SETTINGS,inline="21")
  43. SHOW_RISK = input.bool(true,"Risk",group=TAB_SETTINGS,inline="21")
  44. SHOW_PROFIT = input.bool(true,"Profit",group=TAB_SETTINGS,inline="21")
  45. SHOW_RR = input.bool(true,"RR",group=TAB_SETTINGS,inline="21")
  46. SHOW_SIDE = input.bool(true,"Side",group=TAB_SETTINGS,inline="21")
  47. SHOW_FEE = input.bool(true,"Fee",group=TAB_SETTINGS,inline="21")
  48. SHOW_LEVERAGE = input.bool(true,"Leverage",group=TAB_SETTINGS,inline="21")
  49. SHOW_POSITION_SIZE = input.bool(true,"Position",group=TAB_SETTINGS,inline="21")
  50.  
  51. //---------------END OF INPUT VALUES---------------
  52.  
  53. //CALCULATE RISK
  54. RISK = RISK_PERCENT*CAPITAL/100
  55.  
  56. //GET STOP LOSS
  57. STOP_LOSS = 0.0
  58.  
  59. if SIDE == "BUY"
  60. STOP_LOSS := ta.lowest(low,N_CANDLES)
  61. if STOP_LOSS_PLACEMENT == "ATR EXTREMA"
  62. STOP_LOSS := STOP_LOSS - ta.atr(ATR_L)*ATR_COEFF
  63. if STOP_LOSS_PLACEMENT == "TICKS EXTREMA"
  64. STOP_LOSS := STOP_LOSS - TICKS*syminfo.mintick
  65.  
  66. if SIDE == "SELL"
  67. STOP_LOSS := ta.highest(high,N_CANDLES)
  68. if STOP_LOSS_PLACEMENT == "ATR EXTREMA"
  69. STOP_LOSS := STOP_LOSS + ta.atr(ATR_L)*ATR_COEFF
  70. if STOP_LOSS_PLACEMENT == "TICKS EXTREMA"
  71. STOP_LOSS := STOP_LOSS + TICKS*syminfo.mintick
  72.  
  73. if STOP_LOSS_PLACEMENT == "PRICE LEVEL"
  74. STOP_LOSS := SL_LEVEL
  75.  
  76. //ROUND EXTREMA TO ASSET PRECISION
  77. STOP_LOSS := math.round_to_mintick(STOP_LOSS)
  78.  
  79. //DEFINE ENTRY PRICE
  80. ENTRY_PRICE = 0.0
  81. if ENTRY_PLACEMENT == "LIMIT"
  82. ENTRY_PRICE := LIMIT_PRICE
  83. if ENTRY_PLACEMENT == "MARKET"
  84. ENTRY_PRICE := close
  85.  
  86.  
  87. //CALCULATE TAKE PROFIT
  88. TAKE_PROFIT = 0.0
  89. if SIDE == "BUY" and TAKE_PROFIT_PLACEMENT == "RR"
  90. TAKE_PROFIT := ENTRY_PRICE + (ENTRY_PRICE-STOP_LOSS)*TRADE_RR
  91. if SIDE == "SELL" and TAKE_PROFIT_PLACEMENT == "RR"
  92. TAKE_PROFIT := ENTRY_PRICE - (STOP_LOSS-ENTRY_PRICE)*TRADE_RR
  93. if TAKE_PROFIT_PLACEMENT == "PRICE LEVEL"
  94. TAKE_PROFIT := TP_LEVEL
  95.  
  96. //ROUND EXTREMA TO ASSET PRECISION
  97. TAKE_PROFIT := math.round_to_mintick(TAKE_PROFIT)
  98.  
  99. //CALCULATE LOT SIZE
  100. QUANTITY = 0.0
  101.  
  102. if SIDE == "BUY"
  103. QUANTITY := (RISK/(ENTRY_PRICE-STOP_LOSS))/QUANTITY_VALUE
  104.  
  105. if SIDE == "SELL"
  106. QUANTITY := (RISK/(STOP_LOSS-ENTRY_PRICE))/QUANTITY_VALUE
  107.  
  108. //ROUND QUANTITY TO .1 PRECISION
  109. QUANTITY := math.floor(QUANTITY*10)/10
  110.  
  111. //CALCULATE LEVERAGE
  112. LEVERAGE = QUANTITY*QUANTITY_VALUE*ENTRY_PRICE/CAPITAL
  113. LEVERAGE := math.floor(10*QUANTITY*QUANTITY_VALUE*ENTRY_PRICE/CAPITAL)/10
  114.  
  115. //GET INDEX OF EXTREMA
  116. INDEX = 0
  117. if SIDE == "BUY"
  118. INDEX := ((ta.lowestbars(low, N_CANDLES) - 1)/ -1) -1
  119.  
  120. if SIDE == "SELL"
  121. INDEX := ((ta.highestbars(high, N_CANDLES) - 1)/ -1) -1
  122.  
  123. //GET FEE AND ROUND FEE
  124. TOTAL_FEE = FEE_PER_LOT*QUANTITY
  125. TOTAL_FEE := math.floor(TOTAL_FEE*10)/10
  126.  
  127. //GET RR
  128. RR = SIDE == "SELL" ? (ENTRY_PRICE-TAKE_PROFIT)/(STOP_LOSS-ENTRY_PRICE) : (TAKE_PROFIT-ENTRY_PRICE)/(ENTRY_PRICE-STOP_LOSS)
  129. RR := math.floor(RR*100)/100
  130. if TAKE_PROFIT_PLACEMENT == "NONE"
  131. RR := na
  132.  
  133. //INVALID SCENARIO
  134. if (STOP_LOSS >= ENTRY_PRICE and SIDE == "BUY") or (STOP_LOSS <= ENTRY_PRICE and SIDE == "SELL")
  135. QUANTITY := na
  136. LEVERAGE := na
  137. STOP_LOSS := na
  138. TOTAL_FEE := na
  139.  
  140. //LABELS AND LINES
  141. var SL_LABELS = array.new_label()
  142. var TP_LABELS = array.new_label()
  143. var ENTRY_LABELS = array.new_label()
  144. var SL_LINES = array.new_line()
  145. var TP_LINES = array.new_line()
  146. var ENTRY_LINES = array.new_line()
  147. var VERTICAL_LINES = array.new_line()
  148.  
  149. //DELETE PREVIOUS LABELS AND LINES
  150. i = 0
  151. while i < array.size(SL_LABELS)
  152. //STOP LOSS LABELS
  153. label.delete(array.get(SL_LABELS,i))
  154. array.remove(SL_LABELS,i)
  155. //TAKE PROFIT LABELS
  156. if TAKE_PROFIT_PLACEMENT != "NONE"
  157. label.delete(array.get(TP_LABELS,i))
  158. array.remove(TP_LABELS,i)
  159. //STOP LOSS LINES
  160. line.delete(array.get(SL_LINES,i))
  161. array.remove(SL_LINES,i)
  162. //TAKE PROFIT LINES
  163. if TAKE_PROFIT_PLACEMENT != "NONE"
  164. line.delete(array.get(TP_LINES,i))
  165. array.remove(TP_LINES,i)
  166. //ENTRY LINES
  167. line.delete(array.get(ENTRY_LINES,i))
  168. array.remove(ENTRY_LINES,i)
  169. //ENTRY LINES
  170. label.delete(array.get(ENTRY_LABELS,i))
  171. array.remove(ENTRY_LABELS,i)
  172. //VERTICAL LINES
  173. line.delete(array.get(VERTICAL_LINES,i))
  174. array.remove(VERTICAL_LINES,i)
  175.  
  176. i := i + 1
  177.  
  178. //VISUAL OPTIONS COUNTER
  179. VISUAL_OPTIONS_COUNTER = 0
  180. if SHOW_CAPITAL
  181. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  182. if SHOW_RISK
  183. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  184. if SHOW_PROFIT
  185. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  186. if SHOW_RR
  187. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  188. if SHOW_SIDE
  189. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  190. if SHOW_FEE
  191. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  192. if SHOW_LEVERAGE
  193. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  194. if SHOW_POSITION_SIZE
  195. VISUAL_OPTIONS_COUNTER := VISUAL_OPTIONS_COUNTER + 1
  196.  
  197. //TAB CREATION AND PLOTTING
  198. if SHOW_TAB and barstate.islast
  199. //CREATE TAB WITH DATA
  200. var TABLE = table.new(position.top_right, 2, VISUAL_OPTIONS_COUNTER)
  201. i := 0
  202.  
  203. //VISUAL OPTIONS
  204. if SHOW_CAPITAL
  205. table.cell(TABLE, 0, i, "CAPITAL", bgcolor = #aaaaaa, width = 7, height = 7)
  206. table.cell(TABLE, 1, i, str.tostring(CAPITAL) + "$", bgcolor = #aaaaaa, width = 7, height = 7)
  207. i := i + 1
  208. if SHOW_RISK
  209. table.cell(TABLE, 0, i, "RISK", bgcolor = #aaaaaa, width = 7, height = 7)
  210. table.cell(TABLE, 1, i, str.tostring(RISK_PERCENT) + "%", bgcolor = #aaaaaa, width = 7, height = 7)
  211. i := i + 1
  212. if SHOW_PROFIT
  213. table.cell(TABLE, 0, i, "PROFIT", bgcolor = #aaaaaa, width = 7, height = 7)
  214. table.cell(TABLE, 1, i, str.tostring(math.floor(RR*RISK_PERCENT*100)/100) + "%", bgcolor = #aaaaaa, width = 7, height = 7)
  215. i := i + 1
  216. if SHOW_RR
  217. table.cell(TABLE, 0, i, "RR", bgcolor = #aaaaaa, width = 7, height = 7)
  218. table.cell(TABLE, 1, i, str.tostring(RR), bgcolor = #aaaaaa, width = 7, height = 7)
  219. i := i + 1
  220. if SHOW_SIDE
  221. table.cell(TABLE, 0, i, "SIDE", bgcolor = #aaaaaa, width = 7, height = 7)
  222. table.cell(TABLE, 1, i, str.tostring(SIDE), bgcolor = #aaaaaa, width = 7, height = 7)
  223. i := i + 1
  224. if SHOW_FEE
  225. table.cell(TABLE, 0, i, "FEE", bgcolor = #aaaaaa, width = 7, height = 7)
  226. table.cell(TABLE, 1, i, str.tostring(TOTAL_FEE) + "$", bgcolor = #aaaaaa, width = 7, height = 7)
  227. i := i + 1
  228. if SHOW_LEVERAGE
  229. table.cell(TABLE, 0, i, "LEVERAGE", bgcolor = #aaaaaa, width = 7, height = 7)
  230. table.cell(TABLE, 1, i, str.tostring(LEVERAGE) + "x", bgcolor = #aaaaaa, width = 7, height = 7)
  231. i := i + 1
  232. if SHOW_POSITION_SIZE
  233. table.cell(TABLE, 0, i, "QUANTITY", bgcolor = #aaaaaa, width = 7, height = 7)
  234. table.cell(TABLE, 1, i, str.tostring(QUANTITY), bgcolor = #aaaaaa, width = 7, height = 7)
  235. i := i + 1
  236.  
  237. if barstate.islast
  238. //SHOW PRICE USED AS REFERENCE FOR THE STOP LOSS AND TAKE PROFIT
  239. if SIDE == "BUY"
  240. //STOP LOSS
  241. 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))
  242. //TAKE TAKE PROFIT
  243. if TAKE_PROFIT_PLACEMENT != "NONE"
  244. 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))
  245. if SIDE == "SELL"
  246. //STOP LOSS
  247. 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))
  248. //TAKE TAKE PROFIT
  249. if TAKE_PROFIT_PLACEMENT != "NONE"
  250. 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))
  251.  
  252. //ENTRY LEVEL
  253. 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))
  254.  
  255. //PLOT HORINZONTAL LINES
  256. //PLOT STOP LOSS
  257. array.push(SL_LINES,line.new(bar_index[INDEX],STOP_LOSS,bar_index+500,STOP_LOSS,color=color.red))
  258. //PLOT TAKE PROFIT
  259. if TAKE_PROFIT_PLACEMENT != "NONE"
  260. array.push(TP_LINES,line.new(bar_index[INDEX],TAKE_PROFIT,bar_index+500,TAKE_PROFIT,color=color.green))
  261. //PLOT ENTRY LINE
  262. array.push(ENTRY_LINES,line.new(bar_index[INDEX],ENTRY_PRICE,bar_index+500,ENTRY_PRICE,color=color.blue))
  263.  
  264. //PLOT VERTICAL LINE TO SITUATE CALCULATION POINT
  265. 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