Chiến lược chéo giữa hai mức trung bình động

Tác giả:ChaoZhang, Ngày: 2023-11-16 17:50:52
Tags:

img

Tổng quan

Chiến lược chéo trung bình động kép đánh giá hướng xu hướng giá bằng cách tính toán trung bình động của các giai đoạn khác nhau và nhận ra xu hướng theo. Nó đi dài khi MA ngắn vượt qua MA dài, và đi ngắn khi MA ngắn vượt dưới MA dài. Đây là một chiến lược theo xu hướng điển hình.

Chiến lược logic

Chiến lược này dựa trên 9, 21 và 50 thời kỳ chỉ số EMA (Exponential Moving Averages). 9 thời kỳ EMA đại diện cho xu hướng ngắn hạn, 21 thời kỳ EMA đại diện cho xu hướng trung hạn, và 50 thời kỳ EMA đại diện cho xu hướng dài hạn.

Khi EMA 9 giai đoạn vượt qua EMA 21 giai đoạn, nó báo hiệu xu hướng tăng trong ngắn hạn, do đó đi dài. Khi EMA 9 giai đoạn vượt qua dưới EMA 21 giai đoạn, nó báo hiệu xu hướng giảm trong ngắn hạn, do đó đi ngắn. Chức năng chéo (crossover)) được sử dụng ở đây để xác định sự chéo giữa các MAs.

Logic cho long/short entry, take profit và stop loss được cấu hình. Điều kiện nhập là chéo giữa các MA. Long take profit là giá nhập * (1 + input take profit ratio), short take profit là giá nhập * (1 - input take profit ratio). Long stop loss là giá nhập * (1 - input stop loss ratio), short stop loss là giá nhập * (1 + input stop loss ratio).

Một số bộ lọc cũng được thêm vào, như bộ lọc xu hướng để tránh đi ngang, và bộ lọc vốn để tránh giao dịch khi vốn chiến lược quá thấp.

Tóm lại, chiến lược này sử dụng đường chéo EMA kép để xác định hướng xu hướng giá, với logic lấy lợi nhuận và dừng lỗ thích hợp, có thể nắm bắt xu hướng trung và dài hạn.

Phân tích lợi thế

  • Sử dụng hai đường chéo MA để xác định hướng xu hướng, logic là đơn giản và dễ hiểu.

  • Việc áp dụng các EMA của các giai đoạn khác nhau có thể đánh giá xu hướng ngắn hạn và dài hạn.

  • Lấy lợi nhuận và dừng lỗ logic khóa trong lợi nhuận và kiểm soát rủi ro.

  • Các bộ lọc giúp tránh một số tín hiệu sai ở một mức độ nào đó.

  • Các tham số có thể được cấu hình tự do, thời gian có thể được tối ưu hóa cho các môi trường thị trường khác nhau.

Phân tích rủi ro

  • Là một chiến lược đơn yếu tố, tín hiệu giao dịch có thể không đủ ổn định.

  • Khi giao thoa xảy ra, giá có thể đã tăng / giảm một đoạn, với nguy cơ mua cao và bán thấp.

  • Chi phí giao dịch không được xem xét, lợi nhuận thực tế có thể thấp hơn.

  • Không có lệnh dừng lỗ, rủi ro mất không giới hạn trong điều kiện thị trường cực đoan.

Giải pháp:

  1. Tối ưu hóa thời gian MA cho tín hiệu ổn định hơn.

  2. Thêm các chỉ báo khác vào các tín hiệu lọc.

  3. Tăng quy mô thương mại để giảm tác động chi phí.

  4. Thiết lập stop loss thích hợp để giới hạn lỗ tối đa.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Tối ưu hóa các khoảng thời gian MA để tìm kết hợp tốt nhất hoặc sử dụng tối ưu hóa thích nghi để chọn động các khoảng thời gian tốt nhất.

  2. Thêm các chỉ số kỹ thuật khác như MACD, KD v.v. để lọc tín hiệu và cải thiện chất lượng, hoặc sử dụng máy học để ghi điểm và lọc tín hiệu sai.

  3. Bao gồm phân tích âm lượng. Đừng nhận tín hiệu nếu âm lượng là không đủ trên MA giao.

  4. Kiểm tra biến động giá trước khi giao thoa xảy ra.

  5. Xây dựng các cơ chế dừng lỗ năng động như dừng lỗ sau, Chandelier Exit vv, để giảm khoảng cách dừng lỗ nhưng giữ cho nó hiệu quả.

  6. Tối ưu hóa kích thước vị trí như cố định / năng động / đòn bẩy, để đạt được tỷ lệ lợi nhuận / lỗ hợp lý hơn.

  7. Xem xét toàn diện chi phí giao dịch, trượt. Tối ưu hóa tỷ lệ lợi nhuận / dừng lỗ để đảm bảo lợi nhuận trong giao dịch trực tiếp.

Kết luận

Cấu trúc tổng thể của chiến lược này là âm thanh, với logic đơn giản của đường chéo EMA kép để xác định hướng xu hướng, kết hợp với logic lấy lợi nhuận và dừng lỗ để nắm bắt xu hướng. Là một chiến lược yếu tố duy nhất, nó có thể được tối ưu hóa thêm về các thông số, bộ lọc tín hiệu vv để làm cho nó mạnh mẽ hơn. Với stop loss và kích thước vị trí thích hợp, rủi ro có thể được giảm thêm. Nhìn chung, nó cung cấp một xu hướng vững chắc sau khuôn khổ chiến lược, có thể đạt được lợi nhuận nhất quán sau khi tối ưu hóa và điều chỉnh.


/*backtest
start: 2023-10-16 00:00:00
end: 2023-11-15 00:00:00
period: 1h
basePeriod: 15m
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/
// © TradingMentalist

//@version=4
strategy("Initial template",initial_capital=1000, overlay=true, pyramiding=0, commission_type=strategy.commission.percent, commission_value=0.04, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, currency = currency.USD)

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////inputs
//turn on/off longs/shorts / extraneous conditions
longinc=input(true, title="include longs?")
lConSw2=input(true, title="condition two?")
lConSw3=input(true, title="condition three?")
shotinc=input(true, title="include shorts?")
sConSw2=input(true, title="condition two?")
sConSw3=input(true, title="condition three?")

//turn on/off / adjust trade filters (average range/average equity)
sidein2     = input(200, step=10, title='lookback for average range (bars)')
sidein      = input(1, title='filter trades if range is less than (%)')/100
equityIn    = input(40, title='filter trades if equity is below ema()')
sidewayssw  = input(true, title='sideways filter?')
equitysw    = input(true, title='equity filter?')
longtpin    = input(1,step=0.1, title='long TP %')/100
longslin    = input(0.4,step=0.1, title='long SL %')/100
shorttpin   = input(1,step=0.1, title='short TP %')/100
shortslin   = input(0.4,step=0.1, title='short SL %')/100

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////filters
//(leave as is)
side1       = (close[1] + close[sidein2]) / 2
side2       = close[1] - close[sidein2] 
side3       = side2 / side1
notsideways = side3 > sidein
equityMa    = equitysw ? ema(strategy.equity, equityIn) : 0
equityCon   = strategy.equity >= equityMa

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////indicators
ma1 = ema(close, 9)
ma2 = ema(close, 21)
ma3 = ema(close, 50)

plot(ma1, color=color.new(#E8B6B0,50))
plot(ma2, color=color.new(#B0E8BE,50))
plot(ma3, color=color.new(#00EEFF,50))

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////conditions
//adjust conditions
//-------------------------------------------
longCondition1  = crossover(ma2,ma3)
longCondition2  = close[5] > close[10]
longCondition3  = close[1] > close[2]

shortCondition1 = crossover(ma3,ma2)
shortCondition2 = close[5] < close[10]
shortCondition3 = close[1] < close[2]

closelong       = shortCondition1
closeshort      = longCondition1
//-------------------------------------------

//(leave as is)
longCondition1in  = longCondition1
longCondition2in  = lConSw2 ? longCondition2 : true
longCondition3in  = lConSw3 ? longCondition3 : true
shortCondition1in = shortCondition1
shortCondition2in = sConSw2 ? shortCondition2: true
shortCondition3in = sConSw3 ? shortCondition3: true
longConditions    = longCondition1in and longCondition2in and longCondition3in
shortConditions   = shortCondition1in and shortCondition2in and shortCondition3in

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////execution
//(leave as is)
long            = sidewayssw ? notsideways and equityCon and longConditions : equityCon and longConditions
short           = sidewayssw ? notsideways and equityCon and shortConditions : equityCon and shortConditions

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////risk
//(leave as is)
longtplevel     = strategy.position_avg_price * (1 + longtpin)
longsllevel     = strategy.position_avg_price * (1 - longslin)
shorttplevel    = strategy.position_avg_price * (1 - shorttpin)
shortsllevel    = strategy.position_avg_price * (1 + shortslin)

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////timeframe
//adjust timeframe
//-------------------------------------------
startyear   = 2000
startmonth  = 1
startday    = 1

stopyear    = 9999
stopmonth   = 12
stopday     = 31
//-------------------------------------------

//(leave as is)
startperiod = timestamp(startyear,startmonth,startday,0,0)
periodstop  = timestamp(stopyear,stopmonth,stopday,0,0)
timeframe()    =>
    time >= startperiod and time <= periodstop ? true : false

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////orders
//comments are empty characters for clear chart
if timeframe()
    if longinc
        if strategy.position_size == 0 or strategy.position_size > 0 
            strategy.entry(id="long", long=true, when=long, comment=" ")
            strategy.exit("stop","long", limit=longtplevel, stop=longsllevel,comment=" ")
            strategy.close(id="long", when=closelong, comment = " ")
    if shotinc
        if strategy.position_size == 0 or strategy.position_size < 0 
            strategy.entry(id="short", long=false, when=short, comment = " ")
            strategy.exit("stop","short", limit=shorttplevel, stop=shortsllevel,comment = " ")
            strategy.close(id="short", when=closeshort, comment = " ")

Thêm nữa