複数期間MACDゼロクロス反転戦略


作成日: 2024-02-18 15:27:21 最終変更日: 2024-02-18 15:27:21
コピー: 0 クリック数: 548
1
フォロー
1617
フォロワー

複数期間MACDゼロクロス反転戦略

概要

多周期MACDゼロ軸交叉反転戦略は,異なる周期のMACD指標を計算し,価格が反転する可能性のあるシグナルを識別し,トレンドを追跡するストップ・ロスを採用し,資金利用効率の向上を追求する.

戦略原則

この戦略は,3周期および10周期のSMA移動平均を同時に計算し,快速と遅い線を構成し,MACD指数と信号線を計算する.快速と信号線が上下するゼロ軸交差が起こると,価格が臨界点に達し,反転が起こる可能性があることを示す.さらに,この戦略は,交替量の多空態勢判断,RSI指数などと組み合わせて,反転信号の信頼性を識別する.反転信号が一定の信頼性の要求を満たしたとき,多行または空行する.

具体的には,この戦略は,次の方法で価格の逆転を判断します.

  1. MACDのゼロ軸の交差は,価格が臨界点に達したことを示しています.
  2. 取引量の買賣圧力の判断 余空状況
  3. RSIは MACDの斜率の変化と相まって,反転信号の強さを判断します.
  4. 快線と信号線が逆交し,反転信号を形成する

逆転信号の信頼性が高いとき,戦略はトレンドを追跡し,損失を止めて,高い利益を追求する.

優位分析

この戦略には以下の利点があります.

  1. 複数の指標で判断し,反転信号を信頼できます.
  2. MACDゼロ軸交差を用いて逆転点位を判断し,高精度
  3. RSI指標と取引量補助判断,高い信頼性
  4. トレンドフォロー・ストップ・ロスの方法,より高い資金利用効率の追求

リスク分析

この戦略にはいくつかのリスクがあります.

  1. MACDは偽信号を発信する可能性が高く,罠にかけやすい.
  2. 多空間の交替の過程で,ストップダメージが打ち破られる確率は高い
  3. パラメータの不適切な設定は,取引の頻度,取引コストの増加,滑り点の損失を引き起こす可能性があります.

リスクは以下の方法で軽減できます.

  1. ストップ・ローズを適正に緩和し,ストップ・ローズを回避する.
  2. パラメータの最適化,取引頻度の低下
  3. キーサポート抵抗点の近くでの入場のみを考慮する

最適化の方向

この戦略は,次の方向にも改善できます.

  1. 逆転信号の信頼性を判断する機械学習アルゴリズムを追加
  2. 感情の指標を高めると 心理面が空っぽになる
  3. キーサポートの抵抗位置と組み合わせて,入場精度を向上させる
  4. 資金運用効率をさらに向上させるため,損失防止の最適化
  5. 最適なパラメータの組み合わせをテストし,取引の頻度を低下させる

要約する

多時間周期MACDゼロ軸交叉反転戦略は,価格,成交量,波動指標などの複数の次元を総合的に考慮し,複数の指標の判断によって反転のタイミングを決定し,利益が充分になった後に時効的に止損し,反転の状況でより良い利益を得ることができる.この戦略は,機械学習や鍵位置最適化などの方法によってさらに改善され,取引頻度やリスクを軽減し,利益の余地を増やすことが期待されている.

ストラテジーソースコード
/*backtest
start: 2023-02-11 00:00:00
end: 2024-02-17 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("3 10.0 Oscillator Profile Flagging", shorttitle="3 10.0 Oscillator Profile Flagging", overlay=false)

signalBiasValue = input(title="Signal Bias", defval=0.26)
macdBiasValue = input(title="MACD Bias", defval=0.8)
shortLookBack = input( title="Short LookBack", defval=3)
longLookBack = input( title="Long LookBack", defval=10.0)
takeProfit = input( title="Take Profit", defval=0.8)
stopLoss = input( title="Stop Loss", defval=0.75)

fast_ma = ta.sma(close, 3)
slow_ma = ta.sma(close, 10)
macd = fast_ma - slow_ma
signal = ta.sma(macd, 16)
hline(0, "Zero Line", color = color.black)

buyVolume = volume*((close-low)/(high-low))
sellVolume = volume*((high-close)/(high-low))
buyVolSlope = buyVolume - buyVolume[1]
sellVolSlope = sellVolume - sellVolume[1]
signalSlope = ( signal - signal[1] )
macdSlope = ( macd - macd[1] )
plot(macd, color=color.blue, title="Total Volume")
plot(signal, color=color.orange, title="Total Volume")
intrabarRange = high - low
rsi = ta.rsi(close, 14)
rsiSlope = rsi - rsi[1]

getRSISlopeChange(lookBack) =>
    j = 0
    for i = 0 to lookBack
        if ( rsi[i] - rsi[ i + 1 ] ) > -5
            j += 1
    j

getBuyerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if buyVolume[i] > sellVolume[i]
            j += 1
    j

getSellerVolBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if sellVolume[i] > buyVolume[i]
            j += 1
    j

getVolBias(lookBack) =>
    float b = 0.0
    float s = 0.0
    for i = 1 to lookBack
        b += buyVolume[i]
        s += sellVolume[i]
    b > s

getSignalBuyerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] > signalBiasValue
            j += 1
    j

getSignalSellerBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < ( 0.0 - signalBiasValue )
            j += 1
    j

getSignalNoBias(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if signal[i] < signalBiasValue and signal[i] > ( 0.0 - signalBiasValue )
            j += 1
    j

getPriceRising(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] > close[i + 1]
            j += 1
    j


getPriceFalling(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if close[i] < close[i + 1] 
            j += 1
    j

getRangeNarrowing(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] < intrabarRange[i + 1] 
            j+= 1
    j

getRangeBroadening(lookBack) =>
    j = 0
    for i = 1 to lookBack
        if intrabarRange[i] > intrabarRange[i + 1] 
            j+= 1
    j

bool isNegativeSignalReversal = signalSlope < 0.0 and signalSlope[1] > 0.0
bool isNegativeMacdReversal = macdSlope < 0.0 and macdSlope[1] > 0.0

bool isPositiveSignalReversal = signalSlope > 0.0 and signalSlope[1] < 0.0
bool isPositiveMacdReversal = macdSlope > 0.0 and macdSlope[1] < 0.0

bool hasBearInversion = signalSlope > 0.0 and macdSlope < 0.0
bool hasBullInversion = signalSlope < 0.0 and macdSlope > 0.0

bool hasSignalBias = math.abs(signal) >= signalBiasValue
bool hasNoSignalBias = signal < signalBiasValue and signal > ( 0.0 - signalBiasValue )

bool hasSignalBuyerBias = hasSignalBias and signal > 0.0
bool hasSignalSellerBias = hasSignalBias and signal < 0.0

bool hasPositiveMACDBias = macd > macdBiasValue
bool hasNegativeMACDBias = macd < ( 0.0 - macdBiasValue )

bool hasBullAntiPattern = ta.crossunder(macd, signal)
bool hasBearAntiPattern = ta.crossover(macd, signal)

bool hasSignificantBuyerVolBias = buyVolume > ( sellVolume * 1.5 )
bool hasSignificantSellerVolBias = sellVolume > ( buyVolume * 1.5 )

// 393.60 Profit 52.26% 15m
if ( hasBullInversion and rsiSlope > 1.5 and volume > 300000.0 )
    strategy.entry("15C1", strategy.long, qty=10.0)
strategy.exit("TPS", "15C1", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 356.10 Profit 51,45% 15m
if ( getVolBias(shortLookBack) == false and rsiSlope > 3.0 and signalSlope > 0)
    strategy.entry("15C2", strategy.long, qty=10.0)
strategy.exit("TPS", "15C2", limit=strategy.position_avg_price + takeProfit, stop=strategy.position_avg_price - stopLoss)

// 124 Profit 52% 15m
if ( rsiSlope < -11.25 and macdSlope < 0.0 and signalSlope < 0.0)
    strategy.entry("15P1", strategy.short, qty=10.0)
strategy.exit("TPS", "15P1", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)

// 455.40 Profit 49% 15m
if ( math.abs(math.abs(macd) - math.abs(signal)) < .1 and buyVolume > sellVolume and hasBullInversion)
    strategy.entry("15P2", strategy.short, qty=10.0)
strategy.exit("TPS", "15P2", limit=strategy.position_avg_price - takeProfit, stop=strategy.position_avg_price + stopLoss)