Steadfast as a Rock Turtle ist eine quantitative Handelsstrategie, die den Regeln der Brady-Schildkröten-Handelsmethode folgt. Sie verwendet Preis-Breakout, um Positionen einzugeben und Stops für den Ausstieg zu verfolgen. Sie berechnet die Positionsgröße basierend auf der wahren Volatilität und kontrolliert die Verluste pro Handel streng.
Steadfast as a Rock Turtle Strategie geht auf Breakouts ein. Insbesondere berechnet es den höchsten Höchststand und das niedrigste Tief über den angegebenen Lookback-Zeitraum. Wenn der Preis über dem höchsten Höchststand bricht, geht es lang. Wenn der Preis unter dem niedrigsten Tief bricht, geht er kurz.
Wenn der Abschluss der aktuellen Bar den höchsten Höchststand der letzten 20 Bars überschreitet, wird die Strategie einen Long Stop-Auftrag zu diesem Schlusskurs platzieren, um sich auf einen Ausbruch über dem höchsten Höchststand vorzubereiten.
Die Steadfast as a Rock Turtle-Strategie geht mit Stops-Tracking-Stops aus. Sie berechnet dynamisch den höchsten Höchststand und den niedrigsten Tiefstand über den angegebenen Ausgangszeitraum und verwendet sie, um den Ausgangskanal zu bestimmen.
Wenn man lang hält, wenn der Preis unter den untersten Tiefpunkt des Exit-Kanals fällt, stoppt die Position. Umgekehrt für die Short-Position.
Darüber hinaus berechnet die Strategie eine Stop-Loss-Ebene, die auf der wahren Volatilität basiert und als letzter Stopp dient. Solange der Preis über dem Exit-Kanal bleibt, wird der Stop-Loss weiter verfolgt und angepasst, um sicherzustellen, dass die Stops auf geeignete Entfernungen gesetzt werden
Steadfast as a Rock Turtle-Strategie misst seine Positionen basierend auf der wahren Volatilität. Insbesondere schätzt sie zuerst den potenziellen Verlustprozentsatz in der Nähe des Einstiegspreises, berechnet dann umgekehrt die Positionsgröße aus dem erwarteten Risikoparameter. Dies steuert effektiv den maximalen Verlust pro Handel.
Die Strategie steadfast as a Rock Turtle hält sich streng an die klassischen Schildkrötenhandelsregeln für Ein- und Ausgänge ohne willkürliche Änderungen. Dies ermöglicht es der Strategie, langfristig stabil zu laufen, ohne dass das System aufgrund vorübergehender schlechtes Urteilsvermögen versagt.
Durch den Eintritt auf Breakouts vermeidet die Strategie überbewertete Eintritte effektiv und reduziert die Wahrscheinlichkeit von Systemverlusten.
Durch die Größe basierend auf der wahren Volatilität kontrolliert die Strategie streng den maximalen Verlust pro Handel innerhalb der Toleranz.
Wenn der Preis mit geringer Dynamik ausbricht, kann sich herausstellen, dass es sich um ein falsches Signal handelt, das falsche Einstiegsverluste verursacht.
Statische Strategieparameter wie Eintritts-/Austrittszeiten könnten ungültig werden, wenn sich das Marktregime drastisch ändert.
Indikatoren, die wie Preisbreakout-Flagges verwendet werden, könnten fehlschlagen, wenn sich der Trend oder die Volatilität signifikant ändern.
Es können auch allgemeine Trendindikatoren wie MA, MACD hinzugefügt werden, wobei man nur bei Aufwärtstrend lang und nur bei Abwärtstrend kurz geht, um Gegentrend-Whipsaws zu vermeiden.
Höhere Zeitrahmenindikatoren, z. B. Tages-MA-Werte, können dazu beitragen, die allgemeine Richtung zu bestätigen, um die Signalen mit niedrigeren Zeitrahmen zu ergänzen.
Maschinelles Lernen kann die Strategieparameter automatisch kontinuierlich auf Basis der neuesten Daten aktualisieren, um die Wirksamkeit bei sich ändernden Marktdynamiken zu erhalten.
Steadfast as a Rock Turtle Strategie folgt der klassischen Schildkröten-Handelsmethodik streng
/*backtest start: 2024-01-18 00:00:00 end: 2024-02-17 00:00:00 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Real Turtle", shorttitle = "Real Turtle", overlay=true, pyramiding=1, default_qty_type= strategy.percent_of_equity,calc_on_order_fills=false, slippage=25,commission_type=strategy.commission.percent,commission_value=0.075) ////////////////////////////////////////////////////////////////////// // Testing Start dates testStartYear = input(2016, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "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) // A switch to control background coloring of the test period // Use if using a specific date range testPeriodBackground = input(title="Color Background?", type=bool, defval=false) testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na bgcolor(testPeriodBackgroundColor, transp=97) testPeriod() => true // Component Code Stop ////////////////////////////////////////////////////////////////////// //How many candles we want to determine our position entry enterTrade = input(20, minval=1, title="Entry Channel Length") //How many candles we want ot determine our position exit exitTrade = input(10, minval=1, title="Exit Channel Length") //True Range EMA Length trLength = input(13, minval=1, title="True Range Length") //Go all in on every trade allIn = input(false, title="Use whole position on every trade") dRisk = input(2, "Use Desired Risk %") //How much of emaTR to use for TS offset multiEmaTR = input(2, "Desired multiple of ema Tr (N)") //absolute value (highest high of of this many candles - lowest high of this many candles) . This is used if we want to change our timeframe to a higher timeframe otherwise just works like grabbing high o r low of a candle //True range is calculated as just high - low. Technically this should be a little more complicated but with 24/7 nature of crypto markets high-low is fine. trueRange = max(high - low, max(high - close[1], close[1] - low)) //Creates an EMA of the true range by our custom length emaTR = ema(trueRange, trLength) //Highest high of how many candles back we want to look as specified in entry channel for long longEntry = highest(enterTrade) //loweest low of how many candles back we want to look as specified in exit channel for long exitLong = lowest(exitTrade) //lowest low of how many candles back want to look as specified in entry channel for short shortEntry = lowest(enterTrade) //lowest low of how many candles back want to look as specified in exit channel for short exitShort = highest(exitTrade) //plots the longEntry as a green line plot(longEntry[1], title="Long Entry",color=green) //plots the short entry as a purple line plot(shortEntry[1], title="Short Entry",color=purple) howFar = barssince(strategy.position_size == 0) actualLExit = strategy.position_size > 0 ? strategy.position_avg_price - (emaTR[howFar] * multiEmaTR) : longEntry - (emaTR * multiEmaTR) actualLExit2 = actualLExit > exitLong ? actualLExit : exitLong actualSExit = strategy.position_size < 0 ? strategy.position_avg_price + (emaTR[howFar] * multiEmaTR) : shortEntry + (emaTR * multiEmaTR) actualSExit2 = actualSExit < exitShort ? actualSExit : exitShort //plots the long exit as a red line plot(actualLExit2[1], title="Long Exit",color=red) //plots the short exit as a blue line plot(actualSExit2[1], title="Short Exit",color=yellow) //Stop loss in ticks SLLong =(emaTR * multiEmaTR)/ syminfo.mintick SLShort = (emaTR * multiEmaTR)/ syminfo.mintick //Calculate our potential loss as a whole percentage number. Example 1 instead of 0.01 for 1% loss. We have to convert back from ticks to whole value, then divided by close PLLong = ((SLLong * syminfo.mintick) * 100) / longEntry PLShort = ((SLShort * syminfo.mintick) * 100) / shortEntry //Calculate our risk by taking our desired risk / potential loss. Then multiple by our equity to get position size. we divide by close because we are using percentage size of equity for quantity in this script as not actual size. //we then floor the value. which is just to say we round down so instead of say 201.54 we would just input 201 as TV only supports whole integers for quantity. qtyLong = floor(((dRisk / PLLong) * strategy.equity) /longEntry ) qtyShort = floor(((dRisk / PLShort) * strategy.equity) /shortEntry ) qtyLong2 = allIn ? 100 : qtyLong qtyShort2 = allIn ? 100 : qtyShort //Only open long or short positions if we are inside the test period specified earlier if testPeriod() //Open a stop market order at our long entry price and keep it there at the quantity specified. This order is updated/changed on each new candlestick until a position is opened strategy.entry("long", strategy.long, stop = longEntry, qty = qtyLong2) //sets up or stop loss order by price specified in our actualLExit2 variable strategy.exit("Stoploss-Long", "long", stop=actualLExit2) //Open a stop market order at our short entry price and keep it there at the quantity specified. This order is updated/changed on each new candlestick until a position is opened strategy.entry("short", strategy.short, stop = shortEntry, qty = qtyShort2) //sets up or stop loss order by price specified in our actualLExit2 variable strategy.exit("Stoploss-Short", "short", stop=actualSExit2)