Die Ressourcen sind geladen. Beförderung...

Fünffach starke gleitende Durchschnittsstrategie

Schriftsteller:ChaoZhang, Datum: 2024-05-23 18:14:35
Tags:EMAWMASMATMAVARWWMAZLEMATSF

img

Übersicht

Die Quintuple Strong Moving Average Strategie ist eine Handelsstrategie, die auf mehreren gleitenden Durchschnitten basiert. Diese Strategie verwendet 5 gleitende Durchschnitte verschiedener Zeitrahmen und Arten, um starke Trends auf dem Markt zu identifizieren. Die ersten 3 gleitenden Durchschnitte sind die Kernkomponenten der Strategie, die hauptsächlich für die Trendenkennung und Signalgenerierung verwendet werden, während die 4. und 5. gleitenden Durchschnitte hauptsächlich für Hilfsurteile und visuelle Analyse verwendet werden.

Durch eine umfassende Betrachtung der Trends und relativen Positionsbeziehungen von gleitenden Durchschnitten verschiedener Zeitrahmen und Typen kann diese Strategie die aktuelle Trendrichtung und -stärke des Marktes genau bestimmen und die Positionen entsprechend den Veränderungen des Trends rechtzeitig anpassen, um eine gute Rentabilität zu erzielen.

Strategieprinzip

Bei dieser Strategie werden 5 gleitende Durchschnitte verschiedener Zeitrahmen und Arten verwendet, nämlich:

  1. Gleitender Durchschnitt der Stufe 1: angepasste Anzeige, Etikett, Datenquelle, Zeitrahmen, Länge, Zeilenbreite, Farbe und Typ.
  2. Gleitender Durchschnitt der Stufe 2: angepasste Anzeige, Etikett, Datenquelle, Zeitrahmen, Länge, Zeilenbreite, Farbe und Typ.
  3. Gleitender Durchschnitt der Stufe 3: angepasste Anzeige, Etikett, Datenquelle, Zeitrahmen, Länge, Zeilenbreite, Farbe und Typ.
  4. Gleitender Durchschnitt der Stufe 4: hauptsächlich für Hilfsurteile, anpassbare Anzeige, Etikett, Datenquelle, Zeitrahmen, Länge, Linienbreite und Farbe verwendet.
  5. Gleitender Durchschnitt der Stufe 5: hauptsächlich für Hilfsurteile, anpassbare Anzeige, Etikett, Datenquelle, Zeitrahmen, Länge, Linienbreite und Farbe verwendet.

Die Typen dieser 5 gleitenden Durchschnittswerte können flexibel festgelegt werden, darunter SMA, EMA, WMA, TMA, VAR, WWMA, ZLEMA, TSF und weitere 8 Typen.

Die Kernidee dieser Strategie besteht darin, die Trendrichtung und -stärke anhand mehrerer Trendbestätigungen von gleitenden Durchschnitten unterschiedlicher Zeitrahmen und Typen zu bestimmen:

  • Wenn der Schlusskurs über den gleitenden Durchschnitten der Ebenen 1, 2 und 3 liegt, gehen Sie lang;
  • Wenn der Schlusskurs unterhalb der gleitenden Durchschnitte der Stufen 1, 2 und 3 liegt, wird kurz gehandelt;
  • Bei Halten einer Long-Position, wenn der Schlusskurs unter die gleitenden Durchschnitte der Stufen 1 und 2 fällt, wird die Long-Position geschlossen;
  • Bei Halten einer Short-Position, wenn der Schlusskurs über den gleitenden Durchschnitten der Stufen 1 und 2 steigt, wird die Short-Position geschlossen.

Darüber hinaus wird diese Strategie die Farbe der Leuchter nach der aktuellen Position anzeigen:

  • Bei Halte einer Long-Position ist der Leuchter grün;
  • Bei Halten einer Short-Position ist der Leuchter rot;
  • In anderen Fällen ist der Leuchter grau.

Strategische Vorteile

  1. Diese Strategie verwendet eine Kombination aus mehreren mittelfristigen und langfristigen gleitenden Durchschnitten zur Bestimmung von Trends, mit einer starken Trendenerkennungsfähigkeit, die die wichtigsten Markttrends effektiv erfassen kann.
  2. Die Parameter dieser Strategie können flexibel festgelegt werden, einschließlich der Art, des Zeitrahmens, der Dauer der gleitenden Durchschnitte usw., die je nach den verschiedenen Merkmalen des Marktes und den Präferenzen der Anleger optimiert werden können.
  3. Anpassungsfähigkeit an verschiedene Märkte. Diese Strategie basiert hauptsächlich auf der Preisbewegung selbst, mit starker Anpassungsfähigkeit an die Märkte, und kann in mehreren Märkten wie Aktien, Futures, Devisen, Kryptowährungen usw. verwendet werden.
  4. Die Kernlogik dieser Strategie ist einfach und klar, leicht zu verstehen und umzusetzen, ohne zu komplexe mathematische Modelle zu benötigen.

Strategische Risiken

  1. Diese Strategie funktioniert im Allgemeinen auf den Märkten mit geringen Verlusten, was zu einem Rückgang des Nettogewinns führt.
  2. Parameteroptimierungsrisiko. Diese Strategie verwendet viele Parameter. Wenn nicht ausreichend historische Daten-Backtesting und Parameteroptimierung durchgeführt werden, kann dies zu größeren Drawdowns im zukünftigen Live-Handel führen.
  3. Trendumkehrrisiko. Diese Strategie eignet sich hauptsächlich für Trendmärkte. Sobald der Markttrend umgekehrt ist, kann diese Strategie weiterhin in der ursprünglichen Trendrichtung gehandelt werden und Verluste verursachen.

Zur Verringerung der oben genannten Risiken können folgende Verbesserungen in Betracht gezogen werden:

  1. Hinzufügen von Markterkennungs- und Beurteilungslogik, um die Anzahl der Trades in nicht-trendigen Märkten zu reduzieren.
  2. Es werden ausreichende Parameteroptimierungstests für diese Strategie durchgeführt, um eine solide optimale Parameterkombination zu finden.
  3. Es kann jedoch auch die Möglichkeit geben, die Risiken für den Verkauf und den Verkauf zu überwachen, um die Risiken zu überwachen.

Strategieoptimierungsrichtlinien

  1. Einführung mehrer Trendbestätigungsindikatoren wie MACD, DMI usw., um die Genauigkeit der Trendbeurteilung zu verbessern.
  2. Für Bereichsgebundene Märkte sollte eine Betriebslogik eingeführt werden, die sich an die Bereichsgebundenen Märkte anpassen kann, wie z. B. den Netthandel.
  3. Für verschiedene Merkmale des Marktes werden die Parameter der Strategie separat optimiert, um die Anpassungsfähigkeit zu verbessern.
  4. Diese Strategie sollte mit anderen Strategien kombiniert werden, z. B. einer Kombination von Trendstrategie + Rangebound-Strategie, Trendstrategie + Countertrend-Strategie usw., um die Robustheit der Strategie zu verbessern.

Zusammenfassung

Die Quintuple Strong Moving Average Strategie ist eine Handelsstrategie, die auf mehreren Trendbestätigungen basiert. Durch die umfassende Berücksichtigung der Trends und relativen Positionsbeziehungen von gleitenden Durchschnitten verschiedener Zeitrahmen und Arten kann sie die aktuelle Trendrichtung und Stärke des Marktes relativ genau bestimmen und die Positionen entsprechend den Trendänderungen rechtzeitig anpassen. Die Strategie-Logik ist einfach und klar, die Parameter sind flexibel und anpassbar und sie ist an mehrere Märkte angepasst. Sie führt jedoch im Allgemeinen eingehende Range-Märkte aus, und es gibt bestimmte Parameteroptimierungsrisiken und Trendumkehrrisiken. In Zukunft können wir in Betracht ziehen, mehr Indikatoren einzuführen, Parameter zu optimieren, Betriebslogik für Range-Märkte hinzuzufügen und sie mit anderen Arten von Strategien zu kombinieren, um die Robustheit und Rentabilität dieser Strategie weiter zu verbessern.


/*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)


Verwandt

Mehr