Die Joker Moving Stop Strategie ist eine Trend-Tracking-Strategie, die auf Moving Averages basiert. Sie kombiniert die Eigenschaften von Moving Stop und Moving Stop, um Gewinne zu maximieren, wenn sich der Kurs in eine günstige Richtung entwickelt, und um Verluste so früh wie möglich zu stoppen, wenn sich der Kurs in eine nachteilige Richtung entwickelt.
Die Strategie verwendet schnelle und langsame Moving Averages, um einen Trendfilter zu erstellen. Wenn der schnelle Moving Average den langsamen Moving Average durchläuft, machen Sie mehr; wenn der schnelle Moving Average den langsamen Moving Average durchläuft, machen Sie weniger.
Die Strategie berechnet zunächst den ersten Stop-Preis nach dem Positionseröffnen anhand des konfigurierten Stop-Percentages. Wenn die Mobile Stop-Funktion aktiviert ist, berechnet sich die Schrittgröße des Mobile Stop anhand des minimalen Kurswechsels der Handelsvariante und des konfigurierten Mobile Stop-Percentages.
Wenn die Richtung der Position mit der Signalrichtung übereinstimmt, wird die Stop-Off-Methode verwendet, wenn der mobile Stop nicht aktiviert ist. Wenn der mobile Stop aktiviert ist, wird die Stop-Off-Methode verwendet, um den Stop-Off-Preis kontinuierlich an die Größe des Schritts anzupassen.
Der Moving Average wird verwendet, um die Richtung der wichtigsten Trends zu bestimmen, um zu vermeiden, dass die Markt Noise zu viel Einfluss auf die Strategie hat.
Wenn der mobile Stop eingeschaltet ist, kann die Stop-Position entsprechend der Marktentwicklung angepasst werden, um zu gewährleisten, dass die Stop-Position immer am Preis liegt. Dies ist flexibler und effizienter als die Festlegung eines festen Stop-Preises.
Der mobile Stop kann mehr Gewinne sperren und verringert das Risiko eines strategischen Verlusts. Es vermeidet auch das Problem, dass die Stoppposition zu konservativ ist und die Gewinne zu früh sperren, wenn nur ein fester Stop eingestellt wird.
Der mobile Stop behält die Vorteile des eingestellten Stop-Loss-Stopps bei und kann so schnell wie möglich gestoppt werden, wenn sich die Situation nachteilig entwickelt.
Beim starken Kursschwanken kann es zu Fehlsignalen oder Signalverzögerungen kommen. Dies kann zu Verlusten bei der Umkehrung der Strategie führen. Sie können die Moving Average-Parameter entsprechend anpassen oder Filter hinzufügen, um sie zu optimieren.
Eine zu hohe Stop-Ratio erhöht auch die Strategie-Haltedauer und die Abweichung zwischen dem tatsächlichen Stop-Preis und dem theoretischen Preis. Die Stop-Ratio kann entsprechend gesenkt werden, um dieses Risiko zu verringern.
Wenn der Schrittverhältnis des Mobile Stops zu klein eingestellt ist, kann dies zu einer zu hohen Frequenz führen, was zu höheren Transaktionsgebühren und einem erhöhten Risiko für Slippage führt. Der mobile Stoppschritt kann entsprechend angepasst werden, um ihn zu optimieren.
Bewegte Stopps berücksichtigen nur einseitige Bewegungen und nicht Rücktritte. Dies bedeutet, dass der Preis wieder zurückgeht und die Bewegte Stopps nicht nach unten gehen. Dies führt dazu, dass die Stopps den endgültigen Preis von den theoretischen Preisen abweichen.
Es kann in Erwägung gezogen werden, die Moving Average-Parameter an die Dynamik der Marktfluktuation anzupassen, um die Perioden zu vergrößern, wenn die Schwankungen zunehmen, und die Perioden zu verringern, wenn die Schwankungen abnehmen.
Es ist möglich, die Merkmale der verschiedenen Sorten und Märkte zu untersuchen und verschiedene Standard-Stop-Verhältnisse einzurichten, um das Risiko einer Stopp-Vorgabe zu verringern.
Man kann sich mit einem bilateralen Bewegungsstopper beschäftigen, der den Stopper nach oben bewegt, wenn der Preis einen neuen Höchststand erreicht, und nach unten, wenn ein Rückzug auftritt, um den Stopper näher am Preis zu bringen.
In Kombination mit einem Trendstärke-Indikator kann eine Verringerung der Stoppquote bei schwacher Trendstärke und eine Erhöhung der Stoppquote bei starker Trendstärke in Betracht gezogen werden.
Es kann in Kombination mit einem maschinellen Lernmodell in Betracht gezogen werden, um die Stop-Stop-Ratio dynamisch mit Hilfe der Modellvorhersagen für die Preisspanne einzustellen.
Die Gesamtstruktur der Joker-Moving Stop-Strategie ist klar, die Richtung des Trends wird anhand des Moving Averages beurteilt und dann die Stop-Position dynamisch angepasst, um Gewinne zu sichern. Sie bietet die Vorteile von Moving Stop-Loss und Moving Stop, die Trends effektiv verfolgen und gleichzeitig Risiken kontrollieren können. Durch die Optimierung der Parameter und die Verbesserung der Stop-Mechanismen kann die Strategie weiter verbessert werden, um sie an kompliziertere Marktumgebungen anzupassen.
/*backtest
start: 2023-08-23 00:00:00
end: 2023-09-22 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
strategy(title='Joker Trailing TP Bot', shorttitle='Joker TTP Bot', overlay=true, pyramiding=0, process_orders_on_close=false, close_entries_rule='ANY', calc_on_every_tick=false, calc_on_order_fills=false, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=1000, currency=currency.USD) //, max_labels_count=500)
fromDate = input(timestamp('01 Jan 2021 00:00 UTC'), 'From Date')
toDate = input(timestamp('31 Dec 2121 23:59 UTC'), 'To Date')
fastMALen = input.int(23, 'Fast SMA Length')
slowMALen = input.int(50, 'Slow SMA Length')
longTakeProfitPerc = input.float(0.5, 'Long Take Profit %', minval=0.05, step=0.05) * 0.01
shortTakeProfitPerc = input.float(0.5, 'Short Take Profit %', minval=0.05, step=0.05) * 0.01
enableTrailing = input.bool(true, 'Enable Trailing')
trailingTakeProfitPerc = input.float(0.01, 'Trailing Take Profit %', minval=0.01, maxval=100, step=0.01) * 0.01
float fastMA = ta.sma(close, fastMALen)
float slowMA = ta.sma(close, slowMALen)
bool isWithinPeriod = true
bool openLongPosition = isWithinPeriod and ta.crossover(fastMA, slowMA)
bool openShortPosition = isWithinPeriod and ta.crossunder(fastMA, slowMA)
bool longIsActive = openLongPosition or strategy.position_size > 0
bool shortIsActive = openShortPosition or strategy.position_size < 0
float longTakeProfitPrice = na
longTakeProfitPrice := if longIsActive
if openLongPosition and not (strategy.position_size > 0)
close * (1 + longTakeProfitPerc)
else
nz(longTakeProfitPrice[1], close * (1 + longTakeProfitPerc))
else
na
float shortTakeProfitPrice = na
shortTakeProfitPrice := if shortIsActive
if openShortPosition and not (strategy.position_size < 0)
close * (1 - shortTakeProfitPerc)
else
nz(shortTakeProfitPrice[1], close * (1 - shortTakeProfitPrice))
else
na
float longTrailingTakeProfitStepTicks = longTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
float shortTrailingTakeProfitStepTicks = shortTakeProfitPrice * trailingTakeProfitPerc / syminfo.mintick
strategy.entry(id = 'Long Entry', direction = strategy.long, when = openLongPosition, alert_message = 'Long(' + syminfo.ticker + '): Started')
strategy.entry(id = 'Short Entry', direction = strategy.short, when = openShortPosition, alert_message = 'Short(' + syminfo.ticker + '): Started')
strategy.exit(id = 'Long Take Profit', from_entry = 'Long Entry', limit = enableTrailing ? na : longTakeProfitPrice, trail_price = enableTrailing ? longTakeProfitPrice : na, trail_offset = enableTrailing ? longTrailingTakeProfitStepTicks : na, when = longIsActive, alert_message = 'Long(' + syminfo.ticker + '): Take Profit activated')
strategy.exit(id = 'Short Take Profit', from_entry = 'Short Entry', limit = enableTrailing ? na : shortTakeProfitPrice, trail_price = enableTrailing ? shortTakeProfitPrice : na, trail_offset = enableTrailing ? shortTrailingTakeProfitStepTicks : na, when = shortIsActive, alert_message = 'Short(' + syminfo.ticker + '): Take Profit activated')
plot(series = fastMA, title='Fast SMA', color = color.blue, linewidth = 1, style = plot.style_line)
plot(series = slowMA, title='Slow SMA', color = color.orange, linewidth = 1, style = plot.style_line)
plot(series = longTakeProfitPrice, title='Long Take Profit', color = color.green, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = shortTakeProfitPrice, title='Short Take Profit', color = color.red, linewidth = 1, style = plot.style_cross, offset = 1)
plot(series = strategy.position_avg_price, title='Position', color = color.white, linewidth = 1, style = plot.style_linebr)