ジョアンヌ 暗号 - MACD スカルピング戦略の二重移動平均値

作者: リン・ハーンチャオチャン, 日付: 2023年11月2日 16:09:08
タグ:

img

概要

この戦略の主なアイデアは,トレンドのトレンド方向を決定するために,デュアル・ムービング・平均値とMACD指標を組み合わせることです.速いMAがスローMAを超えると,上向きの機会をシグナルします.速いMAがスローMAを下回ると,ダウントレンドの機会をシグナルします.MACDヒストグラムは,特定のエントリー&エグジットポイントを決定するために,0を超えるとロングになり,0を下回るとショートします.

戦略の論理

  1. MACDの高速EMA (12日),遅いEMA (26日),シグナルEMA (9日) を計算する.

  2. MACDヒストグラム (高速EMA - 遅いEMA) とMACD信号線 (MACDヒストグラムの9日間のEMA) を計算する.

  3. 50日および200日MAsを傾向として計算する.

  4. MACDヒストグラムが0を超えると上昇信号で,0を下回ると下落信号です.

  5. 緩やかなEMAを突破した速いEMAと,長いMAを突破した短いMAは,上昇シグナルを示します.

  6. 低速EMAを下回る高速EMAと,低速EMAを下回る短いEMAは下降シグナルを示します.

  7. EMAクロスパラメータの後に最大取引を使用した各MAクロスオーバー後の取引の制限数

  8. ストップ・ロスを使って 取引を終了します

利点

  1. 二重MAsは,反トレンド取引を避けるため,全体的なトレンドを決定します.

  2. MACDは,トレンドシフトを把握するためのエントリーとアウトプット点を識別します.

  3. 組み合わせは,トレンド方向へのエントリに良いタイミングを提供します.

  4. クロスオーバー後の取引数を制限し,トレンドを追うのを避ける.

  5. 損失を止め 利益をコントロールするリスクをとる

  6. パラメータは最適化して性能が向上できます

リスク

  1. 間違ったトレンド決定は逆トレンド損失につながります. 確固としたトレンドを確立するためにMA差の要件を拡大します.

  2. MACD信号は価格の動きを遅らせ,早期または遅刻入場を起こす.MACDパラメータを調整するかフィルターを追加します.

  3. 不適切なストップ・ロストとテイク・プロフィートレベルは,過剰なストップまたは不十分なプロフィートにつながります.各インstrumentのパラメータ最適化が必要です.

  4. パラメータ最適化は困難である.異なる製品とタイムフレームに異なるパラメータの組み合わせが必要である.広範な初期テストを必要とする.

増進 の 機会

  1. KDのような他の指標をテストして 傾向を特定します

  2. ボリンジャー帯やATRストップなどMACD信号をフィルターする他の指標を追加します

  3. ストップ・ロスを最適化し 各商品の利益を取ります

  4. より良いパラメータを見つけるために ウォークフォワードとランダム最適化を使用します

  5. 取引頻度を減らすメカニズムを追加します 例えばMACDゾーンが0の周りに

  6. パラメータと組み合わせの最適化を複数の製品で自動化します

概要

この戦略は,トレンド指向とMACDの強みを組み合わせ,強力なトレンドフォローシステムを作成する.パラメータの最適化と指標の組み合わせにより,追加のパフォーマンスの向上が可能である.全体として,生動取引に考慮すべき強力なリスク管理と利益の可能性がある.しかし,パラメータテストは依然として,堅牢性を確保するために各製品に必要である.


/*backtest
start: 2023-10-02 00:00:00
end: 2023-11-01 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="ComiCo - Joel on Crypto - MACD Scalping", shorttitle="ComiCo - Joel on Crypto - MACD Scalping")
// Getting inputs
slow_length1 = input(title="EMA Trend 1", defval=50)
slow_length2 = input(title="EMA Trend 2 ", defval=200)
fast_length = input(title="MACD Fast Length", defval=12)
slow_length = input(title="MACD Slow Length", defval=26)
signal_length = input.int(title="MACD Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
src = input(title="MACD Source", defval=close)

i_switch = input.string(title="Tick Highlight", defval="Moving average" ,options=["Moving average","Fixed value" ])
i_switch2 = input.string(title="Tick Source", defval="Highest bar" ,options=["Highest bar","Average","Last bar"])

signal_lengthup = input.int(title="Upticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)
signal_lengthdown = input.int(title="Downticks Avg. Length",  minval = 1, maxval = 5000, defval = 72)

signal_lengthMA = input.float(title="Ticks Avg. Multiplier",  minval = 0, maxval = 5000, defval = 2, step = 0.1)

sma_source = "EMA"
sma_signal = "EMA"
// Plot colors

col_grow_above = #26A69A
col_fall_above =#B2DFDB
col_grow_below = #FFCDD2
col_fall_below = #FF5252
// Calculating

fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)

time_macd=timeframe.period=="1"?"1": timeframe.period=="3"?"1": timeframe.period=="5"?"1": timeframe.period=="15"?"3":timeframe.period=="30"?"5":timeframe.period=="60"?"15":timeframe.period=="120"?"30":timeframe.period=="240"?"60":timeframe.period=="D"?"240":timeframe.period=="W"?"D":timeframe.period=="M"?"W":timeframe.period=="12M"?"M":timeframe.period



macd = fast_ma - slow_ma
macd1=request.security(syminfo.tickerid, time_macd, macd)
signal = sma_signal == "SMA" ? ta.sma(macd1, signal_length) : ta.ema(macd1, signal_length)

ema50=ta.ema(close,slow_length1)
ema200=ta.ema(close ,slow_length2)

var TradeCounter = 0
MaxCount = input.int(title = "Max trades after EMA cross", minval = 0, maxval = 1000, defval = 3)
bull = ema50>ema200
if bull != bull[1]
    TradeCounter := 0


hist = request.security(syminfo.tickerid, time_macd, macd1 - signal)


f() => [hist[4],hist[3],hist[2],hist[1], hist]
ss=request.security(syminfo.tickerid, time_macd, hist, barmerge.gaps_on,barmerge.lookahead_off)



[ss5,ss4,ss3,ss2,ss1]=request.security(syminfo.tickerid, time_macd, f(), barmerge.gaps_on,barmerge.lookahead_off)



a = array.from(ss5,ss4,ss3,ss2,ss1)

s3=i_switch2=="Highest bar"?(ss>0? array.max(a, 0) : array.min(a, 0)):i_switch2=="Average"?array.avg(a):i_switch2=="Last bar"?ss1:0

saa=timeframe.period == '1'? ss:s3

saa2=timeframe.period == '1'? ss:s3*signal_lengthMA


colorss=(s3>=0 ? (s3[1] < s3 ? col_grow_above : col_fall_above) : (s3[1] < s3 ? col_grow_below : col_fall_below))


saadown = saa2
saaup = saa2

saadown:=saa>=0? saa2:saadown[1]

saaup:=saa<0? saa2:saaup[1]



verr=ta.ema(saadown,signal_lengthup)
dowww=ta.ema(saaup,signal_lengthdown)

ss22=plot(verr, title="Avg. Cloud Upper 1", color=color.new(color.white, 100))
ss33=plot(dowww, title="Avg. Cloud Lower 1", color=color.new(color.white, 100))

fill(ss22, ss33, color.new(color.white, 93), title="Avg. Cloud Background")

fixeduptick = input(title="Fixed Uptick Value", defval=30)
fixeddowntick = input(title="Fixed Downtick Value", defval=-30)
minl = i_switch=="Fixed value"? fixeduptick  :  verr
maxl = i_switch=="Fixed value"? fixeddowntick : dowww 

plot(minl, title="Avg. Cloud Upper 2", color=color.new(color.white, 81))
plot(maxl, title="Avg. Cloud Lower 2", color=color.new(color.white, 81))


colors2= s3<=minl and s3>=maxl ? #2a2e39 : colorss

coro2=s3>0? ema50>ema200 ? #2a2e39 :  colors2 : ema50<ema200 ? #2a2e39: colors2
plot(saa, title="Histogram", style=plot.style_columns, color=coro2)

LimitDiff = input.float(title="Limit Price Difference",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
TP = input.float(title="Take Profit",  minval = 0, maxval = 0.1, defval = 0.005, step = 0.0005)
SL = input.float(title="Stop Loss",  minval = 0, maxval = 0.1, defval = 0.004, step = 0.0005)

minEMAdiff = input.float(title = "Min EMA difference", defval = 100, step = 10)

if #2a2e39 != coro2
    a22 = 0
    if ema50<ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 + LimitDiff)
        strategy.entry("enter short", strategy.short, limit = LimitPrice)
        strategy.exit("exit short", "enter short", limit = LimitPrice * (1 - TP), stop = LimitPrice * (1 + SL))
        TradeCounter := TradeCounter + 1
    if ema50>ema200 and TradeCounter < MaxCount and math.abs(ema50-ema200) > minEMAdiff
        LimitPrice = close * (1 - LimitDiff)
        strategy.entry("enter long", strategy.long, limit = LimitPrice)
        strategy.exit("exit long", "enter long", limit = LimitPrice * (1 + TP), stop = LimitPrice * (1 - SL))
        TradeCounter := TradeCounter + 1

//alertcondition(#2a2e39 != coro2 , title='MACD Tick Alert', message='Joel on Crypto - MACD Tick Alert')



もっと