Cette stratégie est développée sur la base de l'indicateur Botvenko pour identifier automatiquement les tendances du marché et établir des positions longues / courtes. Elle intègre l'indicateur Botvenko, les moyennes mobiles et les lignes de soutien horizontales pour reconnaître automatiquement les signaux de rupture et établir des positions.
L'indicateur de base de cette stratégie est l'indicateur Botvenko. En calculant la différence logarithmique entre les prix de clôture sur différents jours de négociation, il juge la tendance du marché et les niveaux de support / résistance importants.
En outre, la stratégie intègre une ceinture de protection
En identifiant les signaux de négociation avec l'indicateur Botvenko et en évaluant les étapes du marché avec des moyennes mobiles, l'établissement de positions inappropriées peut être évité lorsqu'il est utilisé en combinaison.
L'indicateur Botvenko est très sensible à la différence entre les prix sur deux périodes de temps et peut rapidement localiser les niveaux de support/résistance clés.
Cette idée de combiner des indicateurs rapides et des indicateurs de tendance permet à la stratégie de localiser rapidement les points d'entrée et de sortie tout en évitant les achats et les ventes inappropriés.
Les risques de cette stratégie proviennent principalement de deux aspects. Premièrement, l'indicateur Botvenko lui-même est très sensible aux changements de prix, ce qui peut générer de nombreux signaux de trading inutiles. Deuxièmement, le tri des moyennes mobiles peut devenir désordonné pendant les mouvements latéraux, ce qui conduit à un établissement de position désordonné.
Pour le premier risque, les paramètres de l'indicateur Botvenko peuvent être ajustés pour augmenter le cycle de calcul et réduire les transactions inutiles.
Les principales directions d'optimisation sont le réglage des paramètres et l'ajout de conditions de filtre.
Pour l'indicateur Botvenko, différents paramètres de période peuvent être essayés pour trouver la combinaison optimale. Pour les moyennes mobiles, plus d'entre eux peuvent être ajoutés pour former un système de jugement de tendance plus complet.
Grâce à des ajustements complets des paramètres et des conditions de filtrage, la stabilité et la rentabilité de la stratégie peuvent être encore améliorées.
La stratégie adaptative long/short de Botvenko combine avec succès des indicateurs rapides et de tendance pour identifier automatiquement les points clés du marché et établir des positions correctes.
/*backtest start: 2023-12-27 00:00:00 end: 2024-01-03 00:00:00 period: 1m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © boftei //@version=5 strategy("Boftei's Strategy", overlay=false, pyramiding=1, default_qty_type= strategy.percent_of_equity, default_qty_value = 100, calc_on_order_fills=false, margin_long = 100, margin_short = 100, slippage=0, commission_type=strategy.commission.percent, commission_value = 0, initial_capital = 40, precision = 6) strat_dir_input = input.string("all", "strategy direction", options=["long", "short", "all"]) strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all strategy.risk.allow_entry_in(strat_dir_value) ////////////////////////////////////////////////////////////////////// //DATA testStartYear = input(2005, "Backtest Start Year") testStartMonth = input(7, "Backtest Start Month") testStartDay = input(16, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) //Stop date if you want to use a specific range of dates testStopYear = input(2030, "Backtest Stop Year") testStopMonth = input(12, "Backtest Stop Month") testStopDay = input(30, "Backtest Stop Day") testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0) testPeriod() => time >= testPeriodStart and time <= testPeriodStop ? true : false ////////////////////////////////////////////////////////////////////// sell = input.float(0.0065, "sell level") buy = input.float(0, "buy level") long1 = input.float(-0.493, "long retry - too low") long2 = input.float(2, "long close up") long3 = input.float(-1.5, "long close down") short1 = input.float(1.26, "short retry - too high") short2 = input.float(-5, "dead - close the short") ///< botvenko script nn = input(60, "Histogram Period") float x = 0 float z = 0 float k = 0 y = math.log(close[0]) - math.log(close[nn]) if y>0 x := y else k := y //--------------------------------------------- plot(y > 0 ? x: 0, color = color.green, linewidth = 4) plot(y <= 0 ? k: 0, color = color.maroon, linewidth = 4) plot(y, color = color.yellow, linewidth = 1) co = ta.crossover(y, buy) cu = ta.crossunder(y, sell) retry_long = ta.crossunder(y, long1) deadline_long_up = ta.crossover(y, long2) deadline_long_down = ta.crossunder(y, long3) retry_short = ta.crossover(y, short1) deadline_short = ta.crossunder(y, short2) hline(buy, title='buy', color=color.green, linestyle=hline.style_dotted, linewidth=2) hline(0, title='zero', color=color.white, linestyle=hline.style_dotted, linewidth=1) hline(sell, title='sell', color=color.red, linestyle=hline.style_dotted, linewidth=2) hline(long1, title='long retry', color=color.blue, linestyle=hline.style_dotted, linewidth=2) hline(long2, title='overbought', color=color.teal, linestyle=hline.style_dotted, linewidth=2) hline(long3, title='oversold', color=color.maroon, linestyle=hline.style_dotted, linewidth=2) hline(short1, title='short retry', color=color.purple, linestyle=hline.style_dotted, linewidth=2) hline(short2, title='too low to short - an asset may die', color=color.navy, linestyle=hline.style_dotted, linewidth=2) ////////////////////////////////////////////////////////////EMAprotectionBLOCK ema_21 = ta.ema(close, 21) ema_55 = ta.ema(close, 55) ema_89 = ta.ema(close, 89) ema_144 = ta.ema(close, 144) //ema_233 = ta.ema(close, 233) // ema_377 = ta.ema(close, 377) long_st = ema_21>ema_55 and ema_55>ema_89 and ema_89>ema_144 //and ema_144>ema_233 and ema_233>ema_377 short_st = ema_21<ema_55 and ema_55<ema_89 and ema_89<ema_144 //and ema_144<ema_233 and ema_233<ema_377 g_v = long_st == true?3:0 r_v = short_st == true?-2:0 y_v = long_st != true and short_st != true?2:0 plot(math.log(ema_21), color = color.new(#ffaf5e, 50)) plot(math.log(ema_55), color = color.new(#b9ff5e, 50)) plot(math.log(ema_89), color = color.new(#5eff81, 50)) plot(math.log(ema_144), color = color.new(#5effe4, 50)) //plot(math.log(ema_233), color = color.new(#5e9fff, 50)) //plot(math.log(ema_377), color = color.new(#af5eff, 50)) plot(long_st == true?3:0, color = color.new(color.green, 65), linewidth = 5) plot(short_st == true?-2:0, color = color.new(color.red, 65), linewidth = 5) plot(long_st != true and short_st != true?2:0, color = color.new(color.yellow, 65), linewidth = 5) ////////////////////////////////////////////////////////////EMAprotectionBLOCK if (co and testPeriod() and (g_v == 3 or y_v == 2)) strategy.close("OH BRO", comment = "EXIT-SHORT") strategy.close("OH DUDE", comment = "EXIT-SHORT") strategy.entry("OH DAMN", strategy.long, comment="ENTER-LONG 'co'") if (retry_long and testPeriod() and (g_v == 3 or y_v == 2)) strategy.close("OH DAMN", comment = "EXIT-LONG") strategy.entry("OH BRUH", strategy.long, comment="ENTER-LONG 'retry_long'") if (cu and testPeriod() and (r_v == -2 or y_v == 2)) strategy.close("OH DAMN", comment = "EXIT-LONG") strategy.close("OH BRUH", comment = "EXIT-LONG") strategy.entry("OH BRO", strategy.short, comment="ENTER-SHORT 'cu'") if (retry_short and testPeriod() and (r_v == -2 or y_v == 2)) strategy.close("OH BRO", comment = "EXIT-SHORT") strategy.entry("OH DUDE", strategy.short, comment="ENTER-SHORT 'retry_short'") if (deadline_long_up and testPeriod() or r_v == -2 and testPeriod()) strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_up'") if (deadline_long_down and testPeriod()) strategy.close("OH DAMN", comment = "EXIT-LONG 'deadline_long_down'") if (deadline_short and testPeriod() or g_v == 3 and testPeriod()) strategy.close("OH BRO", comment = "EXIT-SHORT 'deadline_short'") // (you can use strategy.close_all(comment = "close all entries") here)