マルチ移動平均クロスオーバートレンド追跡とボラティリティフィルタリング戦略

MA EMA SMA WMA VWMA SMMA RMA
作成日: 2024-07-29 13:37:09 最終変更日: 2024-07-29 13:37:09
コピー: 0 クリック数: 636
1
フォロー
1617
フォロワー

マルチ移動平均クロスオーバートレンド追跡とボラティリティフィルタリング戦略

概要

この戦略は,複数の移動平均の交差と波動率のフィルターに基づいたトレンド追跡取引システムである.それは,3つの異なる周期の移動平均を使用して市場トレンドを識別し,第4の移動平均をブル・ベア・マーケットの判断の基準として使用する.この戦略は,低波動の環境で取引を避けるために取引フィルタ条件として波動率指標を導入した.この戦略は,多額の取引と空白をサポートし,柔軟なポジション管理と止損メカニズムを提供します.

戦略原則

  1. 移動平均の選択:戦略は,トレンドを判断するために,3つの主要な移動平均 (短期,中期,長期) を使用します.ユーザーは,6つの既定の移動平均から選択できます.移動平均の各種は,計算周期,データソース,およびタイプ (SMA,EMAなど) を含むパラメータを個別に設定できます.

  2. トレンド判断:

    • 多頭トレンド:短期平均線が長期平均線より高く,中期平均線が長期平均線を向上して横切るときである.
    • 空向きトレンド:短期平均線が長期平均線より低く,中期平均線が長期平均線を下向きに横切るときである.
  3. 牛・熊市判断:第4条移動平均を牛・熊市の境界線として使用する選択がある.価格がこの線の上にあるときのみ,多めにすることが許される.逆に,空白のみが許される.

  4. 波動率フィルター:最高価格と最低価格に基づいた波動率指標を使用します. 波動率がユーザが設定した値を超えるとのみ,戦略は取引信号を発します.

  5. 入力論理:

    • 多頭入場:多頭トレンドが確認され,波動率の条件が満たされ,価格が長期平均線より高い場合に多頭入場を行う.
    • 空頭入場:空頭トレンドが確認され,波動率条件が満たされ,価格が長期平均線より低いとき,空頭を空頭とする.
  6. 試合の論理:

    • 部分平仓:トレンドが逆転したときに (中期平均線と長期平均線が再び交差する) ポジションの一定割合を平坦にする.
    • 全平仓: 価格がブル・ベア・マーケットの境界線を横切ったとき,反対方向のすべてのポジションを平らにします.
  7. 止損: 固定パーセントの止損を使用し,ユーザがカスタマイズできる止損比率.

  8. ポジション管理: ポジション開設ごとに口座使用権益の固定パーセント,ユーザがカスタマイズできます.

戦略的優位性

  1. 多次元トレンド分析:複数の移動平均を使用することで,戦略は市場トレンドをより全面的に捉え,偽信号を減らすことができます.

  2. フレキシブルなパラメータ構成: ユーザーは,平均線型,周期,データソースなどを含むパラメータを,異なる市場および取引品種の特性に合わせて柔軟に調整できます.

  3. 波動率フィルター:波動率指標を導入することで,低波動環境での取引を回避し,信号の質を向上させる.

  4. 牛・熊市場の適応:選択可能な牛・熊市場の判断メカニズムにより,戦略が異なる市場環境に適応し,逆転取引を減らすことができる.

  5. ダイナミックポジション管理:口座権益に基づくポジション管理方法で,口座の規模が変化するにつれて取引規模を自動的に調整することができる.

  6. 多層のリスク制御:変動率フィルター,トレンド確認,部分平仓,固定ストップなど,複数のリスク制御機構.

  7. 双方向取引:多額の取引と空白の取引をサポートし,様々な市場環境で取引機会を探します.

  8. ビジュアル・アシスト:戦略は,移動平均と取引シグナルのタグをグラフに描画し,直観的な分析と反省を容易にします.

戦略リスク

  1. 遅滞性:移動平均は本質的に遅滞の指標であり,入場と出場のタイミングがわずかに遅れて収益性に影響する可能性があります.

  2. 振動市場の不良な表现:横軸振動市場では,策略はしばしば偽信号を生じ,過度な取引と損失をもたらします.

  3. パラメータ感性: 戦略のパフォーマンスはパラメータ設定に大きく依存し,異なる市場と時間枠では異なるパラメータの組み合わせが必要になる可能性があります.

  4. 引き下がるリスク:トレンドが逆転すると,戦略が全出場を間に合わない可能性があり,大きな引き下がりを引き起こす.

  5. 技術指標への過度な依存: 戦略は技術指標に完全に依存し,基本的要素を無視し,重要なニュースやイベントの時に不良なパフォーマンスを発揮する可能性があります.

  6. 資金管理のリスク:固定比率のポジション管理方法は,連続的な損失の場合,過度のリスクの隙間につながる可能性があります.

  7. 止損設定: 固定パーセントの止損は,すべての市場環境に適用されない可能性があり,高波動期に早めに止損を引き起こす可能性があります.

戦略最適化の方向性

  1. 適応パラメータ: 適応メカニズムを導入し,市場状況の動向に応じて移動平均パラメータと波動率の値を調整する.

  2. 複数の時間枠分析: より長い時間枠とより短い時間枠の情報を組み合わせて,トレンド判断の正確性を向上させる.

  3. 波動率指標の最適化:市場状況をより正確に評価するために,ATRまたはボリンジャー帯域などのより複雑な波動率指標を使用することを検討する.

  4. 運動指標を導入:RSIやMACDなどの運動指標を組み合わせて,入場と出場のタイミングを最適化する.

  5. 改善されたストップメカニズム:市場の波動に適したトラッキングストップまたはATRベースのダイナミックストップを実現する.

  6. 市場情緒指標の統合:VIXなどの市場情緒指標を導入し,異なる市場環境下でのパフォーマンスを最適化する戦略.

  7. ポジション管理の最適化:変動率または現在の利益に基づくダイナミックなポジション管理を実現し,リスクをよりよく制御する.

  8. 基本的なフィルターを追加:重要な経済データや会社の決算などの基本的な要因を考慮し,リスクの高い期間に取引を避ける.

  9. 機械学習の最適化:機械学習アルゴリズムを使用してパラメータの組み合わせと意思決定規則の最適化,戦略の適応性の向上.

  10. 裏返しと前向きのテスト:戦略の安定性を検証するために,より全面的な裏返しを行い,異なる市場と時間帯で前向きのテストを行います.

要約する

多均線交差トレンド追跡と波動率フィルタリング戦略は,複数の移動平均,波動率指標とトレンド追跡原理を組み合わせた,包括的で柔軟な取引システムである. 多次元的なトレンド分析と厳格なリスク管理により,この戦略は,様々な市場環境下での継続的なトレンドを捉える可能性を秘めている. しかし,ユーザーはパラメータ最適化と市場適応性の問題に注意を払い,戦略のパフォーマンスをさらに向上させるために,より高度な技術指標とリスク管理技術の導入を検討する必要があります.

ストラテジーソースコード
/*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)