
Đây là một chiến lược dựa trên chỉ số siêu xu hướng và chỉ số ATR. Ý tưởng chính của chiến lược này là: Sử dụng chỉ số siêu xu hướng để xác định xu hướng của thị trường hiện tại và giao dịch khi chỉ số siêu xu hướng thay đổi. Đồng thời, chiến lược này sử dụng chỉ số ATR để tính toán giá dừng và giá dừng và tính toán kích thước vị trí dựa trên tỷ lệ 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ững ưu điểm của chiến lược này là:
Rủi ro của chiến lược này là:
Các biện pháp sau đây có thể được áp dụng để đối phó với những rủi ro trên:
Chiến lược này có thể được tối ưu hóa trong các khía cạnh sau:
Các tối ưu hóa trên có thể nâng cao lợi nhuận và tính ổn định của chiến lược, đồng thời giảm rủi ro của chiến lược, giúp chiến lược thích nghi hơn với các môi trường thị trường khác nhau.
Chiến lược này kết hợp các chỉ số siêu xu hướng và chỉ số ATR để có thể nắm bắt xu hướng một cách hiệu quả, đồng thời 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 cho mỗi giao dịch có thể được kiểm soát. Tuy nhiên, chiến lược này có thể tạo ra chi phí giao dịch và rút lui cao hơn trong thị trường bất ổn.
/*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)