資源の読み込みに... 荷物...

先進的な柔軟な多期移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン,日付: 2024年11月28日 15:18:47
タグ:マルチSMAエイマWMAHMASMMA

img

概要

この戦略は,複数の移動平均値と時間期間に基づいた高度な定量的な取引システムである.トレーダーはさまざまなタイプの移動平均値 (SMA,EMA,WMA,HMA,SMMAを含む) を柔軟に選択し,市場の状況に応じて日時,週日,または月間タイムフレームなどの複数の時間期間間で切り替えることができます.コア論理は,選択した移動平均値と閉値を比較して,取引の正確性を向上させるために異なる時間期間のレビューを組み合わせることで,購入と売却のシグナルを決定します.

戦略の原則

この戦略は,移動平均の種類選択モジュール,時間期間選択モジュール,信号生成モジュール,ポジション管理モジュールという4つのコアコンポーネントで構成されるモジュール式設計を採用している. 閉値が選択された移動平均を超えると,システムは次の取引期開始時にロング信号を生成する. 閉値が移動平均を下回ると,システムは閉値信号を生成する. 戦略は request.security機能を通じてクロス期データ計算を実装し,異なるタイムフレームで信号の正確性を確保する. さらに,戦略には,資本の安全を確保するためにバックテストの終わりに自動的なポジション閉鎖が含まれている.

戦略 の 利点

  1. 高柔軟性: 複数の移動平均の種類と時間帯の組み合わせをサポートし,異なる市場環境に適応
  2. 総合的なリスク管理: 期末自動チェックメカニズムを通じて逃した機会を防ぐ
  3. 合理的な資本管理: 効果的なリスク管理のための雇用者ポジションの割合管理
  4. 強い信号安定性:複数の確認メカニズムを通じて偽信号を減らす
  5. 広範囲に適応可能:様々な取引手段と市場環境に適用可能

戦略リスク

  1. 遅延リスク: 移動平均指標は固有の遅延があり,潜在的にエントリーと出路のタイミングが遅れる可能性があります.
  2. 振動リスク:横向市場では頻繁に誤ったブレイクシグナルを生む可能性があります.
  3. 異なった期間の信号が互いに矛盾する可能性があるため,効果的な信号優先順位設定が必要です.
  4. 資本管理リスク: 固定金利のポジションは,特定の市場条件下では過度に積極的かもしれない.

戦略の最適化方向

  1. 動的ポジションサイズ化のためにATRまたはボリンジャー帯を追加することを提案する.
  2. トレンドフィルターを追加: 主なトレンド方向でのオープンポジションのみに長期トレンド判断メカニズムを追加できます.
  3. 信号確認を最適化:信号信頼性を向上させるために音量および他の補助指標の導入を検討
  4. ストップ・ロスのメカニズムの改善: 利益の保護のために,ストップ・ロスの機能の追加が提案されています.
  5. 市場情勢指標を追加する: 市場過剰購入/過剰販売状況を判断するために,RSIまたはMACDの導入を提案する

概要

この戦略は,柔軟なパラメータ設定と複数の確認メカニズムを通じて,トレーダーに信頼できる取引ツールを提供する,明確な論理を持つよく設計された取引システムです. 戦略のモジュール式デザインは,強力なスケーラビリティを与え,継続的な最適化によってパフォーマンスをさらに向上させることができます. トレーダーは,ライブ取引の前にバックテスト環境でさまざまなパラメータ組み合わせを完全にテストして,ニーズに最も適した戦略構成を見つけることをお勧めします.


/*backtest
start: 2019-12-23 08:00:00
end: 2024-11-27 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Flexible Moving Average Strategy", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// Input to select the review frequency (Daily, Weekly, Monthly)
check_frequency = input.string("Weekly", title="Review Frequency", options=["Daily", "Weekly", "Monthly"])

// Input to select the Moving Average method (SMA, EMA, WMA, HMA, SMMA)
ma_method = input.string("EMA", title="Moving Average Method", options=["SMA", "EMA", "WMA", "HMA", "SMMA"])

// Input to select the length of the Moving Average
ma_length = input.int(30, title="Moving Average Length", minval=1)

// Input to select the timeframe for Moving Average calculation
ma_timeframe = input.string("W", title="Moving Average Timeframe", options=["D", "W", "M"])

// Calculate all Moving Averages on the selected timeframe
sma_value = request.security(syminfo.tickerid, ma_timeframe, ta.sma(close, ma_length), lookahead=barmerge.lookahead_off)
ema_value = request.security(syminfo.tickerid, ma_timeframe, ta.ema(close, ma_length), lookahead=barmerge.lookahead_off)
wma_value = request.security(syminfo.tickerid, ma_timeframe, ta.wma(close, ma_length), lookahead=barmerge.lookahead_off)
hma_value = request.security(syminfo.tickerid, ma_timeframe, ta.hma(close, ma_length), lookahead=barmerge.lookahead_off)
smma_value = request.security(syminfo.tickerid, ma_timeframe, ta.rma(close, ma_length), lookahead=barmerge.lookahead_off) // Smoothed Moving Average (SMMA)

// Select the appropriate Moving Average based on user input
ma = ma_method == "SMA" ? sma_value : 
     ma_method == "EMA" ? ema_value :
     ma_method == "WMA" ? wma_value :
     ma_method == "HMA" ? hma_value :
     smma_value  // Default to SMMA

// Variable initialization
var float previous_close = na
var float previous_ma = na
var float close_to_compare = na
var float ma_to_compare = na

// Detect the end of the period (Daily, Weekly, or Monthly) based on the selected frequency
var bool is_period_end = false

if check_frequency == "Daily"
    is_period_end := ta.change(time('D')) != 0
else if check_frequency == "Weekly"
    is_period_end := ta.change(time('W')) != 0
else if check_frequency == "Monthly"
    is_period_end := ta.change(time('M')) != 0

// Store the close and Moving Average values at the end of the period
if is_period_end
    previous_close := close[0]  // Closing price of the last day of the period
    previous_ma := ma[0]  // Moving Average value at the end of the period

// Strategy logic
is_period_start = is_period_end

// Check if this is the first bar of the backtest
is_first_bar = barstate.isfirst

if (is_period_start or is_first_bar)
    // If the previous period values are not available, use current values
    close_to_compare := not na(previous_close) ? previous_close : close[0]
    ma_to_compare := not na(previous_ma) ? previous_ma : ma[0]
    
    if close_to_compare < ma_to_compare
        // Close price below the MA -> Sell
        if strategy.position_size > 0
            strategy.close("Long")
    else
        // Close price above the MA -> Buy/Hold
        if strategy.position_size == 0
            strategy.entry("Long", strategy.long)

// Close all positions at the end of the backtest period
if barstate.islastconfirmedhistory
    strategy.close_all(comment="Backtest End")

// Plot the previous period's close price for comparison
plot(previous_close, color=color.red, title="Previous Period Close", style=plot.style_stepline)
plot(close_to_compare, color=color.blue, title="Close to Compare", style=plot.style_line)

// Plot the selected Moving Average
plot(ma, color=color.white, title="Moving Average", style=plot.style_line, linewidth=3)

関連性

もっと