
Die Strategie ist ein Trend-Tracking-Trading-System, das auf mehreren Moving Average-Kreuzungen und Fluktuationsfiltern basiert. Es verwendet drei verschiedene Perioden von Moving Averages, um Markttrends zu identifizieren, und verwendet einen vierten Moving Average als Basis für die Beurteilung von bullish-bearish-Markt. Die Strategie führt auch Fluktuationsindikatoren als Handelsfilterbedingungen ein, um den Handel in einer Umgebung mit geringer Fluktuation zu vermeiden.
Moving Average Option: Die Strategie nutzt drei Haupt-Moving Averages (kurz-, mittelfristig und langfristig) für Trends. Der Benutzer kann aus sechs vordefinierten Moving Averages wählen, wobei die Parameter für jeden Moving Average individuell konfiguriert werden können, einschließlich Berechnungszeit, Datenquelle und Typ (z. B. SMA, EMA).
Trends zu beurteilen:
Bull-Bär-Markt-Urteil: Die vierte bewegliche Durchschnittslinie kann als Trennlinie für den Bull-Bär-Markt verwendet werden. Nur wenn der Preis über dieser Linie liegt, ist ein Überschuss erlaubt. Im Gegensatz dazu ist nur ein Ausfall erlaubt.
Fluktuationsrate-Filter: Die Strategie verwendet einen Fluktuationsindikator, der auf dem Höchst- und Tiefpreis basiert. Die Strategie sendet nur dann ein Handelssignal aus, wenn die Fluktuation den vom Benutzer festgelegten Schwellenwert überschreitet.
Eingangslogik:
Die Ausgangslogik:
Stop-Loss: Mit einem festen Stop-Loss-Prozent kann der Benutzer den Stop-Loss-Prozent anpassen.
Positionsverwaltung: Der Benutzer kann einen festen Prozentsatz des Nutzens des Kontos bei jeder Position festlegen.
Mehrdimensionale Trendanalyse: Durch die Verwendung von mehreren Moving Averages kann die Strategie die Markttrends umfassender erfassen und falsche Signale reduzieren.
Flexible Parameterkonfiguration: Der Benutzer kann die Parameter, einschließlich der Durchschnittslinie, der Perioden und der Datenquellen, flexibel anpassen, um die Merkmale der verschiedenen Märkte und Handelsarten anzupassen.
Fluktuationsfilter: Durch die Einführung von Fluktuationsindikatoren kann die Strategie den Handel in einer Umgebung mit geringer Fluktuation vermeiden und die Signalqualität verbessern.
Anpassung an einen bullish-bearish-Markt: Optionale bullish-bearish-Richtlinien ermöglichen Strategien, sich besser an unterschiedliche Marktumgebungen anzupassen, um negative Handelsbewegungen zu reduzieren.
Dynamische Positionsverwaltung: Eine auf Konten basierende Positionsverwaltungsmethode, die die Handelsgröße automatisch an die Kontengröße anpasst.
Mehrschichtige Risikokontrolle: Mehrschichtige Risikokontrolle, einschließlich der Filterung von Volatilitätsraten, der Bestätigung von Trends, der Teilliquidation und des Feststopps.
Zwei-Wege-Trading: Unterstützt Über- und Überschneidungen und bietet die Möglichkeit, nach Handelsmöglichkeiten in verschiedenen Marktumgebungen zu suchen.
Visuelle Hilfe: Die Strategie zeichnet die einzelnen Moving Averages und Handelssignal-Tags auf den Diagrammen, um eine intuitive Analyse und Rückmeldung zu ermöglichen.
Verzögerung: Der Moving Average ist ein Verzögerungsindikator und kann zu einer geringfügigen Verzögerung der Ein- und Ausstiegszeiten führen, was die Profitabilität beeinträchtigt.
Schwankungsmärkte: In schwankenden Märkten können Strategien häufig falsche Signale erzeugen, was zu Überhandelungen und Verlusten führt.
Parameter-Sensitivität: Die Performance der Strategie hängt stark von den Parameter-Einstellungen ab, die in verschiedenen Märkten und Zeitrahmen unterschiedliche Kombinationen von Parametern erfordern können.
Rücktrittsrisiko: Bei einer Trendwende kann es sein, dass die Strategie nicht vollständig ausgeschaltet wird, was zu einem größeren Rückzug führt.
Übermäßige Abhängigkeit von technischen Kennzahlen: Die Strategie basiert ausschließlich auf technischen Kennzahlen und ignoriert grundlegende Faktoren, die bei wichtigen Nachrichten oder Ereignissen schlecht abschneiden können.
Risikomanagement: Die Methode des Positionsmanagements mit festen Anteilen kann zu einer zu großen Risikolocke bei fortlaufenden Verlusten führen.
Stop-Loss-Einstellungen: Ein fester Prozentsatz Stop-Loss ist möglicherweise nicht für alle Marktumgebungen geeignet und kann zu einem vorzeitigen Stop-Loss in Zeiten hoher Volatilität führen.
Anpassungsparameter: Einführung eines Anpassungsmechanismus, der die Moving Average-Parameter und die Schwellenwerte für die Volatilität an die dynamischen Marktbedingungen anpasst.
Mehrzeit-Analysen: Die Kombination von Informationen aus längeren und kürzeren Zeiträumen erhöht die Genauigkeit von Trends.
Optimierung von Volatilitätsindikatoren: Erwägen Sie die Verwendung von komplexeren Volatilitätsindikatoren wie ATR oder Bollinger Bandbreite, um die Marktlage genauer zu beurteilen.
Einführung von Dynamikindikatoren: Kombination von Dynamikindikatoren wie RSI oder MACD, um die Ein- und Ausstiegszeiten zu optimieren.
Verbesserte Stop-Loss-Mechanismen: Tracking-Stops oder ATR-basierte dynamische Stop-Loss-Mechanismen zur besseren Anpassung an Marktschwankungen.
Integration von Market Sentiment Indicators: Einführung von Market Sentiment Indicators wie VIX, um Strategien zur Optimierung der Performance in verschiedenen Marktumgebungen zu entwickeln.
Optimierung der Positionsverwaltung: Dynamische Positionsverwaltung basierend auf Volatilität oder aktuellen Verlusten ermöglicht eine bessere Risikokontrolle.
Hinzufügen von grundlegenden Filtern: Berücksichtigen Sie grundlegende Faktoren wie die Veröffentlichung wichtiger Wirtschaftsdaten oder Unternehmensergebnisse und vermeiden Sie den Handel in Zeiten hohen Risikos.
Optimierung durch maschinelles Lernen: Optimierung der Parameterkombinationen und der Entscheidungsregeln mit Hilfe von maschinellen Lernalgorithmen, um die Anpassungsfähigkeit der Strategien zu verbessern.
Retrospektive und Forward-Testing: Eine umfassendere Retrospektive und Forward-Testing in verschiedenen Märkten und Zeitabschnitten, um die Stabilität der Strategie zu überprüfen.
Die Multivariate-Linear-Cross-Trend-Tracking-und-Volatility-Rate-Filterstrategie ist ein umfassendes und flexibles Handelssystem, das mehrere Moving Averages, Variablen-Indikatoren und Trend-Tracking-Prinzipien kombiniert. Die Strategie hat das Potenzial, durch mehrdimensionale Trendanalyse und strenge Risikokontrolle anhaltende Trends in verschiedenen Marktumgebungen zu erfassen.
/*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)