Dreifach gleitender Durchschnittswert nach Strategie

Schriftsteller:ChaoZhang, Datum: 2024-02-01 11:02:17
Tags:

img

Übersicht

Diese Strategie kombiniert das Konzept des Schildkrötenhandels mit der Niko Bakker-Phasenanalyse, wobei drei gleitende Durchschnitte verschiedener Zyklen verwendet werden, um die Trendrichtung für den Trend zu bestimmen.

Strategie Logik

  1. Berechnen Sie drei gleitende Durchschnitte verschiedener Zyklen: der schnelle gleitende Durchschnittszeitraum beträgt 8 Tage, der mittlere gleitende Durchschnittszeitraum 21 Tage und der langsame gleitende Durchschnittszeitraum 55 Tage.

  2. Bestimmung der Einstiegsbedingungen: Wenn der schnelle gleitende Durchschnitt über den mittleren gleitenden Durchschnitt überschreitet und alle drei gleitenden Durchschnitte einen Aufwärtstrend haben, geht es lang; wenn der schnelle gleitende Durchschnitt unter den mittleren gleitenden Durchschnitt überschreitet und alle drei gleitenden Durchschnitte einen Abwärtstrend haben, geht es kurz.

  3. Bestimmung der Ausstiegsbedingungen: Schließung von Positionen, wenn der schnelle gleitende Durchschnitt den mittleren gleitenden Durchschnitt in entgegengesetzte Richtung überschreitet.

  4. Positionsgröße: Verwenden Sie eine feste Positionsgröße, öffnen Sie jedes Mal einen Vertrag.

Analyse der Vorteile

  1. Die Verwendung von drei gleitenden Durchschnitten hilft, die Trendrichtung zu bestimmen und falsche Ausbrüche zu vermeiden.

  2. Der Trend für das Gewinnpotenzial folgt.

  3. Die Verwendung gleitender Durchschnitte führt zu stabilen Gewinnen und relativ geringen Abzügen.

  4. Eine kontrollierbare Stop-Loss-Strategie reduziert die Wahrscheinlichkeit großer Verluste.

Risikoanalyse

  1. Anfällig für mehrere kleine Verluste, was die Gewinneffizienz senkt.

  2. Die gleitenden Durchschnittswerte liegen zurück und können die Trendumkehrpunkte verfehlen.

  3. Die Festpositionsaufteilung kann Risiken nicht wirksam kontrollieren und kann bei erheblichen Marktschwankungen zu Margin Calls führen.

  4. Eine unsachgemäße Optimierung der Parameter führt zu einem Überhandel, zu erhöhten Handelskosten und zu Schwankungen.

Optimierung

  1. Optimierung der gleitenden Durchschnittsperioden für die Merkmale des Handelsinstruments.

  2. Verwenden Sie ATR, um die Positionsgröße dynamisch anzupassen.

  3. Fügen Sie eine Stop-Loss-Strategie hinzu.

  4. Einbeziehung von Handelsvolumenindikatoren zur Bestimmung der Zuverlässigkeit der Trends.

Zusammenfassung

Diese Strategie integriert traditionelle technische Indikatoren und die Philosophie des Schildkrötenhandels, wobei drei gleitende Durchschnitte verwendet werden, um Trends zu verfolgen. Mit der richtigen Optimierung der Parameter kann sie eine gute Rentabilität erzielen. Aber sie birgt auch einige Risiken. Stop-Loss, Positionsgröße und andere Maßnahmen müssen genutzt werden, um Risiken zu kontrollieren und langfristige stabile Gewinne aus dieser quantitativen Handelsstrategie zu erzielen.


/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL 
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JoshuaMcGowan

//@version=4

// 1. Define strategy settings
strategy(title="Triple Moving Average", overlay=true,
     pyramiding=0, initial_capital=1000,
     commission_type=strategy.commission.cash_per_order,
     commission_value=4, slippage=2)
     
fastMALen = input(title="Fast MA Length", type=input.integer, defval=8)
medMALen  = input(title="Medium MA Length", type=input.integer, defval=21)
slowMALen = input(title="Slow MA Length", type=input.integer, defval=55)

//endMonth = input(title="End Month Backtest", type=input.integer, defval=11)
//endYear  = input(title="End Year Backtest", type=input.integer, defval=2019)

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2016, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => true

usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc   = input(title="Risk %", type=input.float, defval=0.5, step=0.25)

// 2. Calculate strategy values
fastMA = sma(close, fastMALen)
medMA  = sma(close, medMALen)
slowMA = sma(close, slowMALen)

//Position Sizing
riskEquity  = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize     = usePosSize ? floor(riskEquity / atrCurrency) : 1

//Backtest Window
//tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0))

// 3. Determine long trading conditions
enterLong = crossover(fastMA, medMA) and
     (fastMA > slowMA) and (medMA > slowMA) and
     window() 

exitLong = crossunder(fastMA, medMA)

// 4. Code short trading conditions
enterShort = crossunder(fastMA, medMA) and
     (fastMA < slowMA) and (medMA < slowMA) and
     window() 

exitShort = crossover(fastMA, medMA)

// 5. Output strategy data
plot(series=fastMA, color=color.green, title="Fast MA")
plot(series=medMA, color=color.purple, title="Medium MA")
plot(series=slowMA, color=color.red, title="Slow MA",
     linewidth=2)
     
bgColour =
     enterLong and (strategy.position_size < 1) ? color.green :
     enterShort and (strategy.position_size > -1) ? color.red :
     exitLong and (strategy.position_size > 0) ? color.lime :
     exitShort and (strategy.position_size < 0) ? color.orange :
     na

bgcolor(color=bgColour, transp=85)

// 6. Submit entry orders
if (enterLong)
    strategy.entry(id="EL", long=true, qty=1)

if (enterShort)
    strategy.entry(id="ES", long=false, qty=1)

// 7. Submit exit orders
strategy.close_all(when=exitLong and
     (strategy.position_size > 0))
strategy.close_all(when=exitShort and
     (strategy.position_size < 0))

strategy.close_all(when=not window())

//END

Mehr