反転デュアルMACD取引戦略


作成日: 2024-01-12 14:49:47 最終変更日: 2024-01-12 14:49:47
コピー: 0 クリック数: 690
1
フォロー
1617
フォロワー

反転デュアルMACD取引戦略

概要

逆転双MACD取引戦略は,MACD指標を活用してトレンド逆転信号を識別する量化取引戦略である.この戦略は,RVI指標とCCI指標を同時に組み合わせて,購入のタイミングを確認し,いくつかの偽逆転をフィルターする.この戦略は,日内およびショートライン取引に適用される.

戦略原則

戦略は主にMACD指標に基づいている。MACDは,より速い移動平均EMA(12) を減算して,より遅い移動平均EMA(26) を得て快線,そしてSIGNAL(9) を慢線として使用する。快線上の慢線を横切るとゴールデン・クロスが生じると看板;快線下の慢線を横切るとデッド・クロスが生じると看板。

この戦略は,反転の機会を探すために二時間周期のMACD指標を使用する。戦略は,6時間のレベルMACDを使用して,全体的なトレンドの方向性を判断し,日中の1時間のレベルMACDで反転の信号を探します。6時間のMACDが上昇傾向にあるとき,1時間のレベルは,短線の下を通過するデッドフォークの信号が発生した場合,価格が反転する可能性を示します。このとき,RVI指標とCCI指標を組み合わせて,さらに確認し,買い信号を生成します。

RVI指標は,最新のK線の数行の閉盘価格と開盤価格と最高価格と最低価格との関係を測定する.RVIが0.2を下回ると,超売りとみなされる.CCI指標が100を下回ると,超売りを表す.したがって,RVI指標が0.2を下回ると,CCI指標が95を下回ると,この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)