Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Bot Reversal Band Riot Period 1 10-03-2025 ETHUSDT.P BYBIT 4H LONG E SHORT //
- // Datafeed Cambiato / Periodi Backtest Cambiati / Inputs Cambiati / Skip Months Disattivato //
- // RIOTTIMIZZAZIONE PERIODICA 1 DELLA ORIGINALE REVERSAL BAND
- // IL DATAFEED COMPLETO = (18/08/2017 26/02/2025)
- // NUOVI DATI DI SVILUPPO DATAFEED ETH/USDT BINANCE + ETH/USDT.P BYBIT 4H STORICO INIZIALE BINANCE PER POI PROSEGUIRE CON BYBIT
- // (Sviluppo Dati Exchange = BINANCE + BYBIT) (BINANCE Dal=18/08/2017 Al 21/10/2020) (BYBIT Dal=21/10/2020 Al 26/02/2025)
- // SU TRADINGVIEW ORARIO BORSA GMT
- // BARSBACK: 60
- // NUOVE DATE IN SAMPLE E OUT OF SAMPLE
- //Il data feed completo: 18/08/2017 26/02/2025
- //In Sample: Inizio 18/08/2017 Fine 18/09/2023
- //Out Of Sample: Inizio 18/09/2023 Fine 26/02/2025
- //Il trading system completo - Bot Reversal Band Riot Period 1 10-03-2025 ETHUSDT.P BYBIT 4H LONG E SHORT
- // (Exchange= BYBIT) (Sottostante ETH-USDT.P) (Timeframe= 4H) (Direzione= LONG E SHORT) (Swing Posizione= SI) (Esclusione Ore=NO) (Esclusione Giorni=NO) (Esclusione Mesi=NO)
- // (Take Profit Long/Short= Market Close Sopra/Sotto Bande) (Take Profit Limit Long= +12% Tradingview-Hub) (Take Profit Limit Short= +6,7 % Tradingview-Hub
- // (Stop Loss Limit Long= -10% Tradingview-Hub) (Stop Loss Limit Short= -7.1% Tradingview-Hub) (Trailing Stop=NO) (Stop Emergenza: NO)
- // (Max DD Concesso = 15% Media Max Drawdown 2°nda Deviazione Standard Simulazione Montecalo Python
- // (Money Management = 25% Del Capitale Tradestation)
- // (Money Management = 18% Del Capitale Tradingview) Preso Dal 15% Media Max Drawdown 2°nda Deviazione Standard Simulazione Montecarlo Python
- // (Progettatta Il=07/07/23)
- // (In Sample Dal=17/08/2017 18/09/2023) (Out Of Sample Dal18/09/2023 Al 26-02-2025)
- // (Progettatta Il=26/02/2025)
- // ATTENZIONE, ALCUNE POSIZIONI SONO DIFFERENTI DA TRADINGVIEW PER VIA DELLE CANDELE INIZIALI CHE SONO DI BINANCE CHE POTREBBERO AVERE VALORI LEGGERENTE DIVERSI.
- // ATTENZIONE, ALCUNE VOLTE, MOLTO RARAMENTE LE MEDIE POTREBBERO DIFFERIRE SEMPRE PER VIDE DELLE CANDELE INIZIALI CHE SONO DI BINANCE CHE POTREBBERO AVERE VALORI LEGGERENTE DIVERSI.
- // ATTENZIONE, I VALORI DELL'ADX A VOLTE POSSONO ESSERE DIFFERENTI PER VIA DELLE CANDELE INIZIALI CHE SONO DI BINANCE PER POI RIASSESTARSI DI NUOVO.
- //@version=5
- //1. Strategia
- strategy(title='Bot Reversal-Band-Riot-P1 ETH/USDT.P BYBIT 4H LONG E SHORT', overlay=true,
- pyramiding=0,
- initial_capital=1000,
- commission_type=strategy.commission.percent,
- commission_value=0.1,
- slippage=3,
- default_qty_type=strategy.percent_of_equity,
- default_qty_value=18)
- // Input
- input_stop_loss_long = input.float(title='stop_loss_long', defval=10, minval=0, maxval=100, step=0.1, group='Stop&Target')
- input_stop_loss_short = input.float(title='stop_loss_short', defval=7.1, minval=0, maxval=100, step=0.1, group='Stop&Target')
- input_target_long = input.float(title='target_long', defval=12, minval=0, maxval=100, step=0.1, group='Stop&Target')
- input_target_short = input.float(title='target_short', defval=6.7, minval=0, maxval=100, step=0.1, group='Stop&Target')
- input_sma_long = input.int(title='Media BB Long', defval=31, minval=0, maxval=50, group='Bande')
- input_sma_short = input.int(title='Media BB Short', defval=48, minval=0, maxval=50, group='Bande')
- deviazione_long = input.float(title='Deviazione Long', defval=1.7, step=0.1, group='Bande')
- deviazione_short = input.float(title='Deviazione Short', defval=1.3, step=0.1, group='Bande')
- input_ema_long = input.int(title='Media Long', defval=52, minval=0, maxval=500, group='Medie')
- input_ema_short = input.int(title='Media Short', defval=42, minval=0, maxval=500, group='Medie')
- lunghezza_adx_long = input.int(title='Lunghezza ADX Long', defval=6, group='ADX')
- lunghezza_adx_short = input.int(title='Lunghezza ADX Short', defval=10, group='ADX')
- differenziale_adx_long = input.int(title='Differenziale ADX Long', defval=60, group='ADX')
- differenziale_adx_short = input.int(title='Differenziale ADX Short', defval=22, group='ADX')
- only_Long = input.bool(title='Solo long trade', defval=false, inline='1', group='Direzione')
- only_Short = input.bool(title='Solo short trade', defval=false, inline='1', group='Direzione')
- input_risk = input.float(title='Percentuale rischio', defval=19.1, minval=0, maxval=100, step=0.01)
- // Calcolo del range del backtest
- startDate = input.int(title='Start Date', defval=17, minval=1, maxval=31, group='Periodo')
- startMonth = input.int(title='Start Month', defval=08, minval=1, maxval=12, group='Periodo')
- startYear = input.int(title='Start Year', defval=2000, minval=1800, maxval=2100, group='Periodo')
- endDate = input.int(title='End Date', defval=01, minval=1, maxval=31, group='Periodo')
- endMonth = input.int(title='End Month', defval=01, minval=1, maxval=12, group='Periodo')
- endYear = input.int(title='End Year', defval=2121, minval=1800, maxval=2150, group='Periodo')
- inDateRange = time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0) and time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0)
- // Start Hour Range Trading Non Attivo /////////////////////
- //hourTrading = input(title='sessione valida di trading', defval='0600-2300:23456')
- //hourRangeTrading = time(timeframe.period, hourTrading)
- //Calcolo degli indicatori
- // Medie Mobili
- ema_long = ta.ema(close, input_ema_long)
- ema_short = ta.ema(close, input_ema_short)
- plot(ema_long, color=color.new(color.green, 0), title='Ema Long', linewidth=1)
- plot(ema_short, color=color.new(color.red, 0), title='Ema Short', linewidth=1)
- // Bollinger Bands Long
- middle_Band_long = ta.sma(close, input_sma_long)
- deviazione_st_long = deviazione_long * ta.stdev(close, input_sma_long)
- UpperBand_long = middle_Band_long + deviazione_st_long
- LowerBand_long = middle_Band_long - deviazione_st_long
- plot(middle_Band_long, color=color.new(color.green, 0), title='B_middle_Band_Long', linewidth=2)
- plot(UpperBand_long, color=color.new(color.green, 0), style=plot.style_circles, linewidth=3, title='UpperBandLong')
- plot(LowerBand_long, color=color.new(color.green, 0), style=plot.style_circles, linewidth=3, title='LowerBandLong')
- // Bollinger Bands Short
- middle_Band_short = ta.sma(close, input_sma_short)
- deviazione_st_short = deviazione_short * ta.stdev(close, input_sma_short)
- UpperBand_short = middle_Band_short + deviazione_st_short
- LowerBand_short = middle_Band_short - deviazione_st_short
- plot(middle_Band_short, color=color.new(color.red, 0), title='B_middle_Band_Short', linewidth=2)
- plot(UpperBand_short, color=color.new(color.red, 0), style=plot.style_circles, linewidth=3, title='UpperBandShort')
- plot(LowerBand_short, color=color.new(color.red, 0), style=plot.style_circles, linewidth=3, title='LowerBandShort')
- // ADX Long
- [di_pos_long, di_neg_long, adx_long] = ta.dmi(lunghezza_adx_long, lunghezza_adx_long)
- plot(adx_long, color=color.new(color.blue, 0), title='adx long')
- //ADX Short
- [di_pos_short, di_neg_short, adx_short] = ta.dmi(lunghezza_adx_short, lunghezza_adx_short)
- plot(adx_short, color=color.new(color.red, 0), title='adx short')
- // Money Menagment e stop loss
- // size = strategy.equity * input_risk / 100
- // nr_contratti = size / close
- // stop_loss_long = math.round(size / syminfo.mintick / 100 * input_stop_loss_long) / nr_contratti
- // stop_loss_short = math.round(size / syminfo.mintick / 100 * input_stop_loss_short) / nr_contratti
- // target_long = math.round(size / syminfo.mintick / 100 * input_target_long) / nr_contratti
- // target_short = math.round(size / syminfo.mintick / 100 * input_target_short) / nr_contratti
- //Variabili Stop Long e Short
- stop_loss_long_price = strategy.opentrades.entry_price(0) - (strategy.opentrades.entry_price(0) * input_stop_loss_long) / 100
- stop_loss_long = (strategy.opentrades.entry_price(0) - stop_loss_long_price) / syminfo.mintick
- take_profit_long_price = (strategy.opentrades.entry_price(0) + ((strategy.opentrades.entry_price(0) * input_target_long) / 100))
- take_profit_long = (take_profit_long_price - strategy.opentrades.entry_price(0)) / syminfo.mintick
- //plot(stop_loss_long, title = "sl_long_ticks", color=color.purple)
- stop_loss_short_price = strategy.opentrades.entry_price(0) + (strategy.opentrades.entry_price(0) * input_stop_loss_short) / 100
- stop_loss_short = (stop_loss_short_price - strategy.opentrades.entry_price(0)) / syminfo.mintick
- take_profit_short_price = (strategy.opentrades.entry_price(0) - ((strategy.opentrades.entry_price(0) * input_target_short) / 100))
- take_profit_short =(strategy.opentrades.entry_price(0) - take_profit_short_price) / syminfo.mintick
- //plot(stop_loss_short, title = "sl_short_ticks", color=color.purple)
- // 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
- // 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')
- // 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')
- 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
- 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")
- 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")
- 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
- // Plot No Trading Allowed giorni da 1 a 7 1 è Domenica. Mesi da 1 a 12 1 è Gennaio
- //mesi_esclusi = month(time)
- //plotshape(mesi_esclusi[1] == 4 ? mesi_esclusi : na, color=color.new(color.yellow, 0), title='mesi_esclusi')
- //plotshape(mesi_esclusi[1] == 8 ? mesi_esclusi : na, color=color.new(color.yellow, 0), title='mesi_esclusi')
- //Condizione Entry Long
- condEntryLong = ta.crossover(close, LowerBand_long) and close < ema_long and adx_long < differenziale_adx_long and not only_Short and inDateRange // and month != 4 and month != 8
- //Condizione Uscita Long
- condExitLong = ta.crossover(close, UpperBand_long)
- // Condizione Entry Short
- condEntryShort = ta.crossunder(close, UpperBand_short) and close > ema_short and adx_short < differenziale_adx_short and not only_Long and inDateRange // and month != 4 and month != 8
- // Condizione Exit Short
- condExitShort = ta.crossunder(close, LowerBand_short)
- buy_command = 'BUY COMMAND'
- sell_command = 'SELL COMMAND'
- close_command = 'CLOSE COMMAND'
- cancel_command = 'CANCEL COMMAND'
- // // ============== Email Protection ===============
- // L'email protection invia ordini senza webhook oppure se gli webhook sono abilitati ma per qualche motivo l'ordine non viene eseguito per errore verrà inviato un ordine di backup dopo 5 secondi da TV-Hub.org
- // Documentazione: https://www.tv-hub.org/Home/Documentation#email-signals
- // Quando settiamo l'email di tradingview per abilitare l'email protection mettere temporaneamente la lingua in inglese su tradingview e poi riportarla in italiano altrimenti il codice di verifica su tv-hub non arriva.
- // Email Protection da aggiungere a tutte le stringhe se utilizzata l'email protection "alertTimestamp":"{{ticker}}-{{time}}"
- // Esempio Email Protection buy = '{"pair":"ETHUSDT","unitsPercent":"8.5","unitsType":"percentBalance","exchange":"Bybit","apiKey":"OverTheClouds","token":"e6d67d6e-1a5f-4e53-a9fd-6276dfa2a34b","isBuy":true,"isMarket":true,"leverage":"1","marginType":"ISOLATED","closeCurrentPosition":true,"preventPyramiding":true,"cancelAllOrders":true,"alertTimestamp":"{{ticker}}-{{time}}}'
- // Abilitare pulsante invia testo normale "Invia testo normale ad un indirizzo e-mail alternativo" quando si crea alert in notifiche dell'alert oltre al solito webook
- //entrata e uscita Long
- if condEntryLong // strategy.opentrades == 0
- strategy.entry('operazioneLong', strategy.long, alert_message = "Open Long Position", comment = buy_command)
- if strategy.opentrades ==1
- strategy.exit('SL e TP', from_entry='operazioneLong', loss=stop_loss_long, profit=take_profit_long, alert_message = "Your Long SL-TP Has Been Triggered.", comment = close_command)
- if condExitLong and strategy.opentrades == 1
- strategy.close(id='operazioneLong', alert_message = "Close Long Position", comment = close_command)
- //entrata e uscita Short
- if condEntryShort //and strategy.opentrades == 0
- strategy.entry('operazioneShort', strategy.short, alert_message = "Open Short position", comment = sell_command)
- if strategy.opentrades ==1
- strategy.exit('SL e TP', from_entry='operazioneShort', loss=stop_loss_short, profit=take_profit_short, alert_message = "Your Short SL-TP Has Been Triggered.", comment = close_command)
- if condExitShort and strategy.opentrades == 1
- strategy.close(id='operazioneShort', alert_message = "Close Short Position", comment = close_command)
- // Nome Alert: Reversal-Band-Riot-P1 ETH/USDT.P BYBIT 4H
- // Commento Alert: {{strategy.order.comment}}
- // Webhook Classico Più Sicuro Ma Più Lento: https://alerts.tv-hub.org
- // Webhook Nuovo Meno Sicuro Ma Più Veloce: https://alerts.tv-hub.org/api/ExecuteTradeSignalClassic
- // ----------------- Inizio Tabella risultati mensili. Per visualizzare andare nelle impostazioni proprietà e spuntare ad ogni tick -----------------
- // new_month = month(time) != month(time[1])
- // new_year = year(time) != year(time[1])
- // eq = strategy.equity
- // bar_pnl = eq / eq[1] - 1
- // cur_month_pnl = 0.0
- // cur_year_pnl = 0.0
- // // Current Monthly P&L
- // cur_month_pnl := new_month ? 0.0 :
- // (1 + cur_month_pnl[1]) * (1 + bar_pnl) - 1
- // // Current Yearly P&L
- // cur_year_pnl := new_year ? 0.0 :
- // (1 + cur_year_pnl[1]) * (1 + bar_pnl) - 1
- // // Arrays to store Yearly and Monthly P&Ls
- // var month_pnl = array.new_float(0)
- // var month_time = array.new_int(0)
- // var year_pnl = array.new_float(0)
- // var year_time = array.new_int(0)
- // last_computed = false
- // if (not na(cur_month_pnl[1]) and (new_month or barstate.islast))
- // if (last_computed[1])
- // array.pop(month_pnl)
- // array.pop(month_time)
- // array.push(month_pnl , cur_month_pnl[1])
- // array.push(month_time, time[1])
- // if (not na(cur_year_pnl[1]) and (new_year or barstate.islast))
- // if (last_computed[1])
- // array.pop(year_pnl)
- // array.pop(year_time)
- // array.push(year_pnl , cur_year_pnl[1])
- // array.push(year_time, time[1])
- // last_computed := barstate.islast ? true : nz(last_computed[1])
- // // Monthly P&L Table
- // var monthly_table = table(na)
- // prec = input(2, title = "Return Precision")
- // if (barstate.islast)
- // monthly_table := table.new(position.bottom_right, columns = 14, rows = array.size(year_pnl) + 1, bgcolor=#0F0F0F,border_width=1,border_color=#000000)
- // table.cell(monthly_table, 0, 0, "", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 1, 0, "Jan", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 2, 0, "Feb", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 3, 0, "Mar", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 4, 0, "Apr", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 5, 0, "May", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 6, 0, "Jun", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 7, 0, "Jul", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 8, 0, "Aug", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 9, 0, "Sep", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 10, 0, "Oct", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 11, 0, "Nov", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 12, 0, "Dec", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // table.cell(monthly_table, 13, 0, "Year", text_color=#D3D3D3, bgcolor=#0F0F0F)
- // for yi = 0 to array.size(year_pnl) - 1
- // table.cell(monthly_table, 0, yi + 1, str.tostring(year(array.get(year_time, yi))), text_color=#D3D3D3, bgcolor=#0F0F0F)
- // y_color = array.get(year_pnl, yi) > 0 ? color.lime : color.red
- // table.cell(monthly_table, 13, yi + 1, str.tostring(math.round(array.get(year_pnl, yi) * 100, prec)), bgcolor = y_color)
- // for mi = 0 to array.size(month_time) - 1
- // m_row = year(array.get(month_time, mi)) - year(array.get(year_time, 0)) + 1
- // m_col = month(array.get(month_time, mi))
- // m_color = array.get(month_pnl, mi) > 0 ? color.lime : color.red
- // table.cell(monthly_table, m_col, m_row, str.tostring(math.round(array.get(month_pnl, mi) * 100, prec)), bgcolor = m_color)
- // ----------------- 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