Die Ressourcen sind geladen. Beförderung...

Multi-Moving Average Crossover Trend nach Strategie mit Volatilitätsfilter

Schriftsteller:ChaoZhang, Datum: 2024-07-29 13:37:09
Tags:- Nein.EMASMAWMAVWMASMMARMA

img

Übersicht

Diese Strategie ist ein Trend-Following-Handelssystem, das auf mehreren gleitenden Durchschnitts-Crossovers und Volatilitätsfilterung basiert. Es verwendet drei gleitende Durchschnitte verschiedener Perioden, um Markttrends zu identifizieren, und verwendet einen vierten gleitenden Durchschnitt als Benchmark für die Bestimmung des Bullen-/Bärenmarktes. Die Strategie enthält auch einen Volatilitätsindikator als Handelsfilter, um den Handel in Umgebungen mit geringer Volatilität zu vermeiden. Sie unterstützt sowohl Long- als auch Short-Positionen und bietet flexibles Positionsmanagement und Stop-Loss-Mechanismen.

Strategieprinzipien

  1. Bewegliche Durchschnittswahl: Die Strategie verwendet drei Hauptbewegliche Durchschnittswerte (kurzfristige, mittelfristige und langfristige), um Trends zu bestimmen. Benutzer können aus sechs vordefinierten gleitenden Durchschnittswerten wählen, von denen jeder individuell mit Parametern wie Berechnungszeit, Datenquelle und Art (z. B. SMA, EMA) konfiguriert werden kann.

  2. Trendbestimmung:

    • Aufwärtstrend: Wenn die kurzfristige MA über der langfristigen MA liegt und die mittelfristige MA über der langfristigen MA überschreitet.
    • Bei der Berechnung der Risikopositionen wird der Wert der anfallenden Risikopositionen in den Risikopositionen der Kreditinstitute berücksichtigt.
  3. Bei der Bestimmung des Bullen-Bärenmarktes kann ein optionales viertes gleitendes Durchschnitt als Trennlinie für die Bullen- und die Bärenmärkte verwendet werden.

  4. Volatilitätsfilter: Es wird ein Volatilitätsindikator verwendet, der auf höchsten und niedrigsten Preisen basiert.

  5. Eintrittslogik:

    • Long Entry: Eintritt in eine Long-Position, wenn ein Aufwärtstrend bestätigt wird, die Volatilitätsbedingungen erfüllt sind und der Kurs über dem langfristigen MA liegt.
    • Short Entry: Eintritt in eine Short-Position, wenn sich ein Abwärtstrend bestätigt, die Volatilitätsbedingungen erfüllt sind und der Kurs unter dem langfristigen MA liegt.
  6. Ausgang Logik:

    • Teilweiser Ausstieg: Schließen eines bestimmten Prozentsatzes der Position, wenn sich der Trend umkehrt (mittelfristige MA überschreitet erneut die langfristige MA).
    • Full Exit: Schließen Sie alle Positionen in die entgegengesetzte Richtung, wenn der Kurs die Trennlinie zwischen Bullen und Bären überschreitet.
  7. Stop Loss: Benutzt einen festen Stop-Loss-Prozentsatz, der vom Benutzer angepasst werden kann.

  8. Positionsmanagement: Verwendet für jeden Handel einen festen Prozentsatz des Kontobetrags, der vom Benutzer angepasst werden kann.

Strategische Vorteile

  1. Mehrdimensionale Trendanalyse: Durch die Verwendung mehrerer gleitender Durchschnitte kann die Strategie Markttrends umfassender erfassen und falsche Signale reduzieren.

  2. Flexible Parameter-Konfiguration: Benutzer können verschiedene Parameter flexibel an die Merkmale verschiedener Märkte und Handelsinstrumente, einschließlich Art, Zeitraum und Datenquelle, anpassen.

  3. Volatilitätsfilterung: Durch die Einbeziehung eines Volatilitätsindikators kann die Strategie den Handel in Umgebungen mit geringer Volatilität vermeiden und die Signalqualität verbessern.

  4. Anpassung an den Bullen-/Bärenmarkt: Der optionale Mechanismus zur Bestimmung des Bullen-/Bärenmarktes ermöglicht es der Strategie, sich besser an verschiedene Marktumgebungen anzupassen, wodurch Gegentrendgeschäfte reduziert werden.

  5. Dynamisches Positionsmanagement: Die auf Aktien basierende Positionsmanagementmethode passt die Handelsgröße automatisch an, wenn sich die Kontogröße ändert.

  6. Mehrstufige Risikokontrolle: beinhaltet mehrere Risikokontrollmechanismen wie Volatilitätsfilterung, Trendbestätigung, teilweise Positionsschließung und fester Stop-Loss.

  7. Bidirektionale Handelsposition: Unterstützt sowohl Long- als auch Short-Positionen und ermöglicht Handelsmöglichkeiten unter verschiedenen Marktbedingungen.

  8. Visuelle Hilfsmittel: Die Strategie zeichnet verschiedene gleitende Durchschnitte und Handelssignal-Labels auf dem Chart, was eine intuitive Analyse und Backtesting erleichtert.

Strategische Risiken

  1. Verzögerungsart: Gleitende Durchschnitte sind von Natur aus Verzögerungsindikatoren, die zu leicht verzögerten Ein- und Ausstiegszeiten führen und die Rentabilität beeinträchtigen können.

  2. Schlechte Leistung in den unterschiedlichen Märkten: In seitlichen, unruhigen Märkten kann die Strategie häufig falsche Signale erzeugen, was zu Überhandel und Verlusten führt.

  3. Parameterempfindlichkeit: Die Performance der Strategie hängt stark von den Parameter-Einstellungen ab, und unterschiedliche Märkte und Zeitrahmen können unterschiedliche Parameterkombinationen erfordern.

  4. Abzugsrisiko: Bei Trendumkehrungen kann es vorkommen, dass die Strategie die Positionen nicht rechtzeitig vollständig beendet, was möglicherweise zu erheblichen Abzugsrisiken führt.

  5. Übermäßige Abhängigkeit von technischen Indikatoren: Die Strategie basiert vollständig auf technischen Indikatoren und ignoriert grundlegende Faktoren, die zu schlechten Leistungen bei wichtigen Nachrichten oder Ereignissen führen können.

  6. Geldmanagementrisiko: Die festgelegte Prozentsatz-Positionsgrößenmethode kann zu einem übermäßigen Risikopositionsrisiko bei aufeinanderfolgenden Verlusten führen.

  7. Stop-Loss-Einstellung: Der feste Prozentsatz-Stop-Loss ist möglicherweise nicht für alle Marktumgebungen geeignet und könnte in Zeiten hoher Volatilität zu vorzeitigen Ausstiegen führen.

Strategieoptimierungsrichtlinien

  1. Adaptive Parameter: Einführung von Adaptionsmechanismen zur dynamischen Anpassung der gleitenden Durchschnittsparameter und der Volatilitätsschwellen anhand der Marktbedingungen.

  2. Multi-Timeframe-Analyse: Informationen aus längeren und kürzeren Zeitrahmen einbeziehen, um die Genauigkeit der Trendbestimmung zu verbessern.

  3. Optimierung der Volatilitätsindikatoren: Für eine genauere Bewertung der Marktlage sollten anspruchsvollere Volatilitätsindikatoren wie ATR oder Bollinger Bandbreite verwendet werden.

  4. Momentum-Indikator-Integration: Kombinieren Sie Momentum-Indikatoren wie RSI oder MACD, um den Ein- und Ausstieg zu optimieren.

  5. Verbesserung des Stop-Loss-Mechanismus: Einführung von Trailing-Stops oder dynamischen ATR-basierten Stop-Loss-Mechanismen zur besseren Anpassung an die Marktvolatilität.

  6. Integration der Marktstimmung: Einbeziehung von Marktstimmungsindikatoren wie VIX zur Optimierung der Strategieleistung in verschiedenen Marktumgebungen.

  7. Optimierung des Positionsmanagements: Implementieren Sie eine dynamische Positionsgröße auf der Grundlage von Volatilität oder aktuellem Gewinn/Verlust zur besseren Risikokontrolle.

  8. Grundlegende Filter-Ergänzung: Es sind grundlegende Faktoren wie wichtige Wirtschaftsdaten oder Unternehmensergebnisberichte zu berücksichtigen, um den Handel in Risikoperioden zu vermeiden.

  9. Optimierung des maschinellen Lernens: Verwenden Sie Algorithmen des maschinellen Lernens, um Parameterkombinationen und Entscheidungsregeln zu optimieren und die Anpassungsfähigkeit der Strategie zu verbessern.

  10. Backtesting und Forward Testing: Umfassendere Backtesting und Forward Testing in verschiedenen Märkten und Zeiträumen durchführen, um die Robustheit der Strategie zu überprüfen.

Schlussfolgerung

Die Multi-Moving Average Crossover Trend Following Strategy mit Volatility Filter ist ein umfassendes und flexibles Handelssystem, das mehrere gleitende Durchschnitte, Volatilitätsindikatoren und Trend-Following-Prinzipien kombiniert. Durch mehrdimensionale Trendanalyse und strenge Risikokontrolle hat die Strategie das Potenzial, anhaltende Trends in verschiedenen Marktumgebungen zu erfassen. Allerdings müssen die Benutzer auf Parameteroptimierung und Anpassungsfähigkeit der Märkte achten und die Einführung fortschrittlicherer technischer Indikatoren und Risikomanagementtechniken in Betracht ziehen, um die Strategieleistung weiter zu verbessern. Insgesamt ist dies ein solider Strategierahmen, der eine gute Grundlage für weitere Forschung und Optimierung bietet.


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

//@version=5
strategy(title="WODIsMA Strategy", shorttitle="WMA_Strategy", overlay=true, overlay=true, pyramiding=2, default_qty_value=6, default_qty_type=strategy.fixed, initial_capital=1000, currency=currency.USD)

// 用户输入参数
capital_pct = input.float(20, title="每笔订单使用的资金百分比(%)", minval=0.1, maxval=100, group="Position") / 100
close_pct = input.float(20, title="每次平仓使用的百分比(%)", minval=0, maxval=100, group="Position") / 100
stop_loss_user = input.float(10, title="止损百分比(%)", minval=0, maxval=100, group="Position") / 100
allow_long = input.bool(true, title="是否做多", group="Position")
allow_short = input.bool(true, title="是否做空", group="Position")

// 用户选择的移动平均线
short_term_ma = input.string("MA 0", title="短期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
mid_term_ma = input.string("MA 1", title="中期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
long_term_ma = input.string("MA 2", title="长期趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
bull_bear_ma = input.string("MA 3", title="牛熊趋势均线", options=["MA 0", "MA 1", "MA 2", "MA 3", "MA 4", "MA 5"], group="TrendIdentify")
enable_bull_bear = input.bool(false, title="是否启用牛熊趋势线", group="TrendIdentify")
// 波动率指标参数
volatility_k = input.int(60, title="波动率数值K线数" , group="volatility")
volatility_threshold = input.float(1, minval=0, title="波动率值 0则不使用(%)", group="volatility")

// 定义不同类型的移动平均线函数
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)

// 定义每根均线的输入参数和颜色
length0 = input.int(16, minval=1, title="Length 0", group="MA 0")
source0 = input.source(hl2, title="Source 0", group="MA 0")
type0 = input.string("SMA", title="Type 0", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 0")
timeframe0 = input.timeframe("", title="Timeframe 0", group="MA 0")
color0 = input.color(color.gray, title="Color 0", group="MA 0")
show0 = input.bool(true, title="Show MA 0", group="MA 0")

length1 = input.int(48, minval=1, title="Length 1", group="MA 1")
source1 = input.source(hl2, title="Source 1", group="MA 1")
type1 = input.string("SMA", title="Type 1", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 1")
timeframe1 = input.timeframe("", title="Timeframe 1", group="MA 1")
color1 = input.color(color.aqua, title="Color 1", group="MA 1")
show1 = input.bool(true, title="Show MA 1", group="MA 1")

length2 = input.int(144, minval=1, title="Length 2", group="MA 2")
source2 = input.source(hl2, title="Source 2", group="MA 2")
type2 = input.string("SMA", title="Type 2", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 2")
timeframe2 = input.timeframe("", title="Timeframe 2", group="MA 2")
color2 = input.color(color.orange, title="Color 2", group="MA 2")
show2 = input.bool(true, title="Show MA 2", group="MA 2")

length3 = input.int(432, minval=1, title="Length 3", group="MA 3")
source3 = input.source(hl2, title="Source 3", group="MA 3")
type3 = input.string("SMA", title="Type 3", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 3")
timeframe3 = input.timeframe("", title="Timeframe 3", group="MA 3")
color3 = input.color(color.green, title="Color 3", group="MA 3")
show3 = input.bool(true, title="Show MA 3", group="MA 3")

length4 = input.int(91, minval=1, title="Length 4", group="MA 4")
source4 = input.source(hl2, title="Source 4", group="MA 4")
type4 = input.string("SMA", title="Type 4", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 4")
timeframe4 = input.timeframe("D", title="Timeframe 4", group="MA 4")
color4 = input.color(color.rgb(159, 110, 208), title="Color 4", group="MA 4") // 浅紫色
style4 = input.string("step", title="Style 4", options=["line", "step"], group="MA 4")
show4 = input.bool(false, title="Show MA 4", group="MA 4")

length5 = input.int(182, minval=1, title="Length 5", group="MA 5")
source5 = input.source(hl2, title="Source 5", group="MA 5")
type5 = input.string("SMA", title="Type 5", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="MA 5")
timeframe5 = input.timeframe("D", title="Timeframe 5", group="MA 5")
color5 = input.color(color.red, title="Color 5", group="MA 5")
style5 = input.string("step", title="Style 5", options=["line", "step"], group="MA 5")
show5 = input.bool(true, title="Show MA 5", group="MA 5")

// 计算每根均线的值
value0 = request.security(syminfo.tickerid, timeframe0, ma(source0, length0, type0))
value1 = request.security(syminfo.tickerid, timeframe1, ma(source1, length1, type1))
value2 = request.security(syminfo.tickerid, timeframe2, ma(source2, length2, type2))
value3 = request.security(syminfo.tickerid, timeframe3, ma(source3, length3, type3))
value4 = request.security(syminfo.tickerid, timeframe4, ma(source4, length4, type4))
value5 = request.security(syminfo.tickerid, timeframe5, ma(source5, length5, type5))

// 绘制每根均线
plot(show0 ? value0 : na, title="MA 0", color=color0)
plot(show1 ? value1 : na, title="MA 1", color=color1)
plot(show2 ? value2 : na, title="MA 2", color=color2)
plot(show3 ? value3 : na, title="MA 3", color=color3)
plot(show4 ? value4 : na, title="MA 4", color=color4, style=style4 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)
plot(show5 ? value5 : na, title="MA 5", color=color5, style=style5 == "step" ? plot.style_stepline : plot.style_line, linewidth=2)

// 添加策略部分

// 选择均线值
get_ma_value(ma_name) =>
    if (ma_name == "MA 0")
        value0
    else if (ma_name == "MA 1")
        value1
    else if (ma_name == "MA 2")
        value2
    else if (ma_name == "MA 3")
        value3
    else if (ma_name == "MA 4")
        value4
    else
        value5

short_ma_value = get_ma_value(short_term_ma)
mid_ma_value = get_ma_value(mid_term_ma)
long_ma_value = get_ma_value(long_term_ma)
bull_bear_ma_value = get_ma_value(bull_bear_ma)

// 计算波动率
high_close = ta.highest(high, volatility_k)
low_close = ta.lowest(low, volatility_k)
volatility = 100 * (high_close - low_close) / low_close

// 波动率条件背景色
volatilityCondition = (volatility > volatility_threshold)
volatilityConditionBG = (volatility > volatility_threshold) and volatility_threshold != 0

bgcolor(volatilityConditionBG ? color.new(color.green, 90) : na, title="Volatility Background")

// 策略信号
long_condition = (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value))
short_condition = (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value))

var float stop_level_long = na
var float stop_level_short = na

// 执行策略
if (volatilityCondition and allow_long and (not enable_bull_bear or close > bull_bear_ma_value)) 
    if (long_condition and close > long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Long", strategy.long, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, low*0.996, text="BUY", color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small)

if (volatilityCondition and allow_short and (not enable_bull_bear or close < bull_bear_ma_value)) 
    if (short_condition and close < long_ma_value)  // 判断是否立即触发止损
        strategy.entry("Short", strategy.short, qty=capital_pct * strategy.equity / close)
        label.new(bar_index, high*1.004, text="SELL", color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small)

// 部分平仓逻辑
if (enable_bull_bear)
    // 当当前价格处在牛熊趋势均线之下时
    if (close < bull_bear_ma_value)
        // 平所有多仓
        if (strategy.position_size > 0)
            strategy.close("Long", comment="平所有多仓")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
        if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size < 0)
                strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
                label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

    // 当当前价格处在牛熊趋势均线之上时
    if (close > bull_bear_ma_value)
        // 平所有空仓
        if (strategy.position_size < 0)
            strategy.close("Short", comment="平所有空仓")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)
        // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
        if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
            if (strategy.position_size > 0)
                strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
                label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)
else if (not enable_bull_bear and not (allow_long and allow_short))
    // 当短期均线在长期均线之上时,中期均线向上穿过长期均线,平空
    if (short_ma_value > long_ma_value and ta.crossover(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size < 0)
            strategy.close("Short", qty=close_pct * strategy.position_size, comment="部分平空")
            label.new(bar_index, low*0.996, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_up, size=size.small)

    // 当短期均线在长期均线之下时,中期均线向下穿过长期均线,平多
    if (short_ma_value < long_ma_value and ta.crossunder(mid_ma_value, long_ma_value) and volatilityCondition)
        if (strategy.position_size > 0)
            strategy.close("Long", qty=close_pct * strategy.position_size, comment="部分平多")
            label.new(bar_index, high*1.004, text="CLOSE", color=color.gray, textcolor=color.white, style=label.style_label_down, size=size.small)

// 止损处理
if (strategy.position_size > 0)
    stop_level_long_user = strategy.position_avg_price * (1 - stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Long", stop=stop_level_long_user)
else if (strategy.position_size < 0)
    stop_level_short_user = strategy.position_avg_price * (1 + stop_loss_user)
    strategy.exit("Stop Loss", from_entry="Short", stop=stop_level_short_user)

Verwandt

Mehr