MACD Moving Average Crossover Trend Theo chiến lược với Trailing Stop Loss

Tác giả:ChaoZhang, Ngày: 2023-11-06 11:56:14
Tags:

img

Tổng quan

Chiến lược này sử dụng MACD để xác định hướng xu hướng, kết hợp với đường chéo EMA và SMA để xác nhận. Tín hiệu đầu vào là khi biểu đồ MACD vượt qua trên đường tín hiệu và xu hướng tăng. Stop loss được đặt ở mức giá dưới mức dừng dừng ATR nổi. Chiến lược cũng thoát một phần để kiếm lợi nhuận, thoát nhiều hơn khi giá tăng lớn hơn và giữ một số vị trí với stop dừng lại cho đến khi stop stop bị tấn công.

Lý luận

Tín hiệu nhập cảnh

Khi EMA nhanh hơn vượt qua trên EMA chậm hơn, nó cho thấy xu hướng ngắn hạn tốt hơn xu hướng dài hạn, báo hiệu mua. Trong khi đó, đường SMA nhanh hơn vượt qua đường SMA chậm hơn cũng gợi ý động lực tăng mạnh hơn trong ngắn hạn. Vì vậy, sự kết hợp của đường MACD vượt qua trên tín hiệu và xu hướng tăng dựa trên đường chéo EMA & SMA giúp xác định các tín hiệu đầu vào mạnh hơn.

Dừng Loss

ATR được sử dụng để tính toán mức dừng lỗ. ATR có thể đo lường hiệu quả phạm vi biến động giá. Khi giá phá vỡ dưới phạm vi này, stop loss được kích hoạt. Thời gian ATR có thể được điều chỉnh - thời gian ngắn hơn cho phép dừng chính xác hơn nhưng dễ dàng dừng lại, trong khi thời gian dài hơn cho phép dừng rộng hơn nhưng mạnh mẽ hơn. Mức dừng cũng theo dõi giá tăng, đạt được hiệu ứng theo xu hướng.

Tín hiệu ra

Rõ ràng, một số người đã từng sử dụng một số phương pháp như: (i.e. (i.e. (i.e. (i.e. (i.e. (i.e. (i.e. (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.e.) (i.

Ưu điểm

  • Xu hướng đánh giá MACD kết hợp với EMA/SMA crossover xác nhận thời gian nhập cảnh
  • ATR trailing stop cho phép dừng lỗ hiệu quả trong khi theo xu hướng
  • Các bước ra một phần giúp lấy lợi nhuận, khóa lợi nhuận và giữ cho thời gian

Rủi ro và giải pháp

  • Nguy cơ tín hiệu sai từ chỉ số MACD và xu hướng.

  • Rủi ro của ATR dừng lỗ bị tấn công. Có thể tăng thời gian ATR hoặc stop loss nhân.

  • Rủi ro của vị trí sau bị mắc kẹt giảm kích thước vị trí sau và cắt giảm mất mát trong thời gian.

Cơ hội gia tăng

  • Tối ưu hóa các thông số MACD để đánh giá xu hướng tốt hơn

  • Tối ưu hóa thời gian ATR để có mức dừng lỗ tốt hơn

  • Tối ưu hóa tỷ lệ thoát và kích thước vị trí để giảm rủi ro bị mắc kẹt

  • Xem xét thêm chuyển đổi lấy lợi nhuận hoặc chỉ số biến động để cải thiện dừng lỗ

Tóm lại

Chiến lược này kết hợp MACD, EMA / SMA và các chỉ số khác để xác định thời gian xu hướng và nhập chính xác. ATR dừng lỗ nổi giúp khóa lợi nhuận trong khi theo xu hướng. Các bước ra được phân chia để lấy lợi nhuận, đảm bảo lợi nhuận và giữ vị trí trong thời gian. Nhìn chung nó ổn định với kết quả tốt. Nhưng các tham số và lối ra có thể được tối ưu hóa hơn nữa để có lợi nhuận tốt hơn.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © Deobald

//@version=4
strategy("MACD Strategy", overlay=true)

// FUNCTIONS

Ema(src,p) =>
    ema = 0.
    sf = 2/(p+1)
    ema := nz(ema[1] + sf*(src - ema[1]),src)

Sma(src,p) => a = cum(src), (a - a[max(p,0)])/max(p,0)

Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(34, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p3 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p4 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p3, p4, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)


// MACD
fast_length = input(title="Fast Length", type=input.integer, defval=3)
slow_length = input(title="Slow Length", type=input.integer, defval=5)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 2)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=true)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? Sma(src, fast_length) : Ema(src, fast_length)
slow_ma = sma_source ? Sma(src, slow_length) : Ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? Sma(macd, signal_length) : Ema(macd, signal_length)
hist = macd - signal

//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
// plot(macd, title="MACD", color=col_macd, transp=0)
// plot(signal, title="Signal", color=col_signal, transp=0)



// TAKE PROFIT AND STOP LOSS
long_tp1_inp = input(1, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(10, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(5, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(50, title="Long Take Profit 2 Qty", step=1)

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)




// Stop Loss
multiplier = input(2.2, "SL Mutiplier", minval=1, step=0.1)
ATR_period=input(17,"ATR period", minval=1, step=1)

// Strategy
entry_long=crossover(macd,signal) and leadLine2 < leadLine1
entry_price_long=valuewhen(entry_long,close,0)
SL_floating_long = entry_price_long - multiplier*Atr(ATR_period)
exit_long= close < SL_floating_long 

///// BACKTEST PERIOD ///////
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, 0, 0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod() => true

if testPeriod()
    strategy.entry("long", strategy.long, comment="Long", when=entry_long)
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1)//, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.exit("TP2", qty_percent=long_tp2_qty, limit=long_take_level_2) //, trail_points=entry_price_long * long_trailing / syminfo.mintick, trail_offset=entry_price_long * long_trailing / syminfo.mintick)
    strategy.close_all("long", when=exit_long, comment="exit long" )


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? SL_floating_long : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


Thêm nữa