双重MACD逆転取引戦略

作者: リン・ハーンチャオチャン開催日:2024年1月12日 14:49:47
タグ:

img

概要

ダブルMACD逆転取引戦略 (Dual MACD Reversal Trading Strategy) は,トレンド逆転信号を識別するためにMACD指標を使用する定量的な取引戦略である.この戦略は,RVI指標とCCI指標を組み合わせて購入信号を確認し,いくつかの偽逆転をフィルタリングする.この戦略は日中および短期取引に適している.

戦略の論理

この戦略は主にMACD指標に基づいています.MACDは,高速線を得るために高速移動平均EMA ((12) をマイナス遅い移動平均EMA ((26) を減算し,スローラインとしてSIGNAL (SIGNAL)) を使用します.高速線がスローラインを超越してゴールデンクロスを生成すると,上昇傾向にあります.高速線がスローラインを下回ってデッドクロスを生成すると,下落傾向にあります.

この戦略は,逆転の機会を特定するために2つのタイムフレームMACDインジケーターを使用する.この戦略は,全体的なトレンド方向を決定するために6時間のMACDと逆転信号を見つけるために1時間のMACDを使用する. 6時間のMACDが上昇傾向にあるとき,1時間の高速線が遅い線以下を横断して死亡クロス信号を生成した場合,価格は上昇に逆転する可能性を示します.この時点で,RVIインジケーターとCCIインジケーターを組み合わせてさらに確認し,購入信号を生成します.

RVIインジケーターは,最も最近の数個のキャンドルスタイルの閉じる価格と開通価格と最高値と最低値の関係を測定する. 0.2未満のRVIは過売れとみなされる. -100以下のCCIインジケーターは過売れを示す.したがって,戦略は0.2以下のRVIインジケーターと -95以下のCCIインジケーターを使用して購入信号を確認するのに役立ちます.

利点分析

この戦略は,2つのタイムフレームMACDとRVIおよびCCI指標を組み合わせて,逆転の機会を正確に特定し,戦略の安定性を向上させるためにいくつかの偽逆転信号をフィルタリングします. 具体的な利点は以下のとおりです.

  1. 6時間MACDを使用して主要トレンドを決定し,より広範な市場における不確実性が高まる環境での取引を避ける.

  2. 1時間MACDは逆転タイミングを特定し,短いサイクル価格調整を記録します.

  3. RVI指標とCCI指標の組み合わせにより,逆転のタイミングがより正確に決定できます.

  4. ストップ・ロスは損失を減らすための戦略です

リスク分析

この戦略には,主に以下に反映されるいくつかのリスクもあります.

  1. MACD自体は誤った信号を生成する傾向があるため,補助指標が良いフィルタリング効果を持っているにもかかわらず,損失を完全に回避することは不可能である.ポジションサイズを減らすことが推奨される.

  2. RVIとCCI指標は誤った信号を発し,より良い逆転機会を逃したり,不必要な損失を増やす可能性があります.RVIとCCIパラメータを合理的に調整することが推奨されます.

  3. 不適切なストップ損失設定は,ストップ損失を頻繁に誘発したり,あまりにも緩やかであれば,損失をタイムリーに制御することができない可能性があります.市場の変動に応じてストップ損失の大きさを調整することが推奨されます.

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

戦略は次の側面からさらに最適化できます.

  1. 現在,1時間と6時間の2つのタイムフレームを使用して,より安定したパラメータを見つけるためにより多くのタイムフレームの組み合わせをテストすることができます.

  2. KDJ,WR,OBVなど,より多くの指標が導入され,取引ポイントを判断するのに役立ちます.しかし,過度に複雑な取引信号を生成しないように注意してください.

  3. パラメータは,さまざまな種類に対して継続的に最適化され,パラメータライブラリが確立され,中低周波取引に適した種類については,より長いサイクルパラメータを適切に増加させることができます.

  4. ダイナミックストップ・ロスのメカニズムは,利益が増加するにつれてストップ・ロスのポイントを徐々に移動させるように設定できます. または,市場の変動に応じてリアルタイムでストップ・ロスの大きさを調整することができます.

概要

ダブルMACD逆転取引戦略は,トレンド判断と逆転シグナルを包括的に考慮し,RVIおよびCCI指標によってシグナルをフィルタリングするのに役立ちます.この戦略は,良好なリスク・リターン比率を持つ短期調整を効果的に特定し,日中および短期取引に適しており,全体的な戦略多様性を提供するマルチ戦略ポートフォリオの一部として使用することもできます.


/*backtest
start: 2023-01-05 00:00:00
end: 2024-01-11 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Bat MACD", overlay=true)

fastLength = input(12)
slowlength = input(26)
MACDLength = input(9)
h=1.05

MACD = ema(close, fastLength) - ema(close, slowlength)
aMACD = ema(MACD, MACDLength)
delta = MACD - aMACD
hmacd= aMACD>0? h*aMACD: -(1/h)*abs(MACD) 

MACDD= (request.security(syminfo.tickerid,'360',ema(close, fastLength)) - request.security(syminfo.tickerid,'360',ema(close,slowlength)))
aMACDD = (request.security(syminfo.tickerid,'360',ema(ema(request.security(syminfo.tickerid,'360',close), fastLength)-ema(request.security(syminfo.tickerid,'360',close),slowlength), MACDLength)))
deltad= MACDD-aMACDD
L= input(0.95, title="SL")
SL = L*ema(close,10)

//MACD
slow = input(26,"Short period")
fast = input(12, "Long period")
signal = input(9, "Smoothing period")
//MACD = ema(close,fast)-ema(close,slow)
dMACD= MACD<0? ema(MACD,5):0
Mcond= rising(dMACD,1)
mcount=0.0
mcount := Mcond ? nz(mcount[1]) + 1 : nz(mcount[1])
counter=0
counter := (mcount-mcount[1]==0) ? nz(counter[1]) + 1 : 0
//counter := counter==3 ? 0: nz(counter[1])
pp=0.0
mc=0.0
pp:= (counter-counter[1]<0)? close[1] : nz(pp[1])
mc:= (counter-counter[1]<0)? MACD[1] : nz(mc[1])

bull = (pp-pp[1]<-close*0.005 and mc-mc[1]>0.02*abs(MACD) and MACD<0 and MACD[1]<0)? 1:0

//bgcolor(bull?green:white)
//RVI
p=10
CO=close-open
HL=high-low
value1 = (CO + 2*CO[1] + 2*CO[2] + CO[3])/6
value2 = (HL + 2*HL[1] + 2*HL[2] + HL[3])/6
num=sum(value1,p)
denom=sum(value2,p)
rvi=denom!=0?num/denom:0

//RVI
drvi= (rvi<0.2)? ema(rvi-0.20,3):0
RVcond= rising(drvi,1)
rvcount=0.0
rvcount := RVcond ? nz(rvcount[1]) + 1 : nz(rvcount[1])
rvcounter=0
rvcounter := (rvcount-rvcount[1]==0) ? nz(rvcounter[1]) + 1 : 0
//counter := counter==3 ? 0: nz(counter[1])
rvpp=0.0
rvmc=0.0
rvpp:= (rvcounter-rvcounter[1]<0)? close[1] : nz(rvpp[1])
rvmc:= (rvcounter-rvcounter[1]<0)? drvi[1] : nz(rvmc[1])
rvbull = (rvpp-rvpp[1]<-close*0.005 and rvmc-rvmc[1]>0.02 and drvi<0 and drvi[1]<0)? 1:0

//VolCCI
length1 = input(10, minval=1)
xMAVolPrice = ema(volume * close, length1)
xMAVol = ema(volume, length1)
src1 = xMAVolPrice / xMAVol
map = sma(src1, length1)
cci = (src1 - map) / (0.015 * dev(src1, length1))
cfi= (cci<0)? ema(cci,3) :0
CCcond= rising(cfi,1)
cccount=0.0
cccount := CCcond ? nz(cccount[1]) + 1 : nz(cccount[1])
cccounter=0
cccounter := (cccount-cccount[1]==0) ? nz(cccounter[1]) + 1 : 0
//counter := counter==3 ? 0: nz(counter[1])
ccpp=0.0
ccmc=0.0
ccpp:= (cccounter-cccounter[1]<0)? close[1] : nz(ccpp[1])
ccmc:= (cccounter-cccounter[1]<0)? cci[1] : nz(ccmc[1])
ccbull = (ccpp-ccpp[1]<-close*0.003 and ccmc-ccmc[1]>20 and cci<-95 and cci[1]<-95)? 1:0

A= bull+ccbull+rvbull
if ((MACD>hmacd)  and deltad>0 and delta>delta[1])
    strategy.entry("Long", strategy.long, comment="Buy", qty=10000/close)
if (crossunder(delta, 0) or crossunder(close,SL))
    strategy.close("Long")
if(crossover(low,SL) and SL-SL[1]<close*0.005 and SL-SL[1]>-close*0.005)    
    strategy.entry("Long", strategy.long, comment="Buy", qty=10000/close)
if A 
    strategy.entry("Long", strategy.long, comment="Buy", qty=10000/close)
plot(SL)

//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)

もっと