Đây là một chiến lược theo xu hướng dựa trên chỉ số kênh Donchian, kết hợp với dừng lỗ năng động dựa trên chỉ số ATR để khóa lợi nhuận.
Chiến lược này sử dụng kênh Donchian 20 giai đoạn, trong đó đường giữa kênh là mức trung bình của mức cao nhất và thấp nhất. Nó đi dài khi giá vượt qua trên đường trung tâm kênh và đi ngắn khi giá vượt qua dưới đường trung. Quy tắc thoát là khi giá chạm vào đường dừng lỗ động, được tính là mức thấp nhất trong 3 thanh gần đây trừ một phần ba giá trị ATR cho các vị trí dài, và cao nhất trong 3 thanh gần đây cộng với một phần ba giá trị ATR cho các vị trí ngắn.
Những lợi thế chính của chiến lược này là:
Những rủi ro chính của chiến lược này bao gồm:
Một số hướng tối ưu hóa cho chiến lược này:
Tóm lại, đây là một chiến lược theo xu hướng đơn giản và thực tế. Nó xác định hướng xu hướng thông qua kênh Donchian và khóa lợi nhuận với lệnh dừng lỗ theo sau động, có thể theo dõi xu hướng hiệu quả. Chiến lược khá thực tế để sử dụng, nhưng có thể được tối ưu hóa thêm theo nhiều cách khác nhau để có hiệu suất tốt hơn trong môi trường thị trường phức tạp hơn.
/*backtest start: 2023-11-29 00:00:00 end: 2023-12-06 00:00:00 period: 30m basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=4 strategy(title = "dc", overlay = true) atrLength = input(title="ATR Length:", defval=20, minval=1) testStartYear = input(2017, "Backtest Start Year") testStartMonth = input(1, "Backtest Start Month") testStartDay = input(1, "Backtest Start Day") testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0) testEndYear = input(2018, "Backtest Start Year") testEndMonth = input(12) testEndDay = input(31, "Backtest Start Day") testPeriodEnd = timestamp(testEndYear,testEndMonth,testEndDay,0,0) testPeriod() => true //time >= testPeriodStart ? true : false dcPeriod = input(20, "Period") dcUpper = highest(close, dcPeriod)[1] dcLower = lowest(close, dcPeriod)[1] dcAverage = (dcUpper + dcLower) / 2 atrValue=atr(atrLength) useTakeProfit = na useStopLoss = na useTrailStop = na useTrailOffset = na //@version=1 Buy_stop = lowest(low[1],3) - atr(20)[1] / 3 plot(Buy_stop, color=red, title="buy_stoploss") Sell_stop = highest(high[1],3) + atr(20)[1] / 3 plot(Sell_stop, color=green, title="sell_stoploss") plot(dcLower, style=line, linewidth=3, color=red, offset=1) plot(dcUpper, style=line, linewidth=3, color=aqua, offset=1) plot(dcAverage, color=black, style=line, linewidth=3, title="Mid-Line Average") strategy.entry("simpleBuy", strategy.long, when=(close > dcAverage) and cross(close,dcAverage)) strategy.close("simpleBuy",when= ( close< Buy_stop)) strategy.entry("simpleSell", strategy.short,when=(close < dcAverage) and cross(close,dcAverage) ) strategy.close("simpleSell",when=( close > Sell_stop)) //strategy.exit("Exit simpleBuy", from_entry = "simpleBuy", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset) //strategy.exit("Exit simpleSell", from_entry = "simpleSell", profit = useTakeProfit, loss = useStopLoss, trail_points = useTrailStop, trail_offset = useTrailOffset)