オシレーター差動移動平均のタイミング戦略

作者: リン・ハーンチャオチャン開催日:2023年12月26日 14:40
タグ:

img

概要

この戦略は,MACDオシレーターを形成するために,高速EMAと遅いEMAの違いを計算し,MACD自身のEMAを計算して信号線を形成し,二重フィルタリングシステムを構築する.MACD線が信号線を下から横切ると購入信号を生成し,MACD線が信号線を下から横切ると販売信号を生成し,短期および中期価格変動から利益を得ます.

戦略原則

この戦略のコア指標は,MACDオシレーターで,スローEMA (通常26日EMA) を高速EMA (通常12日EMA) から引くことで計算される.高速EMAはより敏感で,短期的な価格変動を把握することができる.スローEMAは価格変動によりゆっくり反応する.両方を引くことで,短期的および中期的な価格サイクルの違いを表すオシレーターを形成する.MACDオシレーターのEMA (通常9日) は,信号線を得るために計算される.MACDが下から信号ラインを越えると,短期トレンドの上昇勢力が中期トレンドよりも強いことを示し,購入信号を生成する.DDDが上から価格変化勢力の上昇勢力が低いことを示し,強いセール信号を生成する.

この戦略の入力パラメータは,順番に高速線長,スローライン長,価格源,シグナルラインスムーズ化期間に設定されています.これらのパラメータを最適な組み合わせを見つけるために異なる市場に応じて調整することができます.背景の色ブロックはバックテストのタイムフレームを示します.この戦略は,このタイムフレーム内でのみポジションを開きます.

利点分析

  1. MACD指標は古典的で分かりやすいもので,短期から中期間の逆転の機会を効果的に把握しています.

  2. MACDシステムの二重EMA構造は,単一EMAシステムよりもよりスムーズである.

  3. 比較的調整可能なパラメータにより,異なる市場での最適化が可能になります.

  4. 音量指標と組み合わせることで 高品質の信号を識別できます

リスク分析

  1. MACDは振動する市場では 誤った信号を 増やせます

  2. トレンドを特定できず,トレンドを交差する際に損失を起こす可能性があります.

  3. 制限されたバックテスト時間枠は,極端な市場条件を無視する可能性があります.

  4. パラメータ調整は,特定の市場期間を過剰に調整しないために,より多くの市場データが必要です.

リスクは,トレンド指標とストップ・ロスのメカニズムを組み込むことで制御できる.パラメータ最適化のためにバックテストの範囲と市場サンプル空間を拡張することができる.

オプティマイゼーションの方向性

  1. 価格源をテストします. 閉店,中位値,リセット値など.

  2. もっと歴史的なデータに基づいて 最適なパラメータセットを探します

  3. 信号の質を判断するための他の指標,例えば音量信号を統合する.

  4. 重要なトレンド衝突を避けるために,トレンドとサイクル分析を組み込む.

結論

この戦略は,二重EMAフィルターシステムを構築することで,短期から中期間の逆転機会を捉える.これは古典的で実践的な市場タイミング戦略に属している. リスクはパラメータ最適化,シグナルフィルタリング,ストップロスの手段によって制御できる. トレンド分析ツールを組み込み,ピークの購入と底部の販売を避けるには,安定した利益をもたらすことができる.


/*backtest
start: 2022-12-19 00:00:00
end: 2023-12-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy(title="MACD Histogram Backtest", shorttitle="MACD")

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

grow = (hist[1] < hist)
fall = (hist[1] > hist) and hist >= 0
stop = (hist[1] > hist)

plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
plot(macd, title="MACD", color=col_macd, transp=0)
plot(signal, title="Signal", color=col_signal, transp=0)

//Strategy Testing

// Component Code Start
// Example usage:
// if testPeriod()
//   strategy.entry("LE", strategy.long)
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(2, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

//Entry and Close settings
if testPeriod() 
    strategy.entry("grow", true, 10, when = grow, limit = close)
    strategy.close("grow", when = fall)
    strategy.close("grow", when = stop)
    
//if testPeriod() 
//   strategy.entry("fall", false, 1000, when = fall, limit = close)
//    strategy.close("fall", when = grow)    



もっと