
Chiến lược này kết hợp các khái niệm về giao dịch Crow với phân tích pha của Niko Bakkers, sử dụng trung bình di chuyển của ba chu kỳ khác nhau để xác định hướng xu hướng, theo dõi xu hướng và kiếm lợi nhuận. Làm nhiều hơn khi trung bình di chuyển nhanh trên trung bình di chuyển nhanh và ba trung bình di chuyển đều ở cùng một xu hướng tăng hoặc giảm; bỏ trống khi trung bình di chuyển nhanh đi xuống trung bình di chuyển nhanh và ba trung bình di chuyển đều ở cùng một xu hướng tăng hoặc giảm.
Tính trung bình di chuyển của ba chu kỳ khác nhau: Chu kỳ trung bình di chuyển nhanh là 8 ngày, chu kỳ trung bình di chuyển nhanh là 21 ngày và chu kỳ trung bình di chuyển chậm là 55 ngày.
Xác định điều kiện nhập học: Làm nhiều hơn khi đường trung bình di chuyển trên đường trung bình di chuyển nhanh và cả ba đường trung bình di chuyển đều có xu hướng tăng; làm trống khi đường trung bình di chuyển dưới đường trung bình di chuyển nhanh và cả ba đường trung bình di chuyển đều có xu hướng giảm.
Xác định điều kiện ra sân: Đường trung bình di chuyển nhanh ngược qua đường trung bình di chuyển nhanh.
Kiểm soát vị trí: Sử dụng vị trí cố định, mỗi lần mở 1 người. Bạn cũng có thể chọn điều chỉnh vị trí theo động thái ATR.
Việc sử dụng ba đường trung bình di chuyển sẽ giúp xác định xu hướng và tránh phá vỡ giả.
Theo dõi xu hướng, có tiềm năng lợi nhuận lớn.
Trong khi đó, trung bình di chuyển mang lại lợi nhuận ổn định và thu hồi tương đối nhỏ.
Chiến lược dừng lỗ có thể kiểm soát được, giảm khả năng mất mát lớn.
Có thể gây ra nhiều tổn thất nhỏ và giảm hiệu quả lợi nhuận.
Đường trung bình di động bị tụt hậu, có thể bỏ lỡ điểm đảo ngược xu hướng.
Các vị trí cố định không thể kiểm soát rủi ro một cách hiệu quả và có thể bị phá vỡ khi có biến động lớn.
Các tham số không được tối ưu hóa sẽ làm cho các vị trí mở và đóng cửa quá thường xuyên, làm tăng phí giao dịch và mất điểm trượt.
Tối ưu hóa các tham số chu kỳ của trung bình di chuyển để phù hợp hơn với đặc điểm của các loại giao dịch.
Sử dụng chỉ số biến động ATR để điều chỉnh động vị trí.
Tham gia chiến lược dừng lỗ.
Kết hợp với chỉ số khối lượng giao dịch để đánh giá độ tin cậy của xu hướng.
Chiến lược này tích hợp các chỉ số phân tích kỹ thuật truyền thống và các phương pháp giao dịch của con quạ, sử dụng ba đường trung bình di chuyển để theo dõi xu hướng, có thể đạt được hiệu quả lợi nhuận tốt hơn khi các tham số được tối ưu hóa. Tuy nhiên, chiến lược này cũng có một số rủi ro, cần phải thêm các biện pháp như dừng lỗ và quản lý vị trí để kiểm soát rủi ro, để có được chiến lược giao dịch định lượng có lợi nhuận ổn định lâu dài.
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 3h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// LOVE JOY PEACE PATIENCE KINDNESS GOODNESS FAITHFULNESS GENTLENESS SELF-CONTROL
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © JoshuaMcGowan
//@version=4
// 1. Define strategy settings
strategy(title="Triple Moving Average", overlay=true,
pyramiding=0, initial_capital=1000,
commission_type=strategy.commission.cash_per_order,
commission_value=4, slippage=2)
fastMALen = input(title="Fast MA Length", type=input.integer, defval=8)
medMALen = input(title="Medium MA Length", type=input.integer, defval=21)
slowMALen = input(title="Slow MA Length", type=input.integer, defval=55)
//endMonth = input(title="End Month Backtest", type=input.integer, defval=11)
//endYear = input(title="End Year Backtest", type=input.integer, defval=2019)
// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 12, title = "From Month", minval = 1, maxval = 12)
FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear = input(defval = 2016, title = "From Year", minval = 2017)
ToMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear = input(defval = 9999, title = "To Year", minval = 2017)
// === FUNCTION EXAMPLE ===
start = timestamp(FromYear, FromMonth, FromDay, 00, 00) // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) // backtest finish window
window() => true
usePosSize = input(title="Use Position Sizing?", type=input.bool, defval=true)
riskPerc = input(title="Risk %", type=input.float, defval=0.5, step=0.25)
// 2. Calculate strategy values
fastMA = sma(close, fastMALen)
medMA = sma(close, medMALen)
slowMA = sma(close, slowMALen)
//Position Sizing
riskEquity = (riskPerc / 100) * strategy.equity
atrCurrency = (atr(20) * syminfo.pointvalue)
posSize = usePosSize ? floor(riskEquity / atrCurrency) : 1
//Backtest Window
//tradeWindow = (time <= timestamp(endYear, endMonth, 1, 0, 0))
// 3. Determine long trading conditions
enterLong = crossover(fastMA, medMA) and
(fastMA > slowMA) and (medMA > slowMA) and
window()
exitLong = crossunder(fastMA, medMA)
// 4. Code short trading conditions
enterShort = crossunder(fastMA, medMA) and
(fastMA < slowMA) and (medMA < slowMA) and
window()
exitShort = crossover(fastMA, medMA)
// 5. Output strategy data
plot(series=fastMA, color=color.green, title="Fast MA")
plot(series=medMA, color=color.purple, title="Medium MA")
plot(series=slowMA, color=color.red, title="Slow MA",
linewidth=2)
bgColour =
enterLong and (strategy.position_size < 1) ? color.green :
enterShort and (strategy.position_size > -1) ? color.red :
exitLong and (strategy.position_size > 0) ? color.lime :
exitShort and (strategy.position_size < 0) ? color.orange :
na
bgcolor(color=bgColour, transp=85)
// 6. Submit entry orders
if (enterLong)
strategy.entry(id="EL", long=true, qty=1)
if (enterShort)
strategy.entry(id="ES", long=false, qty=1)
// 7. Submit exit orders
strategy.close_all(when=exitLong and
(strategy.position_size > 0))
strategy.close_all(when=exitShort and
(strategy.position_size < 0))
strategy.close_all(when=not window())
//END