オシレーター微分移動平均タイミング戦略


作成日: 2023-12-26 14:40:12 最終変更日: 2023-12-26 14:40:12
コピー: 0 クリック数: 654
1
フォロー
1621
フォロワー

オシレーター微分移動平均タイミング戦略

概要

この戦略は,速線EMAと遅線EMAの差値を計算してMACD振動器を形成し,MACDの均線を計算して信号線を形成し,二重のフィルターシステムを構築する.MACD線が信号線を上から下を通るときに買い信号を生じ,MACD線が信号線を上から下を通るときに売り信号を生じ,価格の短期中期波動を利用する.

戦略原則

この戦略の中心となる指標は,MACD振動器であり,それは,速線EMA (通常は12日EMA) を減算して,遅線EMA (通常は26日EMA) を計算する.速線EMAは,価格の短期的な変動を捉えるために,より敏感であり,遅線EMAは価格の変動に反応するより遅い.両者は減算され,短期期と中期期間の価格変化の差値を表す振動器を形成する.また,MACD振動器は,MACD振動器自身のEMA (通常は9日) を計算し,信号線を得る.MACDが信号線を下から進むと,短期間の上昇は中期的な傾向よりも強く,買入の信号を生じます.MACDが信号線上から進むと,短期間の減少は中期的な傾向よりも強く,売り込みの信号を生じる.

この戦略は,入力パラメータを,それぞれ,快線長,慢線長,価格源,信号線長,平滑周期として設定する.異なる市場に応じてパラメータを調整し,最適なパラメータの組み合わせを探す.背景の色ブロックは,反測の時間帯を示している.戦略は,その時間帯の外に,ポジションを開設して動作しない.

優位分析

  1. MACDは古典的で分かりやすいもので,短期中期逆転の機会を有効に活用できます.

  2. 二重EMAで構築されたMACDシステムは,単一MAシステムよりも優れている.

  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)