Advertisement
Maurizio-Ciullo

Bot Smart-Reversal-Band-Maurizio ETH/PERP Ver-5 FTX 1H LONG E SHORT

May 7th, 2022
220
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 Smart Reversal Band Maurizio Ver-5 (Strategia Reversal) - parte 1
  4. // (Exchange= FTX) (Sottostante ETH-PERP) (Timeframe= 1H) (Direzione= LONG E SHORT) (Swing Posizione= SI) (Esclusione Ore= NO) (Esclusione Giorni= NO) (Esclusione Mesi= NO)
  5. // (Take Profit Long/Short= Market Close Sopra/Sotto Bande) (Take Profit Limit Long= +9% Tradingview-Hub) (Take Profit Limit Short= +10% Tradingview-Hub)
  6. // (Stop Loss Limit Long= -10% Tradingview-Hub) (Stop Loss Limit Short= -3% Tradingview-Hub) (Trailing Stop=NO) (Stop Emergenza: NO)
  7. // (Rischio Operazione 2% Perdita Media)
  8. // (In Sample Dal=01/02/2021 Al 01/08/2021) (Out Of Sample Dal=01/08/2021 Al 19/04/2022)
  9. // (Progettatta Il=21/04/2022)
  10.  
  11.  
  12. //@version=5
  13. //1. Strategia
  14. strategy(title='Bot Smart-Reversal-Band-Maurizio ETH/PERP Ver-5 FTX 1H LONG E SHORT', overlay=true,
  15.      pyramiding=0,
  16.      initial_capital=150,
  17.      commission_type=strategy.commission.percent,
  18.      commission_value=0.1,
  19.      slippage=3,
  20.      default_qty_type=strategy.percent_of_equity,
  21.      default_qty_value=16.2)
  22.  
  23.  
  24. // Input
  25. input_stop_loss_long = input.float(title='stop_loss_long', defval=10, minval=0, maxval=100, step=0.1, group='Stop&Target')
  26. input_stop_loss_short = input.float(title='stop_loss_short', defval=3, minval=0, maxval=100, step=0.1, group='Stop&Target')
  27. input_target_long = input.float(title='target_long', defval=9, minval=0, maxval=100, step=0.1, group='Stop&Target')
  28. input_target_short = input.float(title='target_short', defval=10, minval=0, maxval=100, step=0.1, group='Stop&Target')
  29. input_sma_long = input.int(title='Media BB Long', defval=15, minval=0, maxval=50, group='Bande')
  30. input_sma_short = input.int(title='Media BB Short', defval=20, minval=0, maxval=50, group='Bande')
  31. input_ema_long = input.int(title='Media Ema Long', defval=75, minval=1, maxval=100, group='Medie')
  32. input_ema_short = input.int(title='Media Ema Short', defval=160, minval=1, maxval=1000, group='Medie')
  33. deviazione_long = input.float(title='Deviazione Long', defval=1.3, step=0.1, group='Bande')
  34. deviazione_short = input.float(title='Deviazione Short', defval=1.7, step=0.1, group='Bande')
  35. lunghezza_adx_long = input.int(title='Lunghezza ADX Long', defval=11, group='Adx')
  36. lunghezza_adx_short = input.int(title='Lunghezza ADX Short', defval=10, group='Adx')
  37. lunghezza_rsi_long = input.int(title='Rsi Long', defval=13, minval=1, maxval=100, group='Rsi')
  38. lunghezza_rsi_short = input.int(title='Rsi Short', defval=7, minval=1, maxval=100, group='Rsi')
  39. differenziale_rsi_long = input.int(title='Differenziale Rsi Long', defval=80, minval=1, maxval=100, group='Rsi')
  40. differenziale_rsi_short = input.int(title='Differenziale Rsi Short', defval=45, minval=1, maxval=100, group='Rsi')
  41. differenziale_adx_long_alto = input.int(title='Differenziale Adx Long Alto', defval=65, minval=1, maxval=100, group='Adx')
  42. differenziale_adx_long_basso = input.int(title='Differenziale Adx Long Basso', defval=26, minval=1, maxval=100,group='Adx')
  43. differenziale_adx_short_alto = input.int(title='Differenziale Adx Short Alto', defval=35, minval=1, maxval=100, group='Adx')
  44. differenziale_adx_short_basso = input.int(title='Differenziale Adx Short Basso', defval=20, minval=1, maxval=100,group='Adx')
  45. only_Long = input.bool(title='Solo long trade', defval=false, inline='1', group='Direzione')
  46. only_Short = input.bool(title='Solo short trade', defval=false, inline='1', group='Direzione')
  47. input_risk = input.float(title='Percentuale rischio', defval=19.1, minval=1, maxval=100, step=0.01)
  48.  
  49.  
  50. // Calcolo del range del backtest
  51. startDate = input.int(title='Start Date', defval=17, minval=1, maxval=31, group='Periodo')
  52. startMonth = input.int(title='Start Month', defval=08, minval=1, maxval=12, group='Periodo')
  53. startYear = input.int(title='Start Year', defval=2017, minval=1800, maxval=2100, group='Periodo')
  54.  
  55. endDate = input.int(title='End Date', defval=01, minval=1, maxval=31, group='Periodo')
  56. endMonth = input.int(title='End Month', defval=01, minval=1, maxval=12, group='Periodo')
  57. endYear = input.int(title='End Year', defval=2121, minval=1800, maxval=2150, group='Periodo')
  58.  
  59.  
  60. inDateRange = time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0) and time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0)
  61.  
  62.  
  63. // Start Hour Range Trading Non Attivo /////////////////////
  64. //hourTrading = input(title='sessione valida di trading', defval='0600-2300:23456')
  65. //hourRangeTrading = time(timeframe.period, hourTrading)
  66.  
  67.  
  68. //Calcolo degli indicatori
  69.  
  70. // Medie Mobili
  71. ema_long = ta.ema(close, input_ema_long)
  72. ema_short = ta.ema(close, input_ema_short)
  73. plot(ema_long, color=color.new(color.blue, 0), title='Ema Long', linewidth=2)
  74. plot(ema_short, color=color.new(color.purple, 0), title='Ema Short', linewidth=2)
  75.  
  76.  
  77. //  Bollinger Bands Long
  78. middle_Band_long = ta.sma(close, input_sma_long)
  79. deviazione_st_long = deviazione_long * ta.stdev(close, input_sma_long)
  80. UpperBand_long = middle_Band_long + deviazione_st_long
  81. LowerBand_long = middle_Band_long - deviazione_st_long
  82. plot(middle_Band_long, color=color.new(color.green, 0), title='B_middle Band', linewidth=2)
  83. plot(UpperBand_long, color=color.new(color.green, 0), title='UpperBandLong', linewidth=2)
  84. plot(LowerBand_long, color=color.new(color.green, 0), title='LowerBandLong', linewidth=2)
  85. plot(UpperBand_long, color=color.new(color.green, 0), style=plot.style_circles, title='Market_Tp_Long',linewidth=2)
  86. plot(LowerBand_long, color=color.new(color.green, 0), style=plot.style_circles, title='LowerBandLong', linewidth=2)
  87.  
  88.  
  89. // Bollinger Bands Short
  90. middle_Band_short = ta.sma(close, input_sma_short)
  91. deviazione_st_short = deviazione_short * ta.stdev(close, input_sma_short)
  92. UpperBand_short = middle_Band_short + deviazione_st_short
  93. LowerBand_short = middle_Band_short - deviazione_st_short
  94. plot(middle_Band_short, color=color.new(color.red, 0), title='B_middle Band', linewidth=2)
  95. plot(UpperBand_short, color=color.new(color.red, 0), title='UpperBandShort', linewidth=2)
  96. plot(LowerBand_short, color=color.new(color.red, 0), title='LowerBandShort',linewidth=2)
  97. plot(UpperBand_short, color=color.new(color.red, 0), style=plot.style_circles, title='UpperBandShort', linewidth=2)
  98. plot(LowerBand_short, color=color.new(color.red, 0), style=plot.style_circles, title='Market_Tp_Short', linewidth=2)
  99.  
  100.  
  101. // ADX Long
  102. [di_pos_long, di_neg_long, adx_long] = ta.dmi(lunghezza_adx_long, lunghezza_adx_long)
  103. plot(adx_long, color=color.new(color.blue, 0), title='adx long')
  104.  
  105. // ADX Short
  106. [di_pos_short, di_neg_short, adx_short] = ta.dmi(lunghezza_adx_short, lunghezza_adx_short)
  107. plot(adx_short, color=color.new(color.red, 0), title='adx short')
  108.  
  109.  
  110. // Rsi Long E Short
  111. rsi_long = ta.rsi(close, lunghezza_rsi_long)
  112. rsi_short = ta.rsi(close, lunghezza_rsi_short)
  113. plot(rsi_long, color=color.new(color.blue, 0), title='rsi_long')
  114. plot(rsi_short, color=color.new(color.blue, 0), title='rsi_short')
  115.  
  116. // Money Menagment e stop loss
  117.  
  118. // size = strategy.equity * input_risk / 100
  119. // nr_contratti = size / close
  120. // stop_loss_long = math.round(size / syminfo.mintick / 100 * input_stop_loss_long) / nr_contratti
  121. // stop_loss_short = math.round(size / syminfo.mintick / 100 * input_stop_loss_short) / nr_contratti
  122. // target_long = math.round(size / syminfo.mintick / 100 * input_target_long) / nr_contratti
  123. // target_short = math.round(size / syminfo.mintick / 100 * input_target_short) / nr_contratti
  124.  
  125.  
  126. //Variabili Stop Long e Short
  127. stop_loss_long_price = strategy.opentrades.entry_price(0) - (strategy.opentrades.entry_price(0) * input_stop_loss_long) / 100
  128. stop_loss_long = (strategy.opentrades.entry_price(0) - stop_loss_long_price) / syminfo.mintick
  129. take_profit_long_price = (strategy.opentrades.entry_price(0) + ((strategy.opentrades.entry_price(0) * input_target_long) / 100))
  130. take_profit_long = (take_profit_long_price - strategy.opentrades.entry_price(0)) / syminfo.mintick
  131.  
  132. //plot(stop_loss_long, title = "sl_long_ticks", color=color.purple)
  133.  
  134.  
  135. stop_loss_short_price = strategy.opentrades.entry_price(0) + (strategy.opentrades.entry_price(0) * input_stop_loss_short) / 100
  136. stop_loss_short = (stop_loss_short_price - strategy.opentrades.entry_price(0)) / syminfo.mintick
  137. take_profit_short_price = (strategy.opentrades.entry_price(0) - ((strategy.opentrades.entry_price(0) * input_target_short) / 100))
  138. take_profit_short =(strategy.opentrades.entry_price(0) - take_profit_short_price) / syminfo.mintick
  139.  
  140. //plot(stop_loss_short, title = "sl_short_ticks", color=color.purple)
  141.  
  142.  
  143. // 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
  144. // plot(strategy.position_size > 0 ? strategy.position_avg_price + take_profit_long * 0.01 * 10 : strategy.position_size < 0 ? strategy.position_avg_price - take_profit_short * 0.01 * 10 : na, color=color.new(color.green, 0), style=plot.style_cross, linewidth=2, title='tk_limit')
  145. // 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.new(color.red, 0), style=plot.style_cross, linewidth=2, title='sl_limit')
  146.  
  147.  
  148. plot(strategy.position_size != 0 ? strategy.opentrades.entry_price(0) : 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
  149. plot(strategy.position_size > 0 ?  take_profit_long_price : strategy.position_size < 0 ? take_profit_short_price: na, color=color.green, style=plot.style_cross, linewidth=2, title="tk_limit")
  150. plot(strategy.position_size > 0 ?  stop_loss_long_price : strategy.position_size < 0 ? stop_loss_short_price: na, color=color.red, style=plot.style_cross, linewidth=2, title="sl_limit")
  151.  
  152. bgcolor(strategy.position_size > 0 ? color.green : strategy.position_size < 0 ? color.red : na, transp=90) // sfondo verde quando siamo long, sfondo rosso quando siamo short, no sfondo quando non siamo in posizione
  153.  
  154.  
  155. // Plot No Trading Allowed giorni da 1 a 7 1 è Domenica. Mesi da 1 a 12 1 è Gennaio
  156.  
  157. // mesi_esclusi = month(time)
  158. // plotshape(mesi_esclusi[1] == 4 ? mesi_esclusi : na, color=color.new(color.yellow, 0), title='mesi_esclusi')
  159. // plotshape(mesi_esclusi[1] == 8 ? mesi_esclusi : na, color=color.new(color.yellow, 0), title='mesi_esclusi')
  160.  
  161.  
  162. //Condizione Entry Long. LowerBand_long in questo caso è della candela attuale
  163. condEntryLong = close[1] < open[1] and low[1] < LowerBand_long and close > LowerBand_long and close > ema_long and adx_long > differenziale_adx_long_basso and adx_long < differenziale_adx_long_alto and rsi_long < differenziale_rsi_long and not only_Short and inDateRange // and month != 4 and month != 8
  164.  
  165. //Condizione Uscita Long
  166. condExitLong = ta.crossover(close, UpperBand_long)
  167.  
  168.  
  169.  
  170. // Condizione Entry Short. UpperBand_short in questo caso è della candela attuale
  171. condEntryShort = close[1] > open[1] and high[1] > UpperBand_short and close < UpperBand_short and close < ema_short and adx_short > differenziale_adx_short_basso and adx_short < differenziale_adx_short_alto and rsi_short > differenziale_rsi_short and not only_Long and inDateRange // and month != 4 and month != 8
  172.                
  173.  
  174. // Condizione Exit Short
  175. condExitShort = ta.crossunder(close, LowerBand_short)
  176.  
  177.  
  178. buy_command = '{"pair":"ETH-PERP","unitsPercent":"16.2","unitsType":"percentBalance","exchange":"Ftx","apiKey":"FTX","token":"e6d67d6e-1a5f-4e53-a9fd-6276dfa2a34b","isBuy":true,"isMarket":true,"stopLossPercent":"-10","stopLossType":"percent","leverage":1,"marginType":"ISOLATED","targets":[{"idx":1,"amount":"100","takeProfitPercent":"9"}],"targetType":"percent","targetAmountInPercent":true,"closeCurrentPosition":true,"preventPyramiding":true,"cancelAllOrders":true,"subAccount":"Smart-Revers-Band-M-ETH-PERP-FTX-1H"}'
  179. sell_command = '{"pair":"ETH-PERP","unitsPercent":"16.2","unitsType":"percentBalance","exchange":"Ftx","apiKey":"FTX","token":"e6d67d6e-1a5f-4e53-a9fd-6276dfa2a34b","isSell":true,"isMarket":true,"stopLossPercent":"-3","stopLossType":"percent","leverage":1,"marginType":"ISOLATED","targets":[{"idx":1,"amount":"100","takeProfitPercent":"10"}],"targetType":"percent","targetAmountInPercent":true,"closeCurrentPosition":true,"preventPyramiding":true,"cancelAllOrders":true,"subAccount":"Smart-Revers-Band-M-ETH-PERP-FTX-1H"}'
  180. close_command = '{"pair":"ETH-PERP","unitsPercent":"16.2","exchange":"Ftx","apiKey":"FTX","token":"e6d67d6e-1a5f-4e53-a9fd-6276dfa2a34b","isClose":true,"subAccount":"Smart-Revers-Band-M-ETH-PERP-FTX-1H"}'
  181.  
  182.  
  183. //entrata e uscita Long (stop/limit x prezzo) (loss/profit x ticks)
  184. if condEntryLong // strategy.opentrades == 0
  185.     strategy.entry('operazioneLong', strategy.long, alert_message = "Open Long Position", comment = buy_command)
  186.    
  187. if strategy.opentrades ==1
  188.     strategy.exit('SL e TP', from_entry='operazioneLong', stop=stop_loss_long_price, limit=take_profit_long_price, alert_message = "Your Long SL-TP Has Been Triggered.", comment = close_command)
  189.  
  190. if condExitLong and strategy.opentrades == 1
  191.     strategy.close(id='operazioneLong', alert_message = "Close Long Position", comment = close_command)
  192.  
  193. //entrata e uscita Short    
  194. if condEntryShort //and strategy.opentrades == 0
  195.     strategy.entry('operazioneShort', strategy.short, alert_message = "Open Short position", comment = sell_command)
  196.  
  197. if strategy.opentrades ==1
  198.     strategy.exit('SL e TP', from_entry='operazioneShort', stop=stop_loss_short_price, limit=take_profit_short_price, alert_message = "Your Short SL-TP Has Been Triggered.", comment = close_command)
  199.  
  200. if condExitShort and strategy.opentrades == 1
  201.     strategy.close(id='operazioneShort', alert_message = "Close Short Position", comment = close_command)
  202.  
  203. // Nome Alert: Smart-Reversal-Band-Maurizio ETH/PERP Ver5 FTX-1H
  204. // Commento Alert: {{strategy.order.comment}}
  205.  
  206.  
  207. // ----------------- Inizio Tabella risultati mensili. Per visualizzare andare nelle impostazioni proprietà e spuntare ad ogni tick -----------------
  208.  
  209. // new_month = month(time) != month(time[1])
  210. // new_year  = year(time)  != year(time[1])
  211.  
  212. // eq = strategy.equity
  213.  
  214. // bar_pnl = eq / eq[1] - 1
  215.  
  216. // cur_month_pnl = 0.0
  217. // cur_year_pnl  = 0.0
  218.  
  219. // // Current Monthly P&L
  220. // cur_month_pnl := new_month ? 0.0 :
  221. //                  (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1
  222.  
  223. // // Current Yearly P&L
  224. // cur_year_pnl := new_year ? 0.0 :
  225. //                  (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1  
  226.  
  227. // // Arrays to store Yearly and Monthly P&Ls
  228. // var month_pnl  = array.new_float(0)
  229. // var month_time = array.new_int(0)
  230.  
  231. // var year_pnl  = array.new_float(0)
  232. // var year_time = array.new_int(0)
  233.  
  234. // last_computed = false
  235.  
  236. // if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
  237. //     if (last_computed[1])
  238. //         array.pop(month_pnl)
  239. //         array.pop(month_time)
  240.  
  241. //     array.push(month_pnl , cur_month_pnl[1])
  242. //     array.push(month_time, time[1])
  243.  
  244. // if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
  245. //     if (last_computed[1])
  246. //         array.pop(year_pnl)
  247. //         array.pop(year_time)
  248.  
  249. //     array.push(year_pnl , cur_year_pnl[1])
  250. //     array.push(year_time, time[1])
  251.  
  252. // last_computed := barstate.islast ? true : nz(last_computed[1])
  253.  
  254. // // Monthly P&L Table    
  255. // var monthly_table = table(na)
  256. // prec      = input(2, title = "Return Precision")
  257.  
  258. // if (barstate.islast)
  259. //     monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, bgcolor=#0F0F0F,border_width=1,border_color=#000000)
  260.  
  261. //     table.cell(monthly_table, 0,  0, "",     text_color=#D3D3D3, bgcolor=#0F0F0F)
  262. //     table.cell(monthly_table, 1,  0, "Jan",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  263. //     table.cell(monthly_table, 2,  0, "Feb",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  264. //     table.cell(monthly_table, 3,  0, "Mar",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  265. //     table.cell(monthly_table, 4,  0, "Apr",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  266. //     table.cell(monthly_table, 5,  0, "May",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  267. //     table.cell(monthly_table, 6,  0, "Jun",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  268. //     table.cell(monthly_table, 7,  0, "Jul",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  269. //     table.cell(monthly_table, 8,  0, "Aug",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  270. //     table.cell(monthly_table, 9,  0, "Sep",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  271. //     table.cell(monthly_table, 10, 0, "Oct",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  272. //     table.cell(monthly_table, 11, 0, "Nov",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  273. //     table.cell(monthly_table, 12, 0, "Dec",  text_color=#D3D3D3, bgcolor=#0F0F0F)
  274. //     table.cell(monthly_table, 13, 0, "Year", text_color=#D3D3D3, bgcolor=#0F0F0F)
  275.  
  276.  
  277. //     for yi = 0 to array.size(year_pnl) - 1
  278. //         table.cell(monthly_table, 0,  yi + 1, str.tostring(year(array.get(year_time, yi))), text_color=#D3D3D3, bgcolor=#0F0F0F)
  279.  
  280. //         y_color = array.get(year_pnl, yi) > 0 ? color.lime : color.red
  281. //         table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color)
  282.  
  283. //     for mi = 0 to array.size(month_time) - 1
  284. //         m_row   = year(array.get(month_time, mi))  - year(array.get(year_time, 0)) + 1
  285. //         m_col   = month(array.get(month_time, mi))
  286. //         m_color = array.get(month_pnl, mi) > 0 ? color.lime : color.red
  287.  
  288. //         table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)
  289.  
  290. // ----------------- Fine Tabella risultati mensili. Per visualizzare andare nelle impostazioni proprietà e spuntare ad ogni tick -----------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement