Chiến lược theo dõi trung bình động động

Tác giả:ChaoZhang, Ngày: 2023-11-24 16:59:25
Tags:

img

Tổng quan

Ý tưởng cốt lõi của chiến lược này là sử dụng trung bình động động để theo dõi xu hướng, đặt dừng lỗ và lấy lợi nhuận, và kết hợp các kỹ thuật nến Heikin Ashi để đánh giá tín hiệu dài / ngắn.

Nguyên tắc

Chiến lược đầu tiên tính toán chỉ số ATR, sau đó kết hợp nguồn giá đầu vào và các tham số để tính toán đường trung bình động. Các tín hiệu dài / ngắn được tạo ra khi giá vượt trên / dưới đường trung bình động. Trong khi đó, các vị trí dừng lỗ và lấy lợi nhuận được thiết lập để theo dõi thay đổi giá trong thời gian thực.

Đặc biệt, chỉ số ATR và tham số nLoss được tính toán đầu tiên. Sau đó, giá của giai đoạn hiện tại và vị trí dừng lỗ của giai đoạn trước được so sánh để cập nhật đường dừng lỗ. Khi giá vượt qua đường dừng lỗ của giai đoạn trước, các tín hiệu dài / ngắn pos và màu tương ứng được tạo ra. Khi các tín hiệu giao dịch được kích hoạt, các dấu mũi tên được vẽ. Cuối cùng các vị trí được đóng dựa trên logic dừng lỗ / lấy lợi nhuận.

Phân tích lợi thế

Lợi thế lớn nhất của chiến lược này là sử dụng trung bình động để theo dõi sự thay đổi giá trong thời gian thực. Điều này nắm bắt xu hướng tốt hơn so với trung bình động cố định truyền thống và làm giảm cơ hội dừng lỗ. Ngoài ra, kết hợp dừng lỗ dựa trên ATR cho phép điều chỉnh linh hoạt vị trí dừng lỗ dựa trên biến động thị trường để kiểm soát rủi ro hiệu quả.

Rủi ro và giải pháp

Rủi ro chính của chiến lược này là giá có thể tăng/giảm đáng kể, gây ra tín hiệu sai khi stop loss được nhấn.

Các giải pháp bao gồm tối ưu hóa thời gian trung bình động, điều chỉnh ATR và hệ số stop loss để giảm xác suất tín hiệu sai. Các bộ lọc bổ sung có thể được thêm để tránh giao dịch quá dày đặc.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Kiểm tra các loại và thời gian khác nhau của các đường trung bình động để tìm kết hợp thông số tối ưu

  2. Tối ưu hóa tham số thời gian ATR để cân bằng độ nhạy của stop loss

  3. Thêm bộ lọc và chỉ số bổ sung để cải thiện chất lượng tín hiệu

  4. Điều chỉnh giá trị dừng lỗ / lấy lợi nhuận để tối ưu hóa tỷ lệ phần thưởng rủi ro

Kết luận

Ý tưởng cốt lõi của chiến lược này là sử dụng đường trung bình động để theo dõi sự thay đổi giá trong thời gian thực, sử dụng chỉ số ATR để thiết lập các vị trí dừng lỗ một cách năng động, kiểm soát rủi ro nghiêm ngặt trong khi theo dõi xu hướng. Thông qua tối ưu hóa tham số và tinh chỉnh quy tắc, chiến lược này có thể được điều chỉnh thành một hệ thống định lượng rất thực tế.


/*backtest
start: 2022-11-23 00:00:00
end: 2023-11-05 05:20:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"BTC_USDT","stocks":0}]
*/

//@version=5
strategy(title='UT Bot v5', overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
//CREDITS to HPotter for the orginal code. The guy trying to sell this as his own is a scammer lol. 
//Edited and converted to @version=5 by SeaSide420 for Paperina
// Inputs
AllowBuy = input(defval=true, title='Allow Buy?')
AllowSell = input(defval=false, title='Allow Sell?')
h = input(false, title='Signals from Heikin Ashi Candles')
//revclose = input(defval=true, title='Close when reverse signal?')
Price = input(defval=open, title='Price Source (recommended OPEN to avoid repainting)')
smoothing = input.string(title="Moving Average Type", defval="HMA", options=["SMA", "EMA", "WMA", "HMA"])
MA_Period = input(2, title='This changes the MAPeriod')
a = input.float(1, title='This changes the sensitivity',step=0.1)
c = input(11, title='ATR Period')
TakeProfit = input.int(defval=50000, title='Take Profit ($)', minval=1)
StopLoss = input.int(defval=50000, title='Stop Loss ($)', minval=1)
xATR = ta.atr(c)
nLoss = a * xATR
src = h ? request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, Price, lookahead=barmerge.lookahead_off) : Price
xATRTrailingStop = 0.0
iff_1 = src > nz(xATRTrailingStop[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xATRTrailingStop[1], 0) and src[1] < nz(xATRTrailingStop[1], 0) ? math.min(nz(xATRTrailingStop[1]), src + nLoss) : iff_1
xATRTrailingStop := src > nz(xATRTrailingStop[1], 0) and src[1] > nz(xATRTrailingStop[1], 0) ? math.max(nz(xATRTrailingStop[1]), src - nLoss) : iff_2
pos = 0
iff_3 = src[1] > nz(xATRTrailingStop[1], 0) and src < nz(xATRTrailingStop[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xATRTrailingStop[1], 0) and src > nz(xATRTrailingStop[1], 0) ? 1 : iff_3
xcolor = pos == -1 ? color.red : pos == 1 ? color.green : color.blue
ma_function(src, MA_Period) =>
    switch smoothing
        "SMA" => ta.sma(src, MA_Period)
        "EMA" => ta.ema(src, MA_Period)
        "WMA" => ta.wma(src, MA_Period)
        => ta.hma(src, MA_Period)
thema = ma_function(src, MA_Period)
above = ta.crossover(thema, xATRTrailingStop)
below = ta.crossover(xATRTrailingStop, thema)
buy = src > xATRTrailingStop and above
sell = src < xATRTrailingStop and below
barbuy = src > xATRTrailingStop
barsell = src < xATRTrailingStop
plot(thema,title="The M.A.",color=color.green,linewidth=2)
plot(xATRTrailingStop,title="The M.A.",color=color.red,linewidth=2)
plotshape(buy,  title = "Buy",  text = "Buy",  style = shape.labelup,   location = location.belowbar, color= color.green, textcolor = color.white, size = size.tiny)
plotshape(sell, title = "Sell", text = "Sell", style = shape.labeldown, location = location.abovebar, color= color.red,   textcolor = color.white, size = size.tiny)
barcolor(barbuy ? color.green : na)
barcolor(barsell ? color.red : na)
strategy.close_all(when=strategy.openprofit>TakeProfit,alert_message="Close- TakeProfit", comment = "TP")
strategy.close_all(when=strategy.openprofit<StopLoss-(StopLoss*2),alert_message="Close- StopLoss", comment = "SL")
strategy.close("buy", when =  sell and AllowSell==false , comment = "close buy")
strategy.close("sell", when =  buy and AllowBuy==false, comment = "close sell")
strategy.entry("buy", strategy.long, when = buy and AllowBuy)
strategy.entry("sell", strategy.short, when = sell and AllowSell)

Thêm nữa