Diese Strategie basiert auf dem Botvenko-Indikator, um automatisch Markttrends zu erkennen und Long/Short-Positionen zu etablieren.
Der Kernindikator dieser Strategie ist der Botvenko-Indikator. Durch die Berechnung der logarithmischen Differenz zwischen den Schlusskursen an verschiedenen Handelstagen wird der Markttrend und wichtige Unterstützungs-/Widerstandsniveaus beurteilt.
Darüber hinaus integriert die Strategie einen
Durch die Identifizierung von Handelssignalen mit dem Botvenko-Indikator und die Beurteilung von Marktstadien mit gleitenden Durchschnitten kann eine unangemessene Positionsbildung bei Kombination vermieden werden.
Der größte Vorteil dieser Strategie besteht darin, dass er automatisch die langen/kurzen Trends des Marktes identifizieren kann. Der Botvenko-Indikator ist sehr empfindlich auf die Unterschiede zwischen den Preisen über zwei Zeiträume hinweg und kann schnell wichtige Unterstützungs-/Widerstandsniveaus lokalisieren. Gleichzeitig kann die Sortierung von gleitenden Durchschnitten effektiv beurteilen, ob es derzeit besser ist, lang oder kurz zu sein.
Diese Kombination von schnellen Indikatoren und Trendindikatoren ermöglicht es der Strategie, schnell Ein- und Ausstiegspunkte zu finden und gleichzeitig unangemessene Kauf- und Verkaufsaktionen zu verhindern.
Die Risiken dieser Strategie kommen hauptsächlich aus zwei Aspekten. Erstens ist der Botvenko-Indikator selbst sehr empfindlich auf Preisänderungen, die viele unnötige Handelssignale erzeugen können. Zweitens kann die Sortierung von gleitenden Durchschnitten während seitlicher Bewegungen unordentlich werden, was zu einer unordentlichen Positionsbildung führt.
Um dem ersten Risiko entgegenzuwirken, können die Parameter des Botvenko-Indikators angepasst werden, um den Berechnungszyklus zu verlängern und unnötige Trades zu reduzieren.
Die wichtigsten Optimierungsrichtungen sind Parameter-Tuning und das Hinzufügen von Filterbedingungen.
Für den Botvenko-Indikator können verschiedene Periodenparameter ausprobiert werden, um die optimale Kombination zu finden. Für gleitende Durchschnitte können mehr von ihnen hinzugefügt werden, um ein vollständigeres Trendbeurteilungssystem zu bilden. Darüber hinaus können auch Volatilitätsindikatoren, Handelsvolumenindikatoren usw. eingeführt werden, um falsche Signale auszufiltern.
Durch umfassende Anpassungen der Parameter und Filterbedingungen können die Stabilität und Rentabilität der Strategie weiter verbessert werden.
Die adaptive Botvenko Long/Short Strategie kombiniert erfolgreich schnelle und Trendindikatoren, um automatisch wichtige Marktpunkte zu identifizieren und korrekte Positionen zu etablieren.
/*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)