
Đây là một chiến lược theo dõi xu hướng đa luồng dựa trên phạm vi biến động thực trung bình (ATR) và đường trung bình di chuyển của chỉ số (EMA). Chiến lược này có thể nắm bắt chính xác và quản lý rủi ro về xu hướng thị trường thông qua các lệnh dừng động và xu hướng.
Các nguyên tắc cốt lõi của chiến lược bao gồm các bước quan trọng sau:
Lý luận tính toán chính:
Đề xuất kiểm soát rủi ro:
Mục tiêu tối ưu hóa: Tăng sự ổn định chiến lược, giảm rút lui và tăng hiệu quả lợi nhuận
Đây là một chiến lược theo dõi xu hướng động dựa trên ATR và EMA, để đạt được sự tham gia thị trường tương đối ổn định thông qua các cơ chế dừng lỗ linh hoạt và phán đoán xu hướng. Chiến lược có tính thích ứng tốt và quản lý rủi ro, nhưng vẫn cần được tối ưu hóa và xác minh liên tục.
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-02 00:00:00
period: 3h
basePeriod: 3h
exchanges: [{"eid":"Futures_Binance","currency":"BNB_USDT"}]
*/
//@version=6
strategy("ducanhmaster v1", overlay=true, commission_type=strategy.commission.percent, commission_value=0.1, slippage=3, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Inputs
a = input.int(1, title="Key Value. 'This changes the sensitivity'")
c = input.int(10, title="ATR Period")
h = input.bool(false, title="Signals from Heikin Ashi Candles")
xATR = ta.atr(c)
nLoss = a * xATR
// Compute Heikin Ashi values
heikinAshiOpen = (open + close) / 2
heikinAshiClose = (open + high + low + close) / 4
heikinAshiHigh = math.max(high, math.max(heikinAshiOpen, heikinAshiClose))
heikinAshiLow = math.min(low, math.min(heikinAshiOpen, heikinAshiClose))
src = h ? heikinAshiClose : close
// Declare xATRTrailingStop as a float variable and initialize it with 'na'
var float xATRTrailingStop = na
if (src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0))
xATRTrailingStop := math.max(nz(xATRTrailingStop[1]), src - nLoss)
else if (src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0))
xATRTrailingStop := math.min(nz(xATRTrailingStop[1]), src + nLoss)
else
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
// Declare 'pos' as an integer variable instead of leaving it undefined
var int pos = na
if (src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0))
pos := 1
else if (src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0))
pos := -1
else
pos := nz(pos[1], 0)
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ema = ta.ema(src, 1)
above = ta.crossover(ema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, ema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
// Plot buy/sell signals on the chart
plotshape(buy, title="Buy", text='Buy', style=shape.labelup, location=location.belowbar, color=color.new(color.green, 0), textcolor=color.white, size=size.tiny)
plotshape(sell, title="Sell", text='Sell', style=shape.labeldown, location=location.abovebar, color=color.new(color.red, 0), textcolor=color.white, size=size.tiny)
// Change bar color when buy/sell conditions are met
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
// Enter a Long trade when a buy signal appears and exit when a sell signal appears
if (buy)
strategy.entry("long", strategy.long)
if (sell)
strategy.close("long")