Mehrfache Handelsstrategie für gleitende Durchschnitte

Schriftsteller:ChaoZhang, Datum: 2024-02-29 14:32:29
Tags:

img

Übersicht

Die Strategie trägt den Namen Multiple Moving Average Trading Strategy. Sie nutzt die Überschneidung des MACD-Indikators und mehrerer gleitender Durchschnitte als Handelssignale, mit Hilfe des ZLSMA-Indikators, um den Trend zu bestimmen, und setzt die Gewinn- und Stop-Loss-Exit-Logik, um den automatisierten Handel zu realisieren.

Strategieprinzip

  1. Berechnen Sie die schnelle Linie, die langsame Linie und das MACD-Histogramm des MACD-Indikators. Lange setzen, wenn Sie ein goldenes Kreuz sehen, und kurz, wenn Sie ein Todeskreuz sehen.

  2. Berechnen Sie die gleitenden Durchschnitte von 5 Tagen, 25 Tagen, 45 Tagen und 100 Tagen. Je länger der gleitende Durchschnitt ist, desto stärker ist die Trendsustabilität, die er darstellt.

  3. Berechnen Sie den Abstand zwischen den beiden Gruppen von gleitenden Durchschnitten. Wenn der Abstand einen bestimmten Schwellenwert überschreitet, bedeutet dies die Divergenz der gleitenden Durchschnitte, die als Handelssignale festgelegt werden können.

  4. Berechnen Sie den ZLSMA-Indikator, der die mittelfristige bis langfristige Trendrichtung des Preises darstellt.

  5. Kombinieren Sie den MACD-Crossover, gleitende Durchschnittsdivergenzsignale und ZLSMA-Trendbeurteilung, um lange und kurze Handelsstrategien zu setzen.

  6. Stellen Sie Profit- und Stop-Loss-Punkte fest, um eine automatisierte Ausstiegslogik zu realisieren.

Analyse der Vorteile

  1. Multi-Filter-Signale verbessern die Strategieeffizienz. MACD und gleitende Durchschnittsdivergenzsignale können sich gegenseitig überprüfen, um falsche Ausbrüche zu vermeiden.

  2. Die ZLSMA trägt zur Bestimmung der mittelfristigen und langfristigen Trendrichtung bei, um einen gegen den Trend gerichteten Handel zu vermeiden.

  3. Automatisiertes Ausscheiden durch Festlegen von Gewinn- und Stop-Loss-Punkten reduziert die Häufigkeit menschlicher Interventionen.

Risikoanalyse

  1. Bei falschen Parameter-Einstellungen kann es zu Überhandelungen oder fehlenden Aufträgen kommen.

  2. Festgelegte Gewinn- und Stop-Loss-Punkte begrenzen das Gewinnpotenzial oder erhöhen die Verluste.

  3. Bei Märkten mit geringer Bandbreite funktionieren gleitende Durchschnittsstrategien nur schlecht.

Optimierungsrichtlinien

  1. Optimieren Sie Kombinationen von gleitenden Durchschnittsparametern, indem Sie gleitende Durchschnittswerte unterschiedlicher Länge testen.

  2. Prüfung mit Hinzufügung anderer Indikatoren wie KDJ und BOLL zur Bestimmung der Ein- und Ausstiegspunkte.

  3. Versuchen Sie dynamische Stop-Loss-Strategien auf Basis von Volatilitätsmaßnahmen.

  4. Fügen Sie maschinelle Lernmodelle hinzu, um automatisch optimale Parameter zu finden.

Schlussfolgerung

Diese Strategie integriert MACD, mehrere gleitende Durchschnitte und ZLSMA-Trendbestimmung, um einen automatisierten Handel zu erreichen. Durch das Filtern mit mehreren Signalen wird die Strategie-Stabilität verbessert; durch das Setzen der Ausgangslogik werden Risiken reduziert. Es gibt einen gewissen praktischen Wert für den realen Handel. Nachfolgende Parameteroptimierung, Indikator-Erweiterung, dynamische Stops usw. können die Strategieleistung weiter verbessern.


/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("MACD ZLSMA_izumi⑤(4つの条件、MCDがクロスしてたら)", overlay=true)

fast_length = input(title = "Fast Length", defval = 12)
slow_length = input(title = "Slow Length", defval = 26)
src = input(title = "Source", defval = close)
signal_length = input.int(title = "Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title = "Oscillator MA Type",  defval = "EMA", options = ["SMA", "EMA"])
sma_signal = input.string(title = "Signal Line MA Type", defval = "EMA", options = ["SMA", "EMA"])
// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal

alertcondition(hist[1] >= 0 and hist < 0, title = 'Rising to falling', message = 'The MACD histogram switched from a rising to falling state')
alertcondition(hist[1] <= 0 and hist > 0, title = 'Falling to rising', message = 'The MACD histogram switched from a falling to rising state')

hline(0, "Zero Line", color = color.new(#787B86, 50))
plot(hist, title = "Histogram", style = plot.style_columns, color = (hist >= 0 ? (hist[1] < hist ? #26A69A : #B2DFDB) : (hist[1] < hist ? #FFCDD2 : #FF5252)))
plot(macd,   title = "MACD",   color = #2962FF)
plot(signal, title = "Signal", color = #FF6D00)

//MACDクロス設定
enterLong = ta.crossover(macd, signal)
enterShort = ta.crossunder(macd, signal)

//移動平均線の期間を設定
ema5 = input(5, title="ma期間5")
ema25 = input(25, title="ma期間25")
ema45 = input(45, title="ma期間45")
ema100 = input(100, title="ma期間100")

//移動平均線を計算
//sma関数で「ema25」バー分のcloseを移動平均線として「Kema」に設定
Kema5 = ta.sma(close,ema5)
Kema25 = ta.sma(close,ema25)
Kema45 = ta.sma(close,ema45)
Kema100 = ta.sma(close,ema100)



//移動平均線をプロット
plot(Kema5, color=color.rgb(82, 249, 255),title="ema5")
plot(Kema25, color=color.red,title="ema25")
plot(Kema45, color=color.blue,title="ema45")
plot(Kema100, color=color.green,title="ema100")

//ema同士の距離が30以上の時に「distancOK」にTureを返す
//distance1 = math.abs(Kema5-Kema25)
distance2 = math.abs(Kema25-Kema45)
distanceValue1 = input(0.030, title ="ema同士の乖離値") 
//distanceOk1 = distance1 > distanceValue1
distanceOk2 = distance2 > distanceValue1

//2区間のema同士の距離が30以上の時に「distanceOKK」にTrueを返す
//distanceOkK1 = distanceOk1 and distanceOk2
distanceOkK1 = distanceOk2

//5EMAとロウソクの乖離判定
//DistanceValue5ema = input(0.03, title ="5emaとロウソクの乖離率")
//emaDistance = math.abs(Kema5 - close)
//emaDistance5ema = emaDistance < DistanceValue5ema

//ZLSMA追加のコード
length = input.int(32, title="Length")
offset = input.int(0, title="offset")
src2 = input(close, title="Source")
lsma = ta.linreg(src2, length, offset)
lsma2 = ta.linreg(lsma, length, offset)
eq= lsma-lsma2
zlsma = lsma+eq
//ZLSMAのプロット
plot(zlsma, color=color.yellow, linewidth=3)

//ZLSMAの前回高値を検索
//var float zlsmaHigh = na
//var float zlsmaHighValue = na
//if ta.highest(zlsma,35) == zlsma[3]
//    zlsmaHighValue := zlsmaHigh
//    zlsmaHigh := zlsma[3]

//if (na(zlsmaHighValue))
 //   zlsmaHighValue := zlsmaHigh

//ZLSMAの前回安値を検索
//var float zlsmaLow = na
//var float zlsmaLowValue = na
//if ta.lowest(zlsma,35) == zlsma[3]
//    zlsmaLowValue := zlsmaLow
//    zlsmaLow := zlsma[3]

///if (na(zlsmaLowValue))
//    zlsmaLowValue := zlsmaLow

//利確・損切りポイントの初期化(変数の初期化)
var longProfit = 0.0
var longStop = 0.0
var shortProfit = 0.0
var shortStop = 0.0

//inputで設定画面の選択項目を設定
longProfitValue = input(0.06, title ="ロング利確pips")
shortProfitValue = input(-0.06, title ="ショート利確pips")
longStopValue = input(-0.06, title ="ロング損切pips")
shortStopValue = input(0.06, title ="ショート損切pips")

// クロスの強さを推定 
//angleThreshold = input(0.001, title = "クロスの強さ調節" )

// クロスの強さの閾値、この値を調整してクロスの強さの基準を変える 
//macdDiff = macdLine - signalLine 
//strongCross = math.abs(macdDiff) > angleThreshold 

// エントリー条件 (MACDラインとシグナルラインがクロス)
//ta.crossover(macdLine, signalLine) and strongCross 


//ロングエントリー条件
if  distanceOkK1 and enterLong
	strategy.entry("long", strategy.long, comment="long")
    longProfit := close + longProfitValue
    longStop := close + longStopValue

//    if na(strategy.position_avg_price) and close>strategy.position_avg_price + 0.05 * syminfo.mintick 
 //       longStop := strategy.position_avg_price + 10 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)

strategy.exit("exit", "long", limit = longProfit,stop = longStop)


if  distanceOkK1 and enterShort
	strategy.entry("short", strategy.short, comment="short")
    shortProfit := close + shortProfitValue
    shortStop := close + shortStopValue

 //   if na(strategy.position_avg_price) and close>strategy.position_avg_price - 0.05 * syminfo.mintick 
  //      shortStop := strategy.position_avg_price - 0.1 * syminfo.mintick
  //  strategy.exit("exit", "long",stop = longStop)


strategy.exit("exit", "short", limit = shortProfit,stop = shortStop)
//plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr)

Mehr