Đây là một chiến lược dựa trên chỉ số Supertrend và chỉ số ATR. Ý tưởng chính của chiến lược này là sử dụng chỉ số Supertrend để xác định hướng xu hướng thị trường hiện tại và thực hiện giao dịch khi chỉ số Supertrend thay đổi. Đồng thời, chiến lược này sử dụng chỉ số ATR để tính giá dừng lỗ và lấy lợi nhuận, và tính kích thước vị trí dựa trên một tỷ lệ phần trăm nhất định của số dư tài khoản để kiểm soát rủi ro.
Các nguyên tắc của chiến lược này là như sau:
Những lợi thế của chiến lược này là như sau:
Những rủi ro của chiến lược này là như sau:
Để giải quyết các rủi ro trên, các biện pháp sau đây có thể được thực hiện:
Chiến lược này có thể được tối ưu hóa trong các lĩnh vực sau:
Các tối ưu hóa trên có thể cải thiện lợi nhuận và sự ổn định của chiến lược trong khi giảm rủi ro của nó, làm cho nó thích nghi hơn với môi trường thị trường khác nhau.
Chiến lược này kết hợp chỉ số Supertrend và chỉ số ATR để nắm bắt hiệu quả xu hướng trong khi kiểm soát rủi ro. Bằng cách tính toán kích thước vị trí tối ưu, rủi ro của mỗi giao dịch có thể kiểm soát được. Tuy nhiên, chiến lược này có thể tạo ra chi phí giao dịch cao và rút tiền trong một thị trường biến động. Bằng cách giới thiệu nhiều chỉ số kỹ thuật hơn, tối ưu hóa các tham số, thêm các yếu tố kiểm soát rủi ro và cải thiện các chiến lược lấy lợi nhuận, hiệu suất của chiến lược này có thể được cải thiện hơn nữa. Nhìn chung, chiến lược này là một chiến lược theo xu hướng đơn giản và hiệu quả phù hợp để sử dụng trong các thị trường xu hướng.
/*backtest start: 2024-02-01 00:00:00 end: 2024-02-29 23:59:59 period: 1h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © tradez99 //@version=5 strategy('Supertrend', overlay=true, format=format.price, precision=2) Periods = input(title='ATR Period', defval=10) src = input(hl2, title='Source') Multiplier = input.float(title='ATR Multiplier', step=0.1, defval=3.0) changeATR = input(title='Change ATR Calculation Method ?', defval=true) showsignals = input(title='Show Buy/Sell Signals ?', defval=true) highlighting = input(title='Highlighter On/Off ?', defval=true) atr2 = ta.sma(ta.tr, Periods) atr = changeATR ? ta.atr(Periods) : atr2 up = src - Multiplier * atr up1 = nz(up[1], up) up := close[1] > up1 ? math.max(up, up1) : up dn = src + Multiplier * atr dn1 = nz(dn[1], dn) dn := close[1] < dn1 ? math.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.new(color.green, 0)) 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.new(color.green, 0)) plotshape(buySignal and showsignals ? up : na, title='Buy', text='Buy', location=location.absolute, style=shape.labelup, size=size.tiny, color=color.new(color.green, 0), textcolor=color.new(color.white, 0)) dnPlot = plot(trend == 1 ? na : dn, title='Down Trend', style=plot.style_linebr, linewidth=2, color=color.new(color.red, 0)) 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.new(color.red, 0)) plotshape(sellSignal and showsignals ? dn : na, title='Sell', text='Sell', location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.new(color.red, 0), textcolor=color.new(color.white, 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) multiplier = input.float(title="ATR multiplier", defval = 1.5) rr = input.float(title="Risk:Reward", defval=1.0) riskPerTrade = input.float(title="Risk Per Trade %", defval=1.0) atr3 = ta.atr(14) //calculate stops and targets longstop = close - (atr3 * multiplier) shortstop = close + (atr3 * multiplier) longStopDistance = close - longstop shortStopDistance = shortstop - close longTarget = close + (longStopDistance * rr) shortTarget = close - (shortStopDistance * rr) // Save stops & targets var t_stop = 0.0 var t_target = 0.0 longCondition = buySignal if (longCondition) t_stop := longstop t_target := longTarget positionSize = math.floor((strategy.equity * (riskPerTrade/100)) / (close - t_stop)) strategy.entry("Long", strategy.long, qty = positionSize) shortCondition = sellSignal if (shortCondition) t_stop := shortstop t_target := shortTarget positionSize = math.floor((strategy.equity * (riskPerTrade/100)) / (t_stop - close)) strategy.entry("Short", strategy.short, qty = positionSize) strategy.exit(id="Long Exit", from_entry="Long", limit=t_target, stop=t_stop) strategy.exit(id="Short Exit", from_entry="Short", limit=t_target, stop=t_stop)