
Chiến lược giao chéo đường trung bình di chuyển kép bằng cách tính toán đường trung bình di chuyển của các chu kỳ khác nhau, để xác định hướng xu hướng giá, để thực hiện theo dõi xu hướng. Khi đường trung bình thời gian ngắn đi qua đường trung bình thời gian dài, khi đường trung bình thời gian ngắn đi ngang qua đường trung bình thời gian dài, là một chiến lược theo dõi xu hướng điển hình.
Chiến lược này dựa trên đường trung bình di chuyển của chỉ số 9 chu kỳ, 21 chu kỳ và 50 chu kỳ (EMA). Trong đó, 9 chu kỳ EMA đại diện cho xu hướng ngắn hạn, 21 chu kỳ EMA đại diện cho xu hướng trung hạn và 50 chu kỳ EMA đại diện cho xu hướng dài hạn.
Khi 9 chu kỳ EMA trên xuyên qua 21 chu kỳ EMA, cho thấy xu hướng ngắn hạn chuyển sang tăng, làm nhiều; khi 9 chu kỳ EMA dưới xuyên qua 21 chu kỳ EMA, cho thấy xu hướng ngắn hạn chuyển sang giảm, làm rỗng. Ở đây sử dụng hàm chéo crossover () để xác định sự giao nhau của đường trung bình.
Mã được thiết lập để mở, dừng và dừng lỗ cho các vị trí dài và trống. Các điều kiện mở vị trí là trên hoặc dưới đường bằng nhau.
Ngoài ra, mã đã thêm một số điều kiện lọc, chẳng hạn như lọc xu hướng, yêu cầu đường K không thể dao động trước khi đường trung bình đi xuống, và lọc tỷ lệ sử dụng vốn, yêu cầu quyền lợi chiến lược không thể thấp hơn đường trung bình N ngày, để tránh thua lỗ quá nhiều khi vẫn còn giao dịch. Các điều kiện lọc này có thể ngăn chặn tín hiệu giả đến một mức độ nào đó.
Nhìn chung, chiến lược này sử dụng chéo hai EMA để đánh giá xu hướng của xu hướng giá, và logic dừng lỗ hợp lý, có thể bắt được xu hướng đường dài trung bình. Tuy nhiên, với tư cách là một chiến lược yếu tố đơn, tín hiệu của nó có thể không đủ ổn định và có thể được tối ưu hóa hơn nữa.
Phản ứng:
Chiến lược này có thể được tối ưu hóa bằng cách:
Tối ưu hóa các tham số chu kỳ của đường trung bình di chuyển, tìm ra sự kết hợp chu kỳ tốt nhất. Có thể giới thiệu các kỹ thuật tối ưu hóa thích ứng, chu kỳ ưu tiên động.
Thêm các chỉ số kỹ thuật khác để lọc tín hiệu, chẳng hạn như MACD, KD, để cải thiện chất lượng tín hiệu. hoặc giới thiệu học máy để đánh giá tín hiệu và tự động lọc tín hiệu giả.
Kết hợp với phân tích khối lượng giao dịch. Không nhận tín hiệu khi giao dịch vượt qua đường trung bình nhưng khối lượng giao dịch không đủ.
Khi đột phá xảy ra, hãy xem xét các biến động trước đó, chẳng hạn như đột phá trong vùng chấn động, có thể là đột phá giả.
Thiết lập các cơ chế dừng động, chẳng hạn như dừng theo dõi, Chandelier Exit, để giảm khoảng cách dừng nhưng đảm bảo hiệu quả.
Tối ưu hóa quản lý vị trí, chẳng hạn như vị trí cố định, vị trí động, vị trí đòn bẩy, v.v., để tỷ lệ lỗ hổng hợp lý hơn.
Đánh giá toàn diện chi phí giao dịch, tác động của điểm trượt. Tối ưu hóa tỷ lệ dừng lỗ, đảm bảo chiến lược vẫn có lợi nhuận trong thực tế.
Chiến lược này có cấu trúc tổng thể hợp lý, nguyên tắc đơn giản, đánh giá xu hướng xu hướng thông qua hai EMA chéo, và thiết lập logic dừng dừng lỗ, có thể nắm bắt xu hướng. Nhưng là một chiến lược yếu tố duy nhất, có thể tối ưu hóa thêm các tham số thiết lập, lọc tín hiệu, để làm cho chiến lược ổn định hơn.
/*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 = " ")