Maurizio-Ciullo

Bot Reversal-Band ETH/PERP FTX 4H LONG E SHORT

Jan 13th, 2022 (edited)
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
  2.  
  3. //Il trading system completo - Bot Reversal Band (Strategia Reversal) - parte 1
  4. // (Exchange= FTX) (Sottostante ETH-PERP) (Timeframe= 4H) (Direzione= LONG E SHORT) (Swing Posizione= SI) (Esclusione Ore=NO) (Esclusione Giorni=NO) (Esclusione Mesi=APRILE/AGOSTO)
  5. // (Take Profit Long/Short= Market Close Sopra/Sotto Bande) (Take Profit Limit Long/Short= +12% Tradingview-Hub) (Stop Loss Limit Long= -9% Tradingview-Hub) (Stop Loss Limit Short= -7% Tradingview-Hub) (Stop Emergenza= No)
  6. //@version=4
  7.  
  8. strategy(title="Bot Reversal-Band ETH/PERP FTX 4H LONG E SHORT", overlay=true,
  9.      pyramiding=0, initial_capital=150,
  10.      commission_type=strategy.commission.percent,
  11.      commission_value=0.1, slippage=3,
  12.      default_qty_type=strategy.percent_of_equity,
  13.      default_qty_value=27.5)
  14.  
  15.  
  16. input_stop_loss_long = input(title="stop_loss_long", type=input.float, defval=9, minval=0, maxval=100, step=0.1, group="Stop&Target")
  17. input_stop_loss_short = input(title="stop_loss_short", type=input.float, defval=7, minval=0, maxval=100, step=0.1, group="Stop&Target")
  18. input_target_long = input(title="target_long", type=input.float, defval=12, minval=0, maxval=100, step=0.1, group="Stop&Target")
  19. input_target_short = input(title="target_short", type=input.float, defval=12, minval=0, maxval=100, step=0.1, group="Stop&Target")
  20. input_risk = input(title="Percentuale rischio", type=input.float, defval=27.5, minval=0, maxval=100, step = 0.01, group="Stop&Target")
  21. input_sma_long = input(title="Media BB Long", type=input.integer, defval=30, minval=0, maxval=50, group="Bande")
  22. input_sma_short = input(title="Media BB Short", type=input.integer, defval=24, minval=0, maxval=50, group="Bande")
  23. deviazione_long = input(title="Deviazione Long", type=input.float, defval=1.5, step=0.1, group="Bande")
  24. deviazione_short = input(title="Deviazione Short", type=input.float, defval=1.5, step=0.1, group="Bande")
  25. input_ema_long = input(title="Media Long", type=input.integer, defval=55, minval=0, maxval=500, group="Medie")
  26. input_ema_short = input(title="Media Short", type=input.integer, defval=55, minval=0, maxval=500, group="Medie")
  27. lunghezza_adx_long = input(title="Lunghezza ADX Long", type=input.integer, defval=10, group="ADX")
  28. lunghezza_adx_short = input(title="Lunghezza ADX Short", type=input.integer, defval=9, group="ADX")
  29. differenziale_adx_long = input(title="Differenziale ADX Long", type=input.integer, defval=35, group="ADX")
  30. differenziale_adx_short = input(title="Differenziale ADX Short", type=input.integer, defval=31, group="ADX")
  31. only_Long = input(title="Solo long trade", type=input.bool, defval=false, inline="1", group="Direzione")
  32. only_Short = input(title="Solo short trade", type=input.bool, defval=false, inline="1", group="Direzione")
  33.  
  34.  
  35. // Calcolo del range del backtest
  36.  
  37. startDate = input(title="Start Date", type=input.integer,
  38.      defval=17, minval=1, maxval=31, group="Periodo")
  39. startMonth = input(title="Start Month", type=input.integer,
  40.      defval=08, minval=1, maxval=12, group="Periodo")
  41. startYear = input(title="Start Year", type=input.integer,
  42.      defval=2017, minval=1800, maxval=2150, group="Periodo")
  43.  
  44. endDate = input(title="End Date", type=input.integer,
  45.      defval=01, minval=1, maxval=31, group="Periodo")
  46. endMonth = input(title="End Month", type=input.integer,
  47.      defval=01, minval=1, maxval=12, group="Periodo")
  48. endYear = input(title="End Year", type=input.integer,
  49.      defval=2121, minval=1800, maxval=2100, group="Periodo")
  50.  
  51.  
  52. inDateRange = (time >= timestamp(syminfo.timezone, startYear,
  53.          startMonth, startDate, 0, 0)) and
  54.      (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))
  55.  
  56.  
  57. ////Calcolo degli indicatori
  58.  
  59. // Medie Mobili
  60.  
  61. ema_long  = ema(close, input_ema_long)
  62. ema_short = ema(close,input_ema_short)
  63.  
  64. //// Bollinger Bands
  65.  
  66. //  Bollinger Bands Long
  67.  
  68. middle_Band_long   = sma(close, input_sma_long)
  69. deviazione_st_long = deviazione_long * stdev(close, input_sma_long)
  70. UpperBand_long     = middle_Band_long + deviazione_st_long
  71. LowerBand_long     = middle_Band_long - deviazione_st_long
  72.  
  73. // Bollinger Bands Short
  74.  
  75. middle_Band_short   = sma(close, input_sma_short)
  76. deviazione_st_short = deviazione_short * stdev(close, input_sma_short)
  77. UpperBand_short     = middle_Band_short + deviazione_st_short
  78. LowerBand_short     = middle_Band_short - deviazione_st_short
  79.  
  80. //// ADX
  81.  
  82. // ADX Long
  83.  
  84. [di_pos_long, di_neg_long, adx_long] = dmi(lunghezza_adx_long, lunghezza_adx_long)
  85.  
  86. //ADX Short
  87.  
  88. [di_pos_short, di_neg_short, adx_short] = dmi(lunghezza_adx_short, lunghezza_adx_short)
  89.  
  90.  
  91. // Money Menagment e stop loss
  92.  
  93. size = ((strategy.equity * input_risk) / 100)
  94. nr_contratti = size / close
  95. stop_loss_long =round(((size /syminfo.mintick) / 100) * input_stop_loss_long)/nr_contratti
  96. stop_loss_short =round(((size /syminfo.mintick) / 100) * input_stop_loss_short)/nr_contratti
  97. target_long =round(((size /syminfo.mintick) / 100) * input_target_long)/nr_contratti
  98. target_short =round(((size /syminfo.mintick) / 100) * input_target_short)/nr_contratti
  99.  
  100. // Plot Medie
  101.  
  102. plot(ema_long, color=color.blue, title="Ema Long", linewidth = 2)
  103. plot(ema_short, color=color.red, title="Ema Short", linewidth = 2)
  104.  
  105. // Plot Bande
  106.  
  107. plot(middle_Band_long, color=color.green, title="B_middle Band")
  108. plot(UpperBand_long, color=color.green, title="UpperBandLong")
  109. plot(LowerBand_long, color=color.green, title="LowerBandLong")
  110.  
  111. plot(middle_Band_short, color=color.yellow, title="B_middle Band")
  112. plot(UpperBand_short, color=color.yellow, title="UpperBandShort")
  113. plot(LowerBand_short, color=color.yellow, title="LowerBandShort")
  114.  
  115. // Plot ADX
  116.  
  117. plot(adx_long, color=color.blue, title="adx long")
  118. plot(adx_short, color=color.red, title="adx short")
  119.  
  120. plot(UpperBand_long, color=color.green, style=plot.style_circles, linewidth=3, title="Market_Tp_Long")
  121. plot(LowerBand_short, color=color.red, style=plot.style_circles, linewidth=3, title="Market_Tp_Short")
  122.  
  123. plot(strategy.position_size != 0 ? strategy.position_avg_price : na , color=strategy.position_size > 0 ? color.blue : strategy.position_size < 0 ? color.red : na, style=plot.style_linebr, title="entry_price") // stampa l'entry price in rosso se short in blu se long
  124. plot(strategy.position_size > 0 ?  strategy.position_avg_price + target_long * 0.01 * 10: strategy.position_size < 0 ? strategy.position_avg_price - target_short * 0.01 * 10: na, color=color.green, style=plot.style_cross, linewidth=2, title="tk_limit")
  125. plot(strategy.position_size > 0 ?  strategy.position_avg_price - stop_loss_long * 0.01 * 10: strategy.position_size < 0 ? strategy.position_avg_price + stop_loss_short * 0.01 * 10 : na, color=color.red, style=plot.style_cross, linewidth=2, title="sl_limit")
  126.  
  127. bgcolor(strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na) // sfondo verde quando siamo long, sfondo rosso quando siamo short, no sfondo quando non siamo in posizione
  128.  
  129.  
  130. //Entry/Exit Conditions
  131.  
  132.  
  133. //Condizione Entry Long
  134. condEntryLong = crossover(close, LowerBand_long) and close < ema_long and adx_long < differenziale_adx_long and month!=4 and month!=8 and not only_Short and inDateRange
  135. //Condizione Uscita Long
  136. condExitLong = crossover(close, UpperBand_long)
  137.  
  138. // Condizione Entry Short: Crossunder di due medie con il prezzo di chiusura che Γ¨ comunque sotto una terza media con differenziale delle medie
  139. condEntryShort = crossunder(close, UpperBand_short) and close > ema_short and adx_short < differenziale_adx_short and month!=4 and month!=8 and not only_Long and inDateRange
  140. // Condizione Exit Short
  141. condExitShort = crossunder(close, LowerBand_short)
  142.  
  143.  
  144.  
  145. //Entry/Exit Orders
  146.  
  147.  
  148. //strategy.entry("long", true, when = condEntryLong)
  149. //strategy.close("long", when=condExitLong)
  150. //strategy.entry("short", false, when = condEntryShort)
  151. //strategy.close("short", when=condExitShort)
  152.  
  153. if (condEntryLong)
  154.     strategy.entry("long", true)
  155.     strategy.exit("Uscita Long", from_entry = "long", loss = stop_loss_long, profit = target_long)
  156.    
  157. if (condExitLong)    
  158.     strategy.close(id="long")
  159.    
  160. if (condEntryShort)
  161.     strategy.entry("short", false)
  162.     strategy.exit("Uscita Short", from_entry = "short", loss = stop_loss_short, profit = target_short)
  163.    
  164. if (condExitShort)    
  165.     strategy.close(id="short")
  166.  
  167. // Tabella risultati mensili by QuantNomad (TSC Boilerplate) Per visualizzare andare nelle impostazioni proprietΓ  e spuntare ad ogni tick
  168.  
  169. new_month = month(time) != month(time[1])
  170. new_year  = year(time)  != year(time[1])
  171.  
  172. eq = strategy.equity
  173.  
  174. bar_pnl = eq / eq[1] - 1
  175.  
  176. cur_month_pnl = 0.0
  177. cur_year_pnl  = 0.0
  178.  
  179. // Current Monthly P&L
  180. cur_month_pnl := new_month ? 0.0 :
  181.                  (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1
  182.  
  183. // Current Yearly P&L
  184. cur_year_pnl := new_year ? 0.0 :
  185.                  (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
  186.  
  187. // Arrays to store Yearly and Monthly P&Ls
  188. var month_pnl  = array.new_float(0)
  189. var month_time = array.new_int(0)
  190.  
  191. var year_pnl  = array.new_float(0)
  192. var year_time = array.new_int(0)
  193.  
  194. last_computed = false
  195.  
  196. if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
  197.     if (last_computed[1])
  198.         array.pop(month_pnl)
  199.         array.pop(month_time)
  200.        
  201.     array.push(month_pnl , cur_month_pnl[1])
  202.     array.push(month_time, time[1])
  203.  
  204. if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
  205.     if (last_computed[1])
  206.         array.pop(year_pnl)
  207.         array.pop(year_time)
  208.        
  209.     array.push(year_pnl , cur_year_pnl[1])
  210.     array.push(year_time, time[1])
  211.  
  212. last_computed := barstate.islast ? true : nz(last_computed[1])
  213.  
  214. // Monthly P&L Table    
  215. var monthly_table = table(na)
  216. prec      = input(2, title = "Return Precision")
  217.  
  218. if (barstate.islast)
  219.     monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, bgcolor=#0F0F0F,border_width=1,border_color=#000000)
  220.  
  221.     table.cell(monthly_table, 0,  0, "",     text_color=#D3D3D3, bgcolor=#0F0F0F)
  222.     table.cell(monthly_table, 1,  0, "Jan",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  223.     table.cell(monthly_table, 2,  0, "Feb",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  224.     table.cell(monthly_table, 3,  0, "Mar",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  225.     table.cell(monthly_table, 4,  0, "Apr",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  226.     table.cell(monthly_table, 5,  0, "May",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  227.     table.cell(monthly_table, 6,  0, "Jun",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  228.     table.cell(monthly_table, 7,  0, "Jul",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  229.     table.cell(monthly_table, 8,  0, "Aug",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  230.     table.cell(monthly_table, 9,  0, "Sep",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  231.     table.cell(monthly_table, 10, 0, "Oct",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  232.     table.cell(monthly_table, 11, 0, "Nov",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  233.     table.cell(monthly_table, 12, 0, "Dec",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  234.     table.cell(monthly_table, 13, 0, "Year", text_color=#D3D3D3, bgcolor=#0F0F0F)
  235.  
  236.  
  237.     for yi = 0 to array.size(year_pnl) - 1
  238.         table.cell(monthly_table, 0,  yi + 1, tostring(year(array.get(year_time, yi))), text_color=#D3D3D3, bgcolor=#0F0F0F)
  239.        
  240.         y_color = array.get(year_pnl, yi) > 0 ? color.lime : color.red
  241.         table.cell(monthly_table, 13, yi + 1, tostring(round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color)
  242.        
  243.     for mi = 0 to array.size(month_time) - 1
  244.         m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
  245.         m_col   = month(array.get(month_time, mi))
  246.         m_color = array.get(month_pnl, mi) > 0 ? color.lime : color.red
  247.        
  248.         table.cell(monthly_table, m_col, m_row, tostring(round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)
Add Comment
Please, Sign In to add comment