Chiến lược theo dõi xu hướng dựa trên ATR và chỉ số biến động

Tác giả:ChaoZhang, Ngày: 2024-01-04 15:31:34
Tags:

img

Tổng quan

Chiến lược này sử dụng Average True Range (ATR) và chỉ số CHOP như là các chỉ số kỹ thuật chính để xác định và theo dõi xu hướng. Nó đi vào khi chỉ số phá vỡ các đường ray trên và dưới, kết hợp với hướng xu hướng như tín hiệu nhập cảnh; và thoát ra với dừng lỗ hoặc lấy lợi nhuận khi chỉ số tái vào khu vực đai.

Nguyên tắc chiến lược

  1. Sử dụng ATR để tính toán kích thước hộp và xây dựng kênh Renko để xác định hướng xu hướng giá.

  2. Áp dụng chỉ số CHOP để đánh giá xem thị trường có phù hợp để giao dịch hay không. Chỉ số này kết hợp giá cao nhất, giá thấp nhất và ATR. Khi nó nằm trong khoảng 38.2-61.8, nó cho thấy biến động thị trường thấp; nếu không, nó báo hiệu biến động cao và thị trường giao dịch không phù hợp.

  3. Khi chỉ số CHOP phá vỡ đường ray trên 61.8, giá đi vào xu hướng giảm. Nếu EMA nhanh ngắn hạn cũng cho thấy giá đang dẫn đầu, đi ngắn. Ngược lại, khi CHOP phá vỡ đường ray dưới 38.2 và EMA ngắn hạn tăng, đi dài.

  4. Sử dụng chiến lược dừng lỗ / lấy lợi nhuận. Khi giá quay trở lại khu vực đai 38.2-61.8 của CHOP, đóng vị trí với dừng lỗ hoặc lấy lợi nhuận.

Phân tích lợi thế

Chiến lược này kết hợp đánh giá xu hướng và kiểm soát biến động, có thể nắm bắt xu hướng giá và kiểm soát rủi ro.

  1. Kênh Renko được xây dựng bởi ATR có thể theo dõi hiệu quả xu hướng giá.

  2. Chỉ số CHOP đánh giá tỷ lệ biến động thị trường để tránh giao dịch không chính xác trong biến động mạnh mẽ.

  3. Kết hợp EMA nhanh để xác định hướng xu hướng ngắn hạn tránh hoạt động ngược.

  4. Chiến lược dừng lỗ / lấy lợi nhuận kiểm soát lỗ đơn.

Phân tích rủi ro

Những rủi ro chính mà chiến lược này phải đối mặt:

  1. Trong thị trường bên, kênh ATR và tín hiệu CHOP có thể tạo ra tín hiệu không chính xác.

  2. Kết hợp chỉ số kỹ thuật duy nhất không thể tránh hoàn toàn tổn thất.

  3. Đặt vị trí stop loss quá lỏng lẻo có thể dẫn đến lỗ đơn quá lớn.

Hướng tối ưu hóa

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

  1. Tăng các chỉ số phụ trợ khác để xác định tín hiệu, chẳng hạn như mô hình nến, âm lượng vv để cải thiện độ chính xác tín hiệu.

  2. Tối ưu hóa các tham số của ATR và CHOP để nắm bắt được sự biến động giá tốt hơn.

  3. Thiết lập các vị trí dừng lỗ / lấy lợi nhuận năng động để có lợi nhuận lớn hơn và dừng lỗ nhanh hơn.

  4. Cải thiện đúng phạm vi dừng lỗ sau khi xác định xu hướng chính để có được nhiều lợi nhuận hơn trong xu hướng.

Kết luận

Chiến lược này tích hợp các chỉ số kỹ thuật thường được sử dụng và đơn giản và thực tế. Với điều chỉnh và tối ưu hóa tham số, có thể đạt được hiệu ứng theo dõi thỏa đáng. Nhưng nó vẫn đòi hỏi phải đánh giá thủ công các xu hướng chính và không thể tự động hóa hoàn toàn. Nó có thể phục vụ như một công cụ ra quyết định phụ trợ và tham chiếu cho các chiến lược khác.


/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 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/
// © sharatgbhat

//@version=4
strategy("Weis Chop Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10,max_lines_count = 500, max_labels_count = 500)
maxIdLossPcnt = input(1, "Max Intraday Loss(%)", type=input.float)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=input.float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating = input(defval=false, type=input.bool, title="Oscillating")
normalize = input(defval=false, type=input.bool, title="Normalize")
vol = useTrueRange == "Always" or useTrueRange == "Auto" and na(volume) ? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close / methodvalue

currclose = float(na)
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = int(na)
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol / barcount : vol

plot(isOscillating and directionIsDown ? -res : res, style=plot.style_columns, color=directionIsUp ? color.green : color.red, transp=75, linewidth=3, title="Wave Volume")

length = input(14, minval=1)
ci = 100 * log10(sum(atr(1), length) / (highest(length) - lowest(length))) / log10(length)
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(ci, "CHOP", color=#2962FF, offset = offset)
band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color = color.rgb(33, 150, 243, 90), title = "Background")

MomentumBull = close>ema(close,8)
MomentumBear = close<ema(close,8)
Tradecon = crossunder(ci,61.8)

if (MomentumBull and directionIsUp and Tradecon)
	strategy.entry("Buy", strategy.long)
if (MomentumBear and directionIsDown and Tradecon )
    strategy.entry("Sell", strategy.short)
    strategy.exit("exit","Buy",when=directionIsDown,qty_percent=100,profit=20,loss=10)
    strategy.exit("exit","Sell",when=directionIsUp,qty_percent=100,profit=20,loss=10)
    

Thêm nữa