この戦略は,複数の移動平均クロスオーバーと波動性フィルタリングに基づいたトレンドフォローする取引システムである.市場動向を特定するために,異なる期間の3つの移動平均を使用し,第4の移動平均を牛/熊市場の決定の基準として使用する.この戦略は,低波動性環境での取引を避けるための取引フィルターとして波動性指標も組み込む.長期と短期の両方をサポートし,柔軟なポジション管理とストップロスのメカニズムを提供します.
移動平均値選択:この戦略は,トレンドを決定するために3つの主要な移動平均値 (短期,中期,長期) を使用する.ユーザーは,6つの事前に定義された移動平均値から選択することができ,それぞれが計算期間,データソース,および種類 (例えば,SMA,EMA) を含むパラメータで個別に構成することができます.
トレンド決定:
ブール/ベア市場決定: オプションの4番目の移動平均値は,ブールとベア市場の分岐線として使用できます.価格はこの線を超えるとロングポジションのみ,以下であればショートポジションのみが許可されます.
波動性フィルター: 最高値と最低値に基づいた波動性指標が使用されます.この戦略は,波動性がユーザーによって定義された
エントリー論理:
出口論理:
ストップ・ロース: ユーザーによってカスタマイズできる固定パーセントのストップ・ロースを使用する.
ポジションマネジメント:各取引に対して固定された口座資本の割合を使用し,ユーザによってカスタマイズできます.
多次元トレンド分析:複数の移動平均値を使用することで,戦略は市場のトレンドをより包括的に把握し,誤った信号を減らすことができます.
柔軟なパラメータ構成:ユーザーは,MAの種類,期間,データソースを含む異なる市場や取引手段の特徴に応じて,さまざまなパラメータを柔軟に調整できます.
波動性フィルタリング:波動性指標を組み込むことで,戦略は低波動性環境での取引を回避し,信号品質を改善することができます.
牛/熊市場の適応: オプションの牛/熊市場の決定メカニズムは,戦略が異なる市場環境により良く適応し,反動傾向の取引を減らすことを可能にします.
ダイナミック・ポジション・マネジメント: 株式ベースのポジション・マネジメント・メソッドは,口座のサイズが変化するにつれて,取引サイズを自動的に調整します.
複数の層のリスク管理: 不安定性フィルタリング,トレンド確認,部分的なポジション閉鎖,固定ストップ損失などの複数のリスク管理メカニズムを含む.
双方向取引: 長期と短期の両立をサポートし,さまざまな市場条件で取引機会を可能にします.
ビジュアルアイド: この戦略は,チャート上で様々な移動平均値と取引信号ラベルをグラフ化し,直感的な分析とバックテストを容易にする.
遅延性: 移動平均値は本質的に遅延する指標であり,収益性に影響を与える,少し遅延したエントリーと出口タイミングにつながる可能性があります.
市場変動における不良業績:横向的で不安定な市場では,戦略は頻繁に誤った信号を生成し,過剰取引と損失につながる可能性があります.
パラメータ感度: 戦略のパフォーマンスは,パラメータ設定に大きく依存しており,異なる市場やタイムフレームには異なるパラメータの組み合わせが必要かもしれません.
引き下げリスク: 傾向の逆転の際に,戦略は,ポジションを完全にタイムリーに退場させない可能性があります.
テクニカル指標への過度な依存:戦略は完全にテクニカル指標に基づいており,主要なニュースやイベントの際に不良なパフォーマンスをもたらす基本的な要因を無視しています.
資金管理リスク: 固定パーセントのポジションサイズメソッドは,連続した損失の際に過度のリスクにさらされる可能性があります.
ストップ・ロスの設定: 固定パーセントストップ・ロスはすべての市場環境に適していない可能性があり,高波動期間に早速退場につながる可能性があります.
適応性パラメータ: 市場状況に基づいて移動平均パラメータと波動性
複数のタイムフレーム分析: 傾向決定の精度を向上させるために,より長い,より短いタイムフレームからの情報を組み込む.
波動性指標の最適化: より正確な市場状況評価のために,ATRやボリンジャー帯域幅などのより洗練された波動性指標を使用することを検討する.
モメントインジケーター統合:RSIやMACDのようなモメントインジケーターを組み合わせ,エントリーと出口タイミングを最適化します.
ストップ・ロスのメカニズムの改善: トレイリング・ストップやATRベースのダイナミック・ストップ・ロスの導入により市場の変動に適応する.
市場情緒統合: VIXのような市場情緒指標を組み込み,異なる市場環境における戦略パフォーマンスを最適化します.
ポジション管理の最適化: リスク管理の改善のために,変動または現在の利益/損失に基づいて動的ポジションサイズを実施する.
基本的なフィルター追加: 重要な経済データリリースや企業の収益報告などの基本的な要因を考慮し,高リスク期間の取引を避ける.
マシン学習最適化: マシン学習アルゴリズムを使用してパラメータの組み合わせと決定ルールを最適化し,戦略の適応性を向上させる.
バックテストとフォワードテスト: 戦略の安定性を検証するために,さまざまな市場と時間帯でより包括的なバックテストとフォワードテストを実施します.
多動平均クロスオーバートレンドフォロー戦略は,多動平均,波動指標,トレンドフォロー原則を組み合わせた包括的で柔軟な取引システムである.多次元トレンド分析と厳格なリスク管理を通じて,この戦略はさまざまな市場環境における持続的なトレンドを把握する可能性がある.しかし,ユーザーはパラメータ最適化と市場適応性の問題に注意を払い,戦略パフォーマンスをさらに向上させるためにより高度な技術指標とリスク管理技術導入を検討する必要があります.全体的に,これはさらなる研究と最適化のための良い基盤を提供する堅牢な戦略フレームワークです.
/*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)