Chiến lược này tạo ra tín hiệu dài và ngắn thông qua các đường trung bình động kép và thực hiện theo dõi stop loss. Ý tưởng cốt lõi là xác định hướng xu hướng với đường trung bình động, đi dài hoặc ngắn dọc theo xu hướng và sử dụng ATR để tính toán stop loss để theo dõi stop loss.
Chiến lược này sử dụng hl2 như là giá nguồn và tính ATR của một khoảng thời gian nhất định như là phạm vi dừng lỗ. Các dải trên và dưới được tính dựa trên ATR nhân một yếu tố nhất định. Khi giá vượt qua dải trên, một tín hiệu mua được tạo ra để mua dài. Khi giá vượt qua dải dưới, một tín hiệu bán được tạo ra để bán ngắn.
Sau khi mở các vị trí, stop loss được điều chỉnh trong thời gian thực dựa trên những thay đổi trong ATR để đạt được stop loss theo dõi. Cụ thể, sau khi đi dài, dải dưới được nâng dần dựa trên mức thấp nhất để theo dõi stop loss. Sau khi đi ngắn, dải trên được hạ dần dựa trên mức cao nhất để theo dõi stop loss.
Bằng cách này, chiến lược này tận dụng đầy đủ khả năng của các đường trung bình động để xác định hướng xu hướng và cũng kết hợp cơ chế theo dõi dừng lỗ dựa trên ATR để đảm bảo hướng giao dịch và kiểm soát rủi ro.
Lợi thế lớn nhất của chiến lược này nằm ở việc kiểm soát rủi ro. Các chiến lược trung bình động truyền thống chỉ xem xét các phán quyết theo hướng và có thể dễ dàng làm nổ tung tài khoản. Bằng cách kết hợp ATR để theo dõi dừng lỗ, chiến lược này có thể điều chỉnh dừng lỗ một cách năng động dựa trên sự biến động của thị trường để kiểm soát hiệu quả rủi ro giao dịch.
Ngoài ra, chiến lược này kết hợp giao dịch hai hướng. So với các chiến lược một hướng, nó có thể nhanh chóng điều chỉnh hướng vị trí khi xu hướng đảo ngược, tránh bị mắc kẹt trong một hướng và cải thiện lợi nhuận chiến lược.
Các rủi ro chính của chiến lược này đến từ các thiết lập tham số của thời gian ATR và nhân. Nếu thời gian ATR quá ngắn hoặc nhân quá lớn, phạm vi dừng lỗ sẽ quá nhỏ để kiểm soát rủi ro hiệu quả. Nếu thời gian ATR quá dài hoặc nhân quá nhỏ, mức dừng lỗ sẽ quá lỏng để kiếm lợi nhuận. Ngoài ra, có những rủi ro của việc phá vỡ sai khi giá xuyên qua đường trung bình động.
Các rủi ro có thể được quản lý bằng cách tối ưu hóa thời gian ATR và nhân để cân bằng giữa mục tiêu dừng lỗ và lợi nhuận, và kết hợp các chỉ số khác để lọc các sự đột phá sai và cải thiện chất lượng tín hiệu.
Chiến lược này có thể được tăng cường từ các khía cạnh sau:
Tối ưu hóa thời gian trung bình động để tìm ra sự kết hợp thông số tốt nhất.
Thêm các chỉ số khác như MACD, KDJ vv để lọc tín hiệu và cải thiện chất lượng.
Tích hợp kích thước vị trí như phân số cố định, Martingale vv để cải thiện lợi nhuận.
Nghiên cứu các thông số khác nhau giữa các sản phẩm khác nhau để tối ưu hóa.
Áp dụng máy học như thuật toán di truyền để đào tạo và tối ưu hóa tham số.
Chiến lược này xem xét đầy đủ việc đánh giá xu hướng và kiểm soát rủi ro, theo đuổi lợi nhuận trong khi giảm rút tiền. Cải thiện hơn nữa thông qua tối ưu hóa tham số và phương pháp danh mục đầu tư có thể giúp cải thiện lợi nhuận chiến lược. Tóm lại, đây là một chiến lược giao dịch định lượng mạnh mẽ và ổn định với logic rõ ràng và dễ thực hiện.
/*backtest start: 2022-11-09 00:00:00 end: 2023-11-15 00:00:00 period: 1d basePeriod: 1h 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/ // © KivancOzbilgic //@version=4 strategy("Trenbolone Strategy", overlay = true) Periods = input(title="ATR Period", type=input.integer, defval=10) src = input(hl2, title="Source") Multiplier = input(title="ATR Multiplier", type=input.float, step=0.1, defval=3.0) changeATR= input(title="Change ATR Calculation Method ?", type=input.bool, defval=true) showsignals = input(title="Show Buy/Sell Signals ?", type=input.bool, defval=false) highlighting = input(title="Highlighter On/Off ?", type=input.bool, defval=true) barcoloring = input(title="Bar Coloring On/Off ?", type=input.bool, defval=true) atr2 = sma(tr, Periods) atr= changeATR ? atr(Periods) : atr2 up=src-(Multiplier*atr) up1 = nz(up[1],up) up := close[1] > up1 ? max(up,up1) : up dn=src+(Multiplier*atr) dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? min(dn, dn1) : dn trend = 1 trend := nz(trend[1], trend) trend := trend == -1 and close > dn1 ? 1 : trend == 1 and close < up1 ? -1 : trend upPlot = plot(trend == 1 ? up : na, title="Up Trend", style=plot.style_linebr, linewidth=2, color=color.green) buySignal = trend == 1 and trend[1] == -1 plotshape(buySignal ? up : na, title="UpTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.green, transp=0) plotshape(buySignal and showsignals ? up : na, title="Buy", text="Buy", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white, transp=0) dnPlot = plot(trend == 1 ? na : dn, title="Down Trend", style=plot.style_linebr, linewidth=2, color=color.red) sellSignal = trend == -1 and trend[1] == 1 plotshape(sellSignal ? dn : na, title="DownTrend Begins", location=location.absolute, style=shape.circle, size=size.tiny, color=color.red, transp=0) plotshape(sellSignal and showsignals ? dn : na, title="Sell", text="Sell", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white, transp=0) mPlot = plot(ohlc4, title="", style=plot.style_circles, linewidth=0) longFillColor = highlighting ? (trend == 1 ? color.green : color.white) : color.white shortFillColor = highlighting ? (trend == -1 ? color.red : color.white) : color.white fill(mPlot, upPlot, title="UpTrend Highligter", color=longFillColor) fill(mPlot, dnPlot, title="DownTrend Highligter", color=shortFillColor) FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12) FromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) FromYear = input(defval = 2018, title = "From Year", minval = 999) 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 = 999) start = timestamp(FromYear, FromMonth, FromDay, 00, 00) finish = timestamp(ToYear, ToMonth, ToDay, 23, 59) window() => time >= start and time <= finish ? true : false longCondition = buySignal if (longCondition) strategy.entry("BUY", strategy.long, when = window()) shortCondition = sellSignal if (shortCondition) strategy.entry("SELL", strategy.short, when = window()) buy1 = barssince(buySignal) sell1 = barssince(sellSignal) color1 = buy1[1] < sell1[1] ? color.green : buy1[1] > sell1[1] ? color.red : na barcolor(barcoloring ? color1 : na)