Joanne on Crypto - Trung bình di chuyển kép với Chiến lược scalping MACD

Tác giả:ChaoZhang, Ngày: 2023-11-02 16:09:08
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là kết hợp hai đường trung bình động và chỉ số MACD để xác định hướng xu hướng cho xu hướng sau giao dịch. Khi MA nhanh vượt qua trên MA chậm, nó báo hiệu cơ hội xu hướng tăng. Khi MA nhanh vượt qua dưới MA chậm, nó báo hiệu cơ hội xu hướng giảm.

Chiến lược logic

  1. Tính toán EMA nhanh (12 ngày), EMA chậm (26 ngày) và EMA tín hiệu (9 ngày) của MACD.

  2. Tính toán biểu đồ MACD (EMA nhanh - EMA chậm) và đường tín hiệu MACD (EMA 9 ngày của biểu đồ MACD).

  3. Tính toán MAs 50 ngày và 200 ngày như xu hướng.

  4. Đường biểu đồ MACD vượt trên 0 là tín hiệu tăng và vượt dưới 0 là tín hiệu giảm.

  5. Việc vượt qua EMA nhanh trên EMA chậm kết hợp với việc vượt qua MA ngắn trên MA dài mang lại tín hiệu tăng.

  6. Việc vượt qua EMA nhanh dưới EMA chậm kết hợp với việc vượt qua MA ngắn dưới MA dài cho tín hiệu giảm.

  7. Số lượng giao dịch giới hạn sau mỗi giao dịch chéo MA bằng cách sử dụng các giao dịch Max sau thông số chéo EMA.

  8. Sử dụng stop loss và take profit để thoát khỏi giao dịch.

Ưu điểm

  1. Các MAs kép xác định xu hướng tổng thể để tránh các giao dịch ngược xu hướng.

  2. MACD xác định các điểm vào và ra để nắm bắt sự thay đổi xu hướng.

  3. Sự kết hợp cung cấp thời gian tốt cho các mục nhập theo hướng xu hướng.

  4. Giới hạn số lượng giao dịch sau khi chéo để tránh theo đuổi xu hướng.

  5. Dừng lỗ và chấp nhận rủi ro kiểm soát lợi nhuận.

  6. Các thông số có thể được tối ưu hóa để có hiệu suất tốt hơn.

Rủi ro

  1. Xác định xu hướng sai dẫn đến mất xu hướng ngược lại.

  2. Các tín hiệu MACD làm chậm hành động giá dẫn đến các mục nhập sớm hoặc muộn. Điều chỉnh các thông số MACD hoặc thêm bộ lọc.

  3. Stop Loss và Take Profit không phù hợp dẫn đến stop quá mức hoặc lợi nhuận không đủ.

  4. Tối ưu hóa tham số là khó khăn. Sự kết hợp các tham số khác nhau cần thiết cho các sản phẩm và khung thời gian khác nhau. Yêu cầu thử nghiệm trước rộng rãi.

Cơ hội gia tăng

  1. Kiểm tra các chỉ số khác như KD để xác định xu hướng.

  2. Thêm các chỉ số khác để lọc tín hiệu MACD, như Bollinger Bands, ATR dừng.

  3. Tối ưu hóa dừng lỗ và lấy lợi nhuận cho mỗi sản phẩm.

  4. Sử dụng tiến bộ và tối ưu hóa ngẫu nhiên để tìm các thông số tốt hơn.

  5. Thêm các cơ chế để giảm tần suất giao dịch, như vùng MACD xung quanh 0.

  6. Tự động hóa các tham số và tối ưu hóa kết hợp trên nhiều sản phẩm.

Tóm lại

Chiến lược này kết hợp các điểm mạnh của hai MAs cho hướng xu hướng và MACD cho thời gian vào để tạo ra một hệ thống theo xu hướng mạnh mẽ. Lợi nhuận hiệu suất bổ sung có thể thông qua tối ưu hóa tham số và kết hợp các chỉ số. Nhìn chung, nó có khả năng quản lý rủi ro và lợi nhuận mạnh mẽ để được xem xét cho giao dịch trực tiếp.


/*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')



Thêm nữa