Giao dịch động lượng với chiến lược chéo trung bình di chuyển kép

Tác giả:ChaoZhang, Ngày: 2024-04-01 11:53:14
Tags:

img

Tổng quan

Chiến lược này sử dụng 8 giai đoạn và 21 giai đoạn chỉ số trung bình chuyển động (EMA) để xác định những thay đổi trong xu hướng thị trường. Một tín hiệu mua được tạo ra khi EMA ngắn hạn vượt qua trên EMA dài hạn từ dưới, trong khi tín hiệu bán được tạo ra khi EMA ngắn hạn vượt qua dưới EMA dài hạn từ trên. Chiến lược cũng kết hợp ba mức thấp nhất liên tiếp (HLs) và ba mức cao nhất liên tiếp (LHs) để xác nhận thêm sự đảo ngược xu hướng. Ngoài ra, mức dừng lỗ và lấy lợi nhuận được thiết lập để quản lý rủi ro và khóa lợi nhuận.

Nguyên tắc chiến lược

  1. Tính toán EMA 8 và 21 giai đoạn để xác định hướng xu hướng chính.
  2. Xác định ba mức thấp nhất liên tiếp (HLs) và ba mức thấp nhất liên tiếp (LHs) như là tín hiệu sớm của sự đảo ngược xu hướng tiềm năng.
  3. Tạo tín hiệu mua khi EMA 8 giai đoạn vượt qua EMA 21 giai đoạn và xảy ra đột phá HL; tạo tín hiệu bán khi EMA 8 giai đoạn vượt qua EMA 21 giai đoạn và xảy ra đột phá LH.
  4. Đặt mức dừng lỗ ở mức 5% của giá nhập cảnh và mức lấy lợi nhuận ở mức 16% của giá nhập cảnh để quản lý rủi ro và khóa lợi nhuận.
  5. Đóng vị trí và mở một vị trí ngược khi một tín hiệu ngược lại xuất hiện.

Ưu điểm chiến lược

  1. Kết hợp EMA và mô hình hành động giá (HL và LH) để xác nhận xu hướng, tăng độ tin cậy tín hiệu.
  2. Thiết lập mức dừng lỗ và lấy lợi nhuận rõ ràng, giúp quản lý rủi ro và khóa lợi nhuận.
  3. Áp dụng cho nhiều khung thời gian và thị trường khác nhau, cung cấp một số mức độ linh hoạt.
  4. Logic rõ ràng, dễ hiểu và thực hiện.

Rủi ro chiến lược

  1. Trong thị trường bất ổn, giao dịch chéo thường xuyên có thể dẫn đến nhiều tín hiệu sai, dẫn đến tổn thất.
  2. Mức dừng lỗ và lợi nhuận cố định có thể không thích nghi tốt với các điều kiện thị trường khác nhau, dẫn đến chi phí cơ hội tiềm năng hoặc tổn thất lớn hơn.
  3. Chiến lược dựa trên dữ liệu lịch sử và có thể không thích nghi tốt với các sự kiện đột ngột hoặc những thay đổi cơ bản.

Hướng dẫn tối ưu hóa chiến lược

  1. Đưa ra các cơ chế dừng lỗ và lấy lợi nhuận thích nghi, chẳng hạn như điều chỉnh mức dựa trên biến động (ví dụ, ATR), để thích nghi tốt hơn với các điều kiện thị trường khác nhau.
  2. Kết hợp các chỉ số hoặc yếu tố khác, chẳng hạn như khối lượng, Chỉ số sức mạnh tương đối (RSI), vv, để lọc tín hiệu hơn nữa và cải thiện độ tin cậy.
  3. Tối ưu hóa các thông số (ví dụ: thời gian EMA, tỷ lệ dừng lỗ và tỷ lệ lợi nhuận) để tìm ra sự kết hợp hiệu suất tốt nhất cho các thị trường hoặc công cụ cụ thể.
  4. Xem xét việc đưa ra các biện pháp quản lý rủi ro, chẳng hạn như kích thước vị trí, để kiểm soát rủi ro của các giao dịch cá nhân.

Tóm lại

Chiến lược này sử dụng sự chéo chéo của EMA 8 giai đoạn và 21 giai đoạn, kết hợp với các mô hình giá HL và LH, để xác định sự đảo ngược xu hướng và tạo ra các tín hiệu giao dịch. Các quy tắc dừng lỗ và lấy lợi nhuận rõ ràng giúp quản lý rủi ro và khóa lợi nhuận. Tuy nhiên, chiến lược có thể tạo ra các tín hiệu sai trong các thị trường bất ổn, và mức dừng lỗ và lấy lợi nhuận cố định có thể không thích nghi tốt với các điều kiện thị trường khác nhau. Để cải thiện hơn nữa, hãy xem xét giới thiệu dừng lỗ và lấy lợi nhuận thích nghi, kết hợp các chỉ số khác, tối ưu hóa các tham số và giới thiệu các biện pháp quản lý rủi ro. Nhìn chung, chiến lược cung cấp một khuôn khổ cho đà và theo xu hướng giao dịch nhưng đòi hỏi điều chỉnh và tối ưu hóa dựa trên thị trường cụ thể và sở thích cá nhân.


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

//@version=5
strategy('Trend Following 8&21EMA with strategy tester [ukiuro7]', overlay=true, process_orders_on_close=true, calc_on_every_tick=true, initial_capital = 10000)

//INPUTS
lh3On = true
hl3On = true
emaOn = input(title='105ema / 30min', defval=true) 
assistantOn = input(title='Assistant', defval=true)
textOn = input(title='Text', defval=true)

showRiskReward = input.bool(true, title='Show Risk/Reward Area', group="TP/SL")
stopPerc = input.float(5.0, step=0.1, minval=0.1, title='Stop-Loss %:',group="TP/SL") / 100
tpPerc = input.float(16.0, step=0.1, minval=0.1, title='Take-Profit %:',group="TP/SL") / 100

backtestFilter = input(false, title='Backtest Entries to Date Range',group="Backtest Date Range")
i_startTime = input(defval=timestamp('01 Jan 2022 00:00'), inline="b_1", title='Start',group="Backtest Date Range")
i_endTime = input(defval=timestamp('01 Jan 2029 00:00'), inline="b_1", title='End',group="Backtest Date Range")
inDateRange = true

message_long_entry = input.string(title='Alert Msg: LONG Entry', defval ='', group='Alert Message')
message_short_entry = input.string(title='Alert Msg: SHORT Entry', defval='', group='Alert Message')
message_long_exit = input.string(title='Alert Msg: LONG SL/TP', defval='', group='Alert Message')
message_short_exit = input.string(title='Alert Msg: SHORT SL/TP', defval='', group='Alert Message')  

//CALCS
threeHigherLows() =>
    low[0] >= low[1] and low[1] >= low[2]

threeLowerHighs() =>
    high[2] >= high[1] and high[1] >= high[0]

breakHigher() =>
    padding = timeframe.isintraday ? .02 : .1
    high >= high[1] + padding

breakLower() =>
    padding = timeframe.isintraday ? .02 : .1
    low <= low[1] - padding

lh3 = threeLowerHighs() and lh3On
lh3bh = lh3[1] and breakHigher() and lh3On

hl3 = threeHigherLows() and hl3On
hl3bl = hl3[1] and breakLower() and hl3On

ema8 = ta.ema(close, 8)
ema21 = ta.ema(close, 21)

//VARS
var float longStop = na, var float longTp = na
var float shortStop = na, var float shortTp = na

//CONDS
isUptrend = ema8 >= ema21
isDowntrend = ema8 <= ema21
trendChanging = ta.cross(ema8, ema21)

buySignal = lh3bh and lh3[2] and lh3[3] and isUptrend and timeframe.isintraday
sellSignal = hl3bl and hl3[2] and hl3[3] and isDowntrend and timeframe.isintraday

goingDown = hl3 and isDowntrend and timeframe.isintraday
goingUp = lh3 and isUptrend and timeframe.isintraday

projectXBuy = trendChanging and isUptrend
projectXSell = trendChanging and isDowntrend

longCond = trendChanging and isUptrend and assistantOn
shortCond = trendChanging and isDowntrend and assistantOn

//STRATEGY
if shortCond and strategy.position_size > 0 and barstate.isconfirmed
    strategy.close('Long', comment='CLOSE LONG', alert_message=message_long_exit)

if longCond and strategy.position_size < 0 and barstate.isconfirmed
    strategy.close('Short', comment='CLOSE SHORT', alert_message=message_short_exit) 

if longCond and strategy.position_size <= 0 and barstate.isconfirmed and inDateRange
    longStop := close * (1 - stopPerc)
    longTp := close * (1 + tpPerc)
    strategy.entry('Long', strategy.long, comment='LONG', alert_message=message_long_entry)
    strategy.exit('Long Exit', 'Long', comment_loss="SL LONG", comment_profit = "TP LONG", stop=longStop, limit=longTp, alert_message=message_long_exit)

if shortCond and strategy.position_size >= 0 and barstate.isconfirmed and inDateRange
    shortStop := close * (1 + stopPerc)
    shortTp := close * (1 - tpPerc)
    strategy.entry('Short', strategy.short, comment='SHORT', alert_message=message_short_entry)
    strategy.exit('Short Exit', 'Short', comment_loss="SL SHORT", comment_profit="TP SHORT", stop=shortStop, limit=shortTp, alert_message=message_short_exit)

//PLOTS
plotshape(longCond, style=shape.triangleup, location=location.belowbar, color=color.new(color.green, 0), size=size.small, text='Buy')
plotshape(shortCond, style=shape.triangledown, location=location.abovebar, color=color.new(color.red, 0), size=size.small, text='Sell')
plotchar(trendChanging and isUptrend and close < open and assistantOn, char='!', location=location.abovebar, color=color.new(color.green, 0), size=size.small)

aa = plot(ema8, linewidth=3, color=color.new(color.green, 0), editable=true)
bb = plot(ema21, linewidth=3, color=color.new(color.red, 0), editable=true)
fill(aa, bb, color=isUptrend ? color.new(color.green,90) : color.new(color.red,90))
buyZone = isUptrend and lh3 and high < ema21 and timeframe.isintraday
sellZone = isDowntrend and hl3 and low > ema21 and timeframe.isintraday

L1 = plot(showRiskReward and strategy.position_size > 0 ? strategy.position_avg_price : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long Entry Price')
L2 = plot(showRiskReward and strategy.position_size > 0 ? longTp : na, color=color.new(color.green, 0), linewidth=1, style=plot.style_linebr, title='Long TP Price')
L3 = plot(showRiskReward and strategy.position_size > 0 ? longStop : na, color=color.new(color.red, 0), linewidth=1, style=plot.style_linebr, title='Long Stop Price')

S1 = plot(showRiskReward and strategy.position_size < 0 ? strategy.position_avg_price : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short Entry Price')
S2 = plot(showRiskReward and strategy.position_size < 0 ? shortTp : na, color=color.new(color.teal, 0), linewidth=1, style=plot.style_linebr, title='Short TP Price')
S3 = plot(showRiskReward and strategy.position_size < 0 ? shortStop : na, color=color.new(color.maroon, 0), linewidth=1, style=plot.style_linebr, title='Short Stop Price')

fill(L1, L2, color=color.new(color.green, 90))
fill(L1, L3, color=color.new(color.red, 90))
fill(S1, S2, color=color.new(color.teal, 90))
fill(S1, S3, color=color.new(color.maroon, 90))

bgcolor(inDateRange == false ? color.new(color.red,90) : na, title="Backtest Off-Range") 


Thêm nữa