長期トレンドSMA移動平均クロスオーバー定量戦略

SMA EMA
作成日: 2025-01-06 17:01:08 最終変更日: 2025-01-06 17:01:08
コピー: 3 クリック数: 432
1
フォロー
1617
フォロワー

長期トレンドSMA移動平均クロスオーバー定量戦略

概要

この戦略は、複数期間の単純移動平均 (SMA) クロスオーバー信号に基づく定量取引システムです。主に、長期的な上昇トレンドの中で短期的な引き戻しの機会を特定して取引します。この戦略では、5 日、10 日、20 日、60 日、120 日の 5 つの期間を持つ SMA インジケーターを使用して、移動平均の位置関係とクロスオーバー信号を通じて市場の動向と取引の機会を判断します。

戦略原則

戦略の中核となるロジックには、次の主要な部分が含まれます。

  1. 長期的なトレンドは、SMA20とSMA60の相対的な位置関係によって判断できます。SMA20がSMA60を上回っている場合、市場は上昇トレンドにあることが確認できます。
  2. 長期的な上昇トレンドを確認する前提で、短期のSMA5がSMA20を下回ってから上回ったときに買いシグナルが発動されます。これは、市場が上昇トレンドの短期的な後退後に回復していることを示唆しています。
  3. SMA20 が SMA5 を横切ると、クローズ シグナルがトリガーされます。これは、短期的な上昇の勢いが弱まり、調整期に入る可能性があることを示しています。
  4. この戦略には時間フィルター機能も含まれており、バックテストの時間範囲を制限し、戦略の柔軟性を向上させることができます。

戦略的優位性

  1. 戦略ロジックは明確かつシンプルで、理解と実装が容易であり、複雑な計算プロセスを必要としません。
  2. 複数の期間の移動平均を連携して使用することで、市場のノイズを効果的に除去し、取引シグナルの信頼性を向上させることができます。
  3. この戦略は、トレンド市場でのプルバックの機会に焦点を当てており、「トレンド取引」のコアコンセプトと一致しています。
  4. EMA の代わりに SMA を使用すると、価格の変化に対する感度が低下し、誤ったシグナルが減少します。
  5. エントリーとエグジットのロジックが明確であるため、実行とリスク管理が容易になります。

戦略リスク

  1. 移動平均システムには遅れがあり、エントリーとエグジットのタイミングが最適でない可能性があります。
  2. 不安定な市場では、移動平均線のクロスオーバーが頻繁に発生すると、誤ったシグナルが多すぎる可能性があります。
  3. この戦略にはボラティリティフィルタリングメカニズムがないため、ボラティリティが高い期間にはより大きなドローダウンリスクに直面する可能性があります。
  4. 取引量などの他のテクニカル指標との連携を考慮せずに、シグナルの信頼性を向上させる必要があります。
  5. 固定移動平均パラメータは、すべての市場環境に適しているとは限りません。

戦略最適化の方向性

  1. ボラティリティフィルタリング用の ATR インジケーターを導入し、ボラティリティが高すぎる場合は取引を回避します。
  2. 取引シグナルの信頼性を向上させるために、ボリューム確認メカニズムを追加します。
  3. 適応型移動平均サイクル メカニズムを開発して、戦略がさまざまな市場環境により適切に適応できるようにします。
  4. 強いトレンドでの取引を確実に行うために、ADX インジケーターなどのトレンド強度フィルターを追加します。
  5. リスクをより適切に管理するために、トレーリングストップの追加など、ストップロスメカニズムを改善します。

要約する

この戦略では、複数期間の SMA 移動平均を使用して、長期的な上昇トレンドでのプルバックの機会を捉えることに重点を置いた取引システムを構築します。戦略設計は簡潔かつ実用的であり、理解しやすく実装しやすいです。ボラティリティフィルタリングやボリューム確認などの最適化策を導入することで、戦略の堅牢性と信頼性がさらに向上することが期待されます。

ストラテジーソースコード
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=6
strategy("Long-Term Growing Stock Strategy", overlay=true)
// Date Range
// STEP 1. Create inputs that configure the backtest's date range
useDateFilter = input.bool(true, title="Filter Date Range of Backtest",group="Backtest Time Period")
backtestStartDate = input(timestamp("1 Jan 2014"),title="Start Date", group="Backtest Time Period",tooltip="This start date is in the time zone of the exchange " + "where the chart's instrument trades. It doesn't use the time " +"zone of the chart or of your computer.")
backtestEndDate = input(timestamp("31 Dec 2024"), title="End Date", group="Backtest Time Period")
// STEP 2. See if current bar falls inside the date range
inTradeWindow = true


// Calculate EMAs
// ema20 = ta.ema(close, ema20_length)
// ema60 = ta.ema(close, ema60_length)
// ema120 = ta.ema(close, ema120_length)
sma5 = ta.sma(close, 5)
sma10 = ta.sma(close, 10)
sma20 = ta.sma(close, 20)
sma60 = ta.sma(close, 60)
sma120 = ta.sma(close, 120)

// Long-term growth condition: EMA 20 > EMA 60 > EMA 120
longTermGrowth = sma20 > sma60
//  and ema60 > ema120

// Entry condition: Stock closes below EMA 20 and then rises back above EMA 10

// entryCondition = ta.crossover(close, ema20) or (close[1] < ema20[1] and close > ema20)
entryCondition =  sma5[1] <= sma20[1] and sma5 > sma20
// ta.crossover(sma5, sma20)

// Exit condition: EMA 20 drops below EMA 60
// exitCondition = ema5 < ema60 or (year == 2024 and month == 12 and dayofmonth == 30)
exitCondition = ta.crossover(sma20, sma5)

// Execute trades
if entryCondition and inTradeWindow
    strategy.entry("Long Entry", strategy.long)

if exitCondition and inTradeWindow
    strategy.close("Long Entry")
// plotchar(true, char="sma5: " + str.tostring(sma5))
// plotchar(true, char="sma5: " + sma20)
// label.new(x=bar_index, y=high + 10, text="SMA 5: " + str.tostring(sma5), color=color.blue, style=label.style_label_down, textcolor=color.white, size=size.small)
// label.new(x=bar_index, y=low, text="SMA 20: " + str.tostring(sma20), color=color.red, style=label.style_label_down, textcolor=color.white, size=size.small)


// x = time + (time - time[1]) * offset_x

//     var label lab = na
//     label.delete(lab)
//     lab := label.new(x=x, y=0, text=txt, xloc=xloc.bar_time, yloc=yloc.belowbar, color=color.red, textcolor=color.black, size=size.normal, style=label.style_label_up)
//     label.set_x(lab, x)



// Plot EMAs for visualization
// plot(ema20, color=color.red, title="EMA 20")
// plot(ema60, color=color.green, title="EMA 60")
// plot(ema120, color=color.blue, title="EMA 120")