Strategie für einen doppelten gleitenden durchschnittlichen Crossover und einen anhaltenden Aufwärtstrend

Schriftsteller:ChaoZhang, Datum: 2023-11-13 10:47:48
Tags:

img

Übersicht

Dies ist eine Handelsstrategie, bei der bewegte durchschnittliche Crossover-Muster zusammen mit anhaltendem Aufwärtstrend verwendet werden, um Trades einzugehen. Wenn der schnelle MA über den langsamen MA überschreitet, wird ein goldenes Crossover-Signal generiert. Wenn der Aufwärtstrend nach dem Crossover anhält, kann eine Long-Position eröffnet werden. Wenn der Preis auf den Stop-Loss- oder Take-Profit-Niveau steigt, kann die Position für Stop-Loss oder Take-Profit geschlossen werden.

Strategie Logik

Die Strategie basiert in erster Linie auf einem gleitenden Durchschnitts-Crossover für Einstiegssignale. Insbesondere werden ein schneller MA (MA1) und ein langsamer MA (MA2) definiert. Wenn der MA1 über den MA2 überschreitet, ist dies ein Signal, um lang zu gehen.

Um falsche Signale von kurzfristigen Crossovers zu vermeiden, wird ein Winkelschwellenwert hinzugefügt, so dass ein Kaufsignal nur ausgelöst wird, wenn der MA2-Winkel über einem festgelegten Schwellenwert liegt. Dies filtert einige nicht-trendige kurzfristige Rallyes aus.

Die Strategie setzt außerdem einen Stop Loss und einen Take Profit fest. Der Stop Loss vermeidet Verluste im Falle einer plötzlichen Umkehr des Marktes, während Take Profit-Schlösser in Gewinne gesetzt werden. Sie werden als Prozentsatzbereich vom Einstiegspreis festgelegt.

Wenn der Kurs steigt, um einen Gewinn zu erzielen, wird die Strategie lange für den Gewinn schließen.

Analyse der Vorteile

Dies ist eine einfache und intuitive Trendstrategie.

  1. MA-Combine filtert Marktgeräusche aus und schließt in Trendrichtung ein
  2. Winkelschwelle verhindert, dass sie durch kurzfristige Schwingungen irregeführt wird
  3. Zwei-Wege-Handel ermöglicht es, von den Märkten mit Bandbreite zu profitieren
  4. Risikopositionen, die sich auf die Risikopositionen beziehen

Risikoanalyse

Es gibt einige Risiken, die zu beachten sind:

  1. MAs haben Verzögerungen und können Wendepunkte verpassen
  2. Stop-Loss ist nicht garantiert, kann in schnellen Märkten geschlossen werden
  3. Der Double-Edge-Handel verdoppelt das Risiko, das Timing des Short-Entry ist der Schlüssel
  4. Eine schlechte Einstellung von Parametern wie MA-Perioden kann die Ergebnisse beeinträchtigen

Verbesserungsbereiche

Einige Möglichkeiten zur weiteren Optimierung der Strategie:

  1. Hinzufügen von Trendfiltern wie MACD, Bollinger, um die Genauigkeit zu verbessern
  2. Maschinelles Lernen zur dynamischen Optimierung von MA-Perioden
  3. Optimierung der Stop-Loss- und Take-Profit-Einstellungen, z. B. Trailing-Stops
  4. Zusatz der Positionsgröße zur Begrenzung von Verlusten
  5. Messtrendstärke mit ADX zur mittleren Umkehrposition

Schlussfolgerung

Im Allgemeinen ist dies ein einfacher und praktischer Trend nach der Strategie. Es hat Vorteile, aber auch Risiken. Weitere Verfeinerungen wie Parameter-Tuning, optimale Indikatoren, Stop-Loss-Einstellungen usw. können es verbessern. Aber keine Strategie beseitigt das systemische Risiko vollständig. Risikomanagement ist der Schlüssel für einen umsichtigen Handel.


/*backtest
start: 2023-11-05 00:00:00
end: 2023-11-12 00:00:00
period: 15m
basePeriod: 5m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//written by markjames12210@gmail.com
//@version=5
strategy(title="MJ-Dual Moving Average",initial_capital=10000,overlay=false)

// import TradingView/ZigZag/6 as ZigZagLib 

// // Create Zig Zag instance from user settings.
// var zigZag = ZigZagLib.newInstance(
//   ZigZagLib.Settings.new(
//       input.float(5.0, "Price deviation for reversals (%)", 0.00001, 100.0, 0.5, "0.00001 - 100"),
//       input.int(10, "Pivot legs", 2),
//       input(#2962FF, "Line color"),
//       input(true, "Extend to last bar"),
//       input(true, "Display reversal price"),
//       input(true, "Display cumulative volume"),
//       input(true, "Display reversal price change", inline = "priceRev"),
//       input.string("Absolute", "", ["Absolute", "Percent"], inline = "priceRev"),
//       true)
//  )

// // Update 'zigZag' object on each bar with new ​pivots, ​volume, lines, labels.
// zigZag.update()
// // plot(zigZag.pivots, "zigZag")

ma1= ta.sma(close,8)
ma2= ta.sma(close,21)

angleCriteria = input.int(title="Angle", defval=7, minval=1, maxval=13)

i_lookback   = input.int(2,     "Angle Period", minval = 1)
i_atrPeriod  = input.int(10,    "ATR Period",   minval = 1)
i_angleLevel = input.int(6,     "Angle Level",  minval = 1)
i_maSource   = input.source(close, "MA Source")
TP = input.float(1, "TP", minval = 0.1)
SL = input.float(1, "SL", minval = 0.1)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * math.atan((_src[0] - _src[_lookback]) / ta.atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)
plot(ta.atr(i_atrPeriod), "atr")
// plot(ma1,color=#FF0000)
// plot(ma2,color=#00FF00)

crosso=ta.crossover(ma1,ma2) 
crossu=ta.crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

atr_factor = 1
atr = ta.atr(i_atrPeriod)
e = atr * atr_factor 

afr = close 
afr := nz(afr[1], afr)

atr_factoryHigh = close + e
atr_factoryLow = close - e 

if atr_factoryLow > afr 
    afr := atr_factoryLow
if atr_factoryHigh < afr 
    afr := atr_factoryHigh

// plot(afr, "afr", display = display.data_window)
// plot(atr_factoryHigh, "afr", color = color.yellow, display = display.all)
// plot(atr_factoryLow, "afr", color = color.green, display = display.all)


inLong() => strategy.position_size > 0
inShort() => strategy.position_size < 0
inZero() => not inLong() and not inShort()

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)

plotshape(long, "Buy", shape.arrowup, location.belowbar, color = #FF0000)
plotshape(short, "Sell", shape.arrowdown, location.abovebar, color = #00FF00)

var longTp = 0.0
var longSl = 0.0
var shortTp = 0.0
var shortSl = 0.0
[b_middle, b_high, b_low] = ta.bb(close, 20, 2)
entry_price = strategy.opentrades.entry_price(0)

if inZero()
    if short
        longTp := close * (1 + TP/100)
        longSl := close * (1 - SL/100)
        strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))
    if long
        shortTp := close * (1 - TP/100)
        shortSl := close * (1 + SL/100)
        strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

if inLong()
    // if close - entry_price > close * 0.005
    //     longSl := entry_price + close * 0.001
    if high > longTp
        strategy.close("LONG")
        if (close - open) > close * 0.014
            shortTp := close * (1 - TP/100)
            shortSl := close * (1 + SL/100)
            strategy.entry("SHORT",strategy.short, comment = "tp:" + str.tostring(shortTp) + " sl:" + str.tostring(shortSl))

    if close < longSl
        strategy.close("LONG")
    if open >= b_high and close >= b_high
        strategy.close("LONG")
    // if high > b_high and entry_price < high
    //     strategy.close("LONG")


if inShort()
    // if entry_price - close > close * 0.005
    //     shortSl := entry_price - close * 0.001
    if low < shortTp
        strategy.close("SHORT")
        if (open - close) > close * 0.014
            longTp := close * (1 + TP/100)
            longSl := close * (1 - SL/100)
            strategy.entry("LONG",strategy.long, comment = "tp:" + str.tostring(longTp) + " sl:" + str.tostring(longSl))


    if close > shortSl
        strategy.close("SHORT")
    if open < b_low and close < b_low
        strategy.close("SHORT")
    // if low < b_low and entry_price > low
    //     strategy.close("SHORT")

Mehr