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


Ngày tạo: 2024-01-04 15:31:34 sửa đổi lần cuối: 2024-01-04 15:31:34
sao chép: 1 Số nhấp chuột: 590
1
tập trung vào
1621
Người theo dõi

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

Tổng quan

Chiến lược này sử dụng Amplitude thực trung bình (ATR) và chỉ số biến động (CHOP) làm chỉ số kỹ thuật chính để nhận diện và theo dõi xu hướng. Khi chỉ số phá vỡ đường ray, kết hợp hướng xu hướng làm tín hiệu đầu vào; Khi chỉ số quay trở lại khu vực băng tròn, hãy dừng lỗ hoặc dừng thoát ra.

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

  1. Sử dụng ATR để tính toán kích thước của thùng, xây dựng kênh Ripple và định hướng xu hướng giá.
  2. Sử dụng chỉ số CHOP để xác định 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 cho thấy thị trường biến động chậm; nếu không, thị trường biến động lớn, không nên giao dịch.
  3. Khi chỉ số CHOP phá vỡ đường sắt phía trên xuống từ 61.8, giá sẽ đi vào xu hướng giảm, và nếu EMA ngắn hạn nhanh cũng cho thấy giá dẫn đầu, nó sẽ phá vỡ; ngược lại, khi CHOP phá vỡ đường sắt phía dưới từ 38.2 và EMA ngắn hạn kéo giá lên, nó sẽ làm nhiều hơn.
  4. Sử dụng chiến lược dừng dừng khi giá quay trở lại vùng 38.2-61.8 của CHOP.

Phân tích lợi thế chiến lược

Chiến lược này kết hợp sự phán đoán xu hướng và kiểm soát biến động để nắm bắt xu hướng giá cả và kiểm soát rủi ro, một chiến lược theo dõi xu hướng tương đối ổn định.

  1. Sử dụng kênh Ripple được xây dựng bởi ATR để theo dõi xu hướng giá một cách hiệu quả.
  2. Chỉ số CHOP đánh giá sự biến động của thị trường, tránh giao dịch sai trong những biến động mạnh.
  3. Kết hợp với EMA nhanh chóng để xác định hướng xu hướng ngắn hạn, tránh hoạt động đảo ngược.
  4. Chiến lược Stop Loss để kiểm soát tổn thất đơn lẻ

Phân tích rủi ro

Những rủi ro chính của chiến lược này là:

  1. Trong trường hợp chấn động, kênh ATR và chỉ số CHOP có thể tạo ra tín hiệu sai. Các tham số có thể được điều chỉnh thích hợp để loại bỏ tín hiệu sai.
  2. Một bộ chỉ số kỹ thuật duy nhất không thể hoàn toàn tránh được sự mất mát, cần sự can thiệp của con người để xác định xu hướng lớn.
  3. Vị trí dừng lỗ được thiết lập quá thoải mái, tổn thất đơn lẻ có thể quá lớn. Cần giảm mức dừng lỗ thích hợp.

Hướng tối ưu hóa chiến lược

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

  1. Thêm các chỉ số hỗ trợ khác để đánh giá tín hiệu, chẳng hạn như hình dạng đường K, số lượng giao dịch, v.v., để cải thiện độ chính xác của tín hiệu.
  2. Tối ưu hóa các tham số của ATR và CHOP để nắm bắt tốt hơn sự biến động giá.
  3. Thiết lập vị trí dừng động để có thêm không gian dừng và dừng nhanh hơn.
  4. Sau khi đánh giá xu hướng ở cấp độ lớn, mở rộng phạm vi dừng lỗ thích hợp để có được lợi nhuận cao hơn trong xu hướng.

Tóm tắt

Chiến lược này tích hợp các chỉ số kỹ thuật thường được sử dụng, đơn giản và thực tế. Với sự tối ưu hóa điều chỉnh tham số, có thể đạt được hiệu quả theo dõi tốt. Tuy nhiên, vẫn cần phải xác định xu hướng lớn bằng tay, không thể tự động hóa hoàn toàn. Nó có thể được sử dụng như một công cụ quyết định hỗ trợ và cũng có thể được sử dụng để tham khảo các chiến lược khác.

Mã nguồn chiến lượ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)