Fünffach starke gleitende Durchschnittsstrategie

EMA WMA SMA TMA VAR WWMA ZLEMA TSF
Erstellungsdatum: 2024-05-23 18:14:35 zuletzt geändert: 2024-05-23 18:14:35
Kopie: 3 Klicks: 303
1
konzentrieren Sie sich auf
1214
Anhänger

Fünffach starke gleitende Durchschnittsstrategie

Überblick

Die 5-fache Moving-Average-Strategie ist eine Handelsstrategie, die auf mehreren Moving-Averagen basiert. Die Strategie nutzt 5 verschiedene Perioden und Arten von Moving-Averagen, um starke Trends in den Märkten zu identifizieren. Die ersten 3 Moving-Averagen sind ein zentraler Bestandteil der Strategie und dienen hauptsächlich der Trenderkennung und Signalgenerierung.

Durch die integrierte Berücksichtigung der Bewegungen und der relativen Positionsbeziehungen zwischen den verschiedenen Perioden und Arten von Moving Averages kann die Strategie die Richtung und Stärke der aktuellen Trends in den Märkten genauer bestimmen und die Positionen zeitnah an die Veränderungen der Trends anpassen, um eine bessere Gewinnwirkung zu erzielen.

Strategieprinzip

Die Strategie verwendet 5 verschiedene Perioden und Arten von Moving Averages, die wie folgt sind:

  1. Level 1 Moving Average: Anzeige, Etiketten, Datenquelle, Zeitrahmen, Länge, Linienbreite, Farbe und Typ können angepasst werden.
  2. Die zweite Ebene des Moving Averages: Anzeige, Etiketten, Datenquelle, Zeitrahmen, Länge, Linienbreite, Farbe und Typ können angepasst werden.
  3. Ebene 3: Anzeige, Etiketten, Datenquelle, Zeitrahmen, Länge, Linienbreite, Farbe und Typ können angepasst werden.
  4. Level IV Moving Average: hauptsächlich zur Unterstützung der Beurteilung, mit anpassbaren Anzeigen, Tags, Datenquellen, Zeitrahmen, Längen, Linienbreiten und Farben.
  5. Level 5 Moving Average: hauptsächlich zur Unterstützung der Beurteilung, mit Anzeige, Etiketten, Datenquellen, Zeitrahmen, Länge, Linienbreite und Farbe.

Es gibt fünf Arten von Moving Averages, die flexibel eingestellt werden können, darunter SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA und TSF.

Die Kernidee der Strategie ist die Verwendung von mehreren Trendbestätigungen für verschiedene Perioden und Arten von Moving Averages, um die Richtung und Stärke von Trends zu bestimmen:

  • Wenn der Schlusskurs oberhalb der Moving Averages der Stufen 1, 2 und 3 liegt, dann tun Sie mehr.
  • Die Kurse werden unterhalb der oberen Ebenen 1, 2 und 3 gehalten.
  • Wenn Sie bereits eine Überposition halten, schließen Sie die Position, wenn die Schlusskosten unter den gleitenden Durchschnittswerten der Ebenen 1 und 2 fallen.
  • Wenn die Schließungskursbrecher die gleitenden Durchschnittswerte der Ebenen 1 und 2 durchbrechen, ist die Position leer.

Außerdem zeigt die Strategie die Farbe der K-Linie an, die auf der aktuellen Positionshaltung basiert:

  • Die K-Linie ist grün, wenn Sie mehrere Positionen halten.
  • Die K-Linie ist rot, wenn die Position leer ist.
  • In anderen Fällen ist die K-Linie grau.

Strategische Vorteile

  1. Die Strategie nutzt mehrere Kombinationen von mittleren und langen Moving Averages, um Trends zu beurteilen. Die Trenderkennung ist stark und kann die wichtigsten Trends des Marktes effektiv erfassen.
  2. Die Parameter der Strategie können flexibel eingestellt werden, einschließlich der Art, der Periode und der Dauer des Moving Averages. Sie können für verschiedene Markteigenschaften und Anlegerpräferenzen optimiert werden.
  3. Die Strategie ist für mehrere Märkte geeignet. Die Trendbeurteilung der Strategie basiert hauptsächlich auf der Preisentwicklung selbst. Die Strategie ist für mehrere Märkte geeignet, z. B. für Aktien, Futures, Devisen und Kryptowährungen.
  4. Die Kernlogik der Strategie ist einfach, leicht zu verstehen und zu implementieren, ohne überkomplexe mathematische Modelle zu benötigen.

Strategisches Risiko

  1. Die Strategie wird in der Regel in einem beunruhigenden Markt ausgeführt und kann zu einem größeren Anteil an kleineren Verlustgeschäften führen, was zu einem Rückgang der Nettoerträge führt.
  2. Das Risiko der Parameteroptimierung. Die Strategie verwendet mehr Parameter und kann zu einem größeren Rückzug in den zukünftigen Real-Stock-Handel führen, wenn keine ausreichende Rückvergleiche der historischen Daten und Parameteroptimierung durchgeführt werden.
  3. Trendwechselrisiko. Diese Strategie gilt hauptsächlich für Trendbewegungen. Wenn sich die Markttrends umkehren, kann die Strategie weiterhin in der ursprünglichen Trendrichtung handeln und Verluste verursachen.

Um diese Risiken zu verringern, können folgende Verbesserungen in Betracht gezogen werden:

  1. Die Logik der Erfassung und Beurteilung von Marktschwankungen reduziert die Anzahl der Transaktionen in nicht-trendigen Situationen.
  2. Eine ausreichende Parameteroptimierung der Strategie wird getestet, um eine robuste optimale Kombination von Parametern zu finden.
  3. Setzen Sie eine angemessene Stop-Loss-Leistung, um das maximale Risiko für einen einzelnen Handel zu kontrollieren. Gleichzeitig können Sie mit anderen Indikatoren oder Signalen eine Trendwende bestätigen und Ihre Position rechtzeitig anpassen.

Richtung der Strategieoptimierung

  1. Die Einführung von mehr Trendbestätigungsindikatoren wie MACD, DMI usw. erhöht die Genauigkeit der Trendbeurteilung.
  2. Für die Schaukel-Markt, kann man überlegen, die Einführung von Operationslogik, die Schaukel-Situationen anpassen kann, wie z.B. Gitter-Handel.
  3. Die Parameter der Strategie können für verschiedene Markteigenschaften optimiert werden, um die Anpassungsfähigkeit zu verbessern.
  4. Eine Kombination dieser Strategie mit anderen Strategien, wie z. B. einer Kombination aus Trendstrategie + Schockstrategie oder einer Kombination aus Trendstrategie + Gegenwärtigkeitsstrategie, kann in Betracht gezogen werden, um die Stabilität der Strategie zu verbessern.

Zusammenfassen

Die Strategie ist schlicht und klar, die Parameter sind flexibel anpassbar und passen sich an mehrere Märkte an. Die Strategie ist jedoch in den bewegten Märkten allgemein, und es gibt ein gewisses Risiko für die Optimierung von Parametern und das Risiko für Trendwechsel. In Zukunft kann man die Einführung von mehreren Indikatoren, Optimierungsparametern, die Erhöhung der Betriebslogik für bewegte Märkte und andere Arten von Strategien in Kombination mit anderen Strategien in Betracht ziehen, um die Stabilität und Profitabilität der Strategie weiter zu verbessern.

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

//@version=5
strategy("Quintuple Strong Moving Average Strategy","QuisMa", overlay=true, margin_long=100, margin_short=100)

// 1
mav1_show = input.bool(true, 'Show Plot', group='Level 1 ', inline='mav1_0')
mav1_label = input.bool(true, 'Show Label', group='Level 1 ', inline='mav1_0')
mav1_source = input.source(close, '', group='Level 1 ', inline='mav1_1')
mav1_timeframe = input.timeframe('5', '', group='Level 1 ', inline='mav1_1')
mav1_length = input.int(50, 'Length', group='Level 1 ', inline='mav1_3')
mav1_size = input.int(2000, 'Size', minval=1, group='Level 1 ', inline='mav1_3')
mav1_width = input.int(2, '', minval=0, group='Level 1 ', inline='mav1_2')
mav1_color = input.color(color.new(#ffd000, 0), '', group='Level 1 ', inline='mav1_2')
mav1_type = input.string(title='Moving Average Type 1', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 2
mav2_show = input.bool(true, 'Show Plot', group='Level 2', inline='mav2_0')
mav2_label = input.bool(true, 'Show Label', group='Level 2', inline='mav2_0')
mav2_source = input.source(close, '', group='Level 2', inline='mav2_1')
mav2_timeframe = input.timeframe('30', '', group='Level 2', inline='mav2_1')
mav2_length = input.int(50, 'Length', group='Level 2', inline='mav2_3')
mav2_size = input.int(2000, 'Size', minval=1, group='Level 2', inline='mav2_3')
mav2_width = input.int(2, '', minval=0, group='Level 2', inline='mav2_2')
mav2_color = input.color(color.new(#ffd000, 0), '', group='Level 2', inline='mav2_2')
mav2_type = input.string(title='Moving Average Type 2', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 3
mav3_show = input.bool(true, 'Show Plot', group='Level 3', inline='mav3_0')
mav3_label = input.bool(true, 'Show Label', group='Level 3', inline='mav3_0')
mav3_source = input.source(close, '', group='Level 3', inline='mav3_1')
mav3_timeframe = input.timeframe('60', '', group='Level 3', inline='mav3_1')
mav3_length = input.int(50, 'Length', group='Level 3', inline='mav3_3')
mav3_size = input.int(2000, 'Size', minval=1, group='Level 3', inline='mav3_3')
mav3_width = input.int(2, '', minval=0, group='Level 3', inline='mav3_2')
mav3_color = input.color(color.new(#ffd000, 0), '', group='Level 3', inline='mav3_2')
mav3_type = input.string(title='Moving Average Type 3', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 4
mav4_show = input.bool(true, 'Show Plot', group='Level 4', inline='mav4_0')
mav4_label = input.bool(true, 'Show Label', group='Level 4', inline='mav4_0')
mav4_source = input.source(close, '', group='Level 4', inline='mav4_1')
mav4_timeframe = input.timeframe('480', '', group='Level 4', inline='mav4_1')
mav4_length = input.int(50, 'Length', group='Level 4', inline='mav4_3')
mav4_size = input.int(2000, 'Size', minval=1, group='Level 4', inline='mav4_3')
mav4_width = input.int(2, '', minval=0, group='Level 4', inline='mav4_2')
mav4_color = input.color(color.new(#ffd000, 0), '', group='Level 4', inline='mav4_2')
mav4_type = input.string(title='Moving Average Type 4', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])

// 5
mav5_show = input.bool(true, 'Show Plot', group='Level 5', inline='mav5_0')
mav5_label = input.bool(true, 'Show Label', group='Level 5', inline='mav5_0')
mav5_source = input.source(close, '', group='Level 5', inline='mav5_1')
mav5_timeframe = input.timeframe('720', '', group='Level 5', inline='mav5_1')
mav5_length = input.int(50, 'Length', group='Level 5', inline='mav5_3')
mav5_size = input.int(2000, 'Size', minval=1, group='Level 5', inline='mav5_3')
mav5_width = input.int(2, '', minval=0, group='Level 5', inline='mav5_2')
mav5_color = input.color(color.new(#ffd000, 0), '', group='Level 5', inline='mav5_2')
mav5_type = input.string(title='Moving Average Type 5', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])


// FUNCTIONS {{{
candle_size_ms = time - time[1]  // milliseconds of a candle

timetostring(tms) =>
    d_ = math.floor(tms / 86400)
    h_ = math.floor((tms - d_ * 86400) / 3600)
    m_ = math.floor((tms - d_ * 86400 - h_ * 3600) / 60)
    s_ = math.floor(tms - d_ * 86400 - h_ * 3600 - m_ * 60)
    ret = d_ > 0 ? str.tostring(d_) + ' D ' : ''
    ret += (h_ > 0 ? str.tostring(h_) + ' H ' : '')
    ret += (m_ > 0 ? str.tostring(m_) + ' m ' : '')
    if d_ == 0
        ret += (s_ > 0 ? str.tostring(s_) + ' s ' : '')
        ret
    ret

tftostring(tf) =>
    tfa = str.split(tf, '')
    tfalast = array.get(tfa, array.size(tfa) - 1)
    tfalastIsNum = na(str.tonumber(tfalast)) ? false : true
    txt = tfalastIsNum ? timetostring(str.tonumber(tf) * 60) : tf
    txt

htfLabel(htfy, tf, col) =>
    txt = tftostring(tf)
    htftxt = 'ᐊ ' + txt
    htftip = 'HTF  [ ' + txt + ' ] ' + str.tostring(htfy, '#.##')
    label.new(x=time + candle_size_ms * 2, y=htfy, xloc=xloc.bar_time, yloc=yloc.price, color=color.new(color.black, 100), textcolor=col, style=label.style_label_left, size=size.normal, text=htftxt, tooltip=htftip)

// Moving Averages Functions {{{
Var_Func(src, length) =>
    valpha = 2 / (length + 1)
    vud1 = src > src[1] ? src - src[1] : 0
    vdd1 = src < src[1] ? src[1] - src : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * src) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR

Wwma_Func(src, length) =>
    wwalpha = 1 / length
    WWMA = 0.0
    WWMA := wwalpha * src + (1 - wwalpha) * nz(WWMA[1])
    WWMA

Zlema_Func(src, length) =>
    zxLag = length / 2 == math.round(length / 2) ? length / 2 : (length - 1) / 2
    zxEMAData = src + src - src[zxLag]
    ZLEMA = ta.ema(zxEMAData, length)
    ZLEMA

Tsf_Func(src, length) =>
    lrc = ta.linreg(src, length, 0)
    lrc1 = ta.linreg(src, length, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(src, length, 0) + lrs
    TSF

getMA(src, length, mav_type) =>
    ma = 0.0
    if mav_type == 'SMA'
        ma := ta.sma(src, length)
    if mav_type == 'EMA'
        ma := ta.ema(src, length)
    if mav_type == 'WMA'
        ma := ta.wma(src, length)
    if mav_type == 'TMA'
        ma := ta.sma(ta.sma(src, math.ceil(length / 2)), math.floor(length / 2) + 1)
    if mav_type == 'VAR'
        ma := Var_Func(src, length)
    if mav_type == 'WWMA'
        ma := Wwma_Func(src, length)
    if mav_type == 'ZLEMA'
        ma := Zlema_Func(src, length)
    if mav_type == 'TSF'
        ma := Tsf_Func(src, length)
    ma

mav1 = request.security(syminfo.tickerid, mav1_timeframe, getMA(mav1_source, mav1_length, mav1_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav1_show ? mav1 : na, 'mav 1', color=mav1_color, linewidth=mav1_width, show_last=mav1_size)
var label mav1lbl = na
label.delete(mav1lbl)
mav1lbl := mav1_label ? htfLabel(mav1, mav1_timeframe, mav1_color) : na

mav2 = request.security(syminfo.tickerid, mav2_timeframe, getMA(mav2_source, mav2_length, mav2_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav2_show ? mav2 : na, 'mav 2', color=mav2_color, linewidth=mav2_width, show_last=mav2_size)
var label mav2lbl = na
label.delete(mav2lbl)
mav2lbl := mav2_label ? htfLabel(mav2, mav2_timeframe, mav2_color) : na

mav3 = request.security(syminfo.tickerid, mav3_timeframe, getMA(mav3_source, mav3_length, mav3_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav3_show ? mav3 : na, 'mav 3', color=mav3_color, linewidth=mav3_width, show_last=mav3_size)
var label mav3lbl = na
label.delete(mav3lbl)
mav3lbl := mav3_label ? htfLabel(mav3, mav3_timeframe, mav3_color) : na

mav4 = request.security(syminfo.tickerid, mav4_timeframe, getMA(mav4_source, mav4_length, mav4_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav4_show ? mav4 : na, 'mav 4', color=mav4_color, linewidth=mav4_width, show_last=mav4_size)
var label mav4lbl = na
label.delete(mav4lbl)
mav4lbl := mav4_label ? htfLabel(mav4, mav4_timeframe, mav4_color) : na

mav5 = request.security(syminfo.tickerid, mav5_timeframe, getMA(mav5_source, mav5_length, mav5_type), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
plot(mav5_show ? mav5 : na, 'mav 5', color=mav5_color, linewidth=mav5_width, show_last=mav5_size)
var label mav5lbl = na
label.delete(mav5lbl)
mav5lbl := mav5_label ? htfLabel(mav5, mav5_timeframe, mav5_color) : na

// Alış ve Satış Koşulları
alisKosulu = close > mav1 and close > mav2 and close > mav3
satisKosulu = close < mav1 and close < mav2 and close < mav3

// Alış ve Satış Sinyalleri
if (alisKosulu and not satisKosulu)
    strategy.entry("Alış", strategy.long)
if (satisKosulu and not alisKosulu)
    strategy.entry("Satış", strategy.short)

// Pozisyonları Kapatma Koşulları
if (strategy.opentrades > 0)
    if (close < mav1 and close < mav2 and strategy.position_size > 0)
        strategy.close("Alış")
    if (close > mav1 and close > mav2 and strategy.position_size < 0)
        strategy.close("Satış")

// Mum Rengi Ayarlama
longKosul = strategy.opentrades > 0 and strategy.position_size > 0
shortKosul = strategy.opentrades > 0 and strategy.position_size < 0

barcolor(longKosul ? color.green : shortKosul ? color.red : color.gray)