Diese Strategie integriert das exponentielle gleitende Durchschnitts-Crossover-System und das Schildkrötenhandelssystem, zwei beliebte systematische Handelsstrategien.
Die Strategie umfasst zwei Teilstrategien: die Trendstrategie und die Breakout-Strategie.
Die Trendstrategie verwendet schnelle EMA und langsame EMA-Kreuzungen als Handelssignale. Die schnelle EMA-Periode wird vom Benutzer definiert und die langsame EMA-Periode ist 5-mal so hoch wie die schnelle EMA. Das Signal wird erzeugt, indem die EMA-Differenz durch die 252-Perioden-Rückkehrstandardabweichung geteilt wird, die auf Volatilität angepasst ist, um zuverlässigere Signale zu erzeugen. Es geht lang oder kurz, wenn neue Trendformationen erkannt werden.
Die Breakout-Strategie verwendet als Basislinie den Durchschnitt der höchsten Höchst- und niedrigsten niedrigen Preise über einen festen Rückblickzeitraum.
Die Positionsgröße basiert auf der jüngsten Preisvolatilität und dem vom Benutzer definierten jährlichen Risikoziel. Bei geringer Volatilität wird eine größere Größe, bei hoher Volatilität eine kleinere Größe genommen. Dies ermöglicht ein dynamisches Positionsmanagement mit Risikoanpassung.
Hard Stops werden als Vielfache des durchschnittlichen realen Bereichs festgelegt.
Zu den Hauptvorteilen dieser Strategie gehören:
Die Kombination von Trend-Tracking- und Breakout-Teilstrategien passt sich mit hoher Robustheit unterschiedlichen Marktumgebungen an.
Durch die Anwendung fortgeschrittener Positionsgrößen- und Risikomanagementtechniken wird die Position dynamisch verwaltet und das Risiko wirksam kontrolliert.
Volatilitätsanpassungspositionen auf der Grundlage der jüngsten Volatilität und des jährlichen Risikobegriffs halten das Portfoliorisiko in Regimes mit hoher/niedriger Volatilität relativ stabil.
Die Einstellung von Stop-Loss auf der Grundlage der tatsächlichen Kursschwankungen vermeidet unnötige kleine Verluste bei Stop-Runs.
Die Anpassung des Trailing Stop in Echtzeit folgt flexibel den Trends, um Gewinn zu buchen und pünktlich zu stoppen.
Die wichtigsten Risiken dieser Strategie sind:
Abhängigkeit von Parameteroptimierung. Verschiedene Parameter beeinflussen die Strategieleistung erheblich, so dass umfassende Tests erforderlich sind, um optimale Parameter zu finden.
Häufige Stopp-Outs bei schwankenden Trends.
Empfindlichkeit gegenüber Anfangskapital und Handelskosten: Unzureichendes Anfangskapital und hohe Handelskosten haben negative Auswirkungen auf die Rentabilität.
Abhängigkeit von genauen Volatilitätsschätzungen für die Positionsgröße und Risikokontrolle Ungenaue Volatilitätsschätzungen führen zu übergroßen oder untergroßen Positionen.
Zu den wichtigsten Optimierungsrichtungen gehören:
Suche nach optimalen Parametermengen durch mehr Backtesting mit größeren historischen Datensätzen.
Verbessern Sie die Stopp-Mechanismen, indem Sie verschiedene Stopps wie Moving Stops, Time Stops, Volatility Stops usw. testen.
Optimieren Sie die Positionsgröße und das Risikomanagement, indem Sie verschiedene Risikoziele testen, um das beste Risiko-Rendite-Profil zu finden.
Versuchen Sie mehr Hilfsindikatoren, um die Signalgenauigkeit und Strategie zu verbessern.
Versuche verschiedene Haltezeiten durch Unterstützung von Entscheidungen mit höheren Zeitrahmensignalen, um die Genauigkeit der Positionszuordnung zu verbessern.
Diese Strategie integriert zwei Hauptkategorien von Handelsstrategien: Trendfollowing und Breakouts. Durch die Anwendung fortschrittlicher dynamischer Positionsanpassungstechniken kontrolliert sie das Risiko effektiv, während sie die Marktbewegungen zum Gewinn verfolgt. Sie zeigt ein starkes Gewinnpotenzial und ist es wert, weiter getestet und optimiert zu werden.
/*backtest start: 2023-12-01 00:00:00 end: 2023-12-31 23:59:59 period: 1h basePeriod: 15m 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/ // © Crunchster1 //@version=5 strategy(title="Crunchster's Turtle and Trend System", shorttitle="Turtle Trend", overlay=true, slippage=10, pyramiding=1, precision = 4, calc_on_order_fills = false, calc_on_every_tick = false, default_qty_value = 0.1, initial_capital = 1000, commission_value = 0.06, process_orders_on_close = true) // Inputs and Parameters src = input(close, 'Source', group='Strategy Settings') length = input.int(title="Lookback period for fast EMA", defval=10, minval=2, group='Strategy Settings', tooltip='This sets the lookback period for the fast exponential moving average. The slow EMA is 5x the fast EMA length') blength = input.int(title="Lookback period for Breakout", defval=20, minval=5, step=5, group='Strategy Settings') long = input(true, 'Long', inline='08', group='Strategy toggle') short = input(true, 'Short', inline='08', group='Strategy toggle', tooltip='Toggle long/short strategy on/off') EMAwt = input(false, 'Trend', inline='01', group='Strategy toggle') breakwt = input(true, 'Breakout', inline='01', group='Strategy toggle', tooltip='Toggle trend/breakout strategy on/off') stopMultiple = input.float(2, 'Stop multiple', step=0.5, group='Risk Management Settings', tooltip='Multiple for ATR, setting hard stop loss from entry price') trail = input.int(10, 'Trail lookback', step=5, group='Risk Management Settings', tooltip='Lookback period for the trailing stop') lev = input.float(1, 'Max Leverage', step=0.5, group='Risk Management Settings', tooltip='Max leverage sets maximum allowable leverage of total capital (initial capital + any net profit), capping maximum volatility adjusted position size') riskT = input.float(15, maxval=75, title='Annualised Volatility Target %', group='Risk Management Settings', tooltip='Specify annual risk target, used to determine volatility adjusted position size. Annualised daily volatility is referenced to this value and position size adjusted accordingly') comp = input(true, 'Compounding', inline='09', group='Risk Management Settings') Comppct = input.float(50, '%', step=5, inline='09', group='Risk Management Settings', tooltip='Toggle compounding of profit, and set % of profit to compound') // Backtesting period FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31, inline='04', group='Backtest range') FromMonth = input.int(defval=1, title='From Mon', minval=1, maxval=12, inline='04', group='Backtest range') FromYear = input.int(defval=2018, title='From Yr', minval=1900, inline='04', group='Backtest range', tooltip='Set start of backtesting period') ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31, inline='05', group='Backtest range') ToMonth = input.int(defval=1, title='To Mon', minval=1, maxval=12, inline='05', group='Backtest range') ToYear = input.int(defval=9999, title='To Yr', minval=1900, inline='05', group='Backtest range', tooltip='Set end of backtesting period') start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window = time >= start and time <= finish // Breakout strategy lower = ta.lowest(low[1], blength) upper = ta.highest(high[1], blength) basis = math.avg(upper, lower) signal = 20*(close - basis) / (upper - lower) // Trend strategy fEMA = ta.ema(close[1], length) sEMA = ta.ema(close[1], length*5) emadiff = fEMA - sEMA nemadiff = 5*emadiff/(ta.stdev(close - close[1], 252)) //Risk Management formulae strategy.initial_capital = 50000 tr = math.max(high - low, math.abs(high - close), math.abs(low - close)) //True range stopL = ta.sma(tr, 14) //Average true range stdev = ta.stdev(close-close[1], 14) //volatility of recent returns maxcapital = strategy.initial_capital+strategy.netprofit //Maximum capital available to invest - initial capital net of profit annvol = 100*math.sqrt(365)*stdev/close //converts recent volatility of returns into annualised volatility of returns - assumes daily timeframe risk = 1.1 if comp risk := (strategy.initial_capital+(Comppct*strategy.netprofit/100))//adjust investment capital to include compounding else risk := strategy.initial_capital shares = (risk * (riskT/annvol)) / close //calculates volatility adjusted position size, dependent on user specified annualised risk target if ((shares*close) > lev*maxcapital) //ensures position size does not exceed available capital multiplied by user specified maximum leverage shares := lev*maxcapital/close //To set the price at the entry point of trade Posopen() => math.abs(strategy.position_size[1]) <= 0 and math.abs(strategy.position_size) > 0 var float openN = na if Posopen() openN := stopL // Trailing stop tlower = ta.lowest(low[1], trail) tupper = ta.highest(high[1], trail) tbasis = math.avg(tupper, tlower) tsignal = 20*(close - tbasis) / (tupper - tlower) // Strategy Rules if EMAwt if long longCondition2 = (nemadiff >2 and nemadiff[1] <2) and window exitlong = tsignal <= -10 if (longCondition2) strategy.entry('Trend Long!', strategy.long, qty=shares) if strategy.position_size > 0 strategy.exit('Stop Long', from_entry = 'Trend Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple))) if (exitlong) strategy.close('Trend Long!', immediately = true) if short shortCondition2 = (nemadiff <-1 and nemadiff[1] >-1) and window exitshort = tsignal >= 10 if (shortCondition2) strategy.entry('Trend Short!', strategy.short, qty=shares) if strategy.position_size < 0 strategy.exit('Stop Short', from_entry = 'Trend Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple))) if (exitshort) strategy.close('Trend Short!', immediately = true) if breakwt if long longCondition1 = (signal >= 10) and window exitlong = tsignal <= -10 if (longCondition1) strategy.entry('Break Long!', strategy.long, qty=shares) if strategy.position_size > 0 strategy.exit('Stop Long', from_entry = 'Break Long!', stop=(strategy.opentrades.entry_price(0) - (openN * stopMultiple))) if (exitlong) strategy.close('Break Long!', immediately = true) if short shortCondition1 = (signal <= -10) and window exitshort = tsignal >= 10 if (shortCondition1) strategy.entry('Break Short!', strategy.short, qty=shares) if strategy.position_size < 0 strategy.exit('Stop Short', from_entry = 'Break Short!', stop=(strategy.opentrades.entry_price(0) + (openN * stopMultiple))) if (exitshort) strategy.close('Break Short!', immediately = true) // Visuals of trend and direction plot(nemadiff, title='EMA Forecast', color=color.black, display=display.none) plot(ta.sma(ta.median(math.sqrt(math.pow(nemadiff,2)), 700), 350), 'Forecast mean', color=color.rgb(245, 0, 0), display=display.none) MAColor = fEMA > sEMA ? #00ff00 : #ff0000 MA1 = plot(fEMA, title='Fast EMA', color=MAColor) MA2 = plot(sEMA, title='Slow EMA', color=MAColor) fill(MA1, MA2, title='Band Filler', color=MAColor)