Chiến lược đột phá kênh năng động

Tác giả:ChaoZhang, Ngày: 2024-02-27 15:07
Tags:

img

Tổng quan

Chiến lược này sử dụng chỉ số Keltner Channel, kết hợp với đường trung bình động, để thiết lập giá mua và bán đột phá năng động để đạt được các hoạt động đột phá mua thấp-bán cao. Chiến lược có thể tự động xác định cơ hội mua và bán đột phá kênh.

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

  1. Tính toán trung bình kênh: Sử dụng đường trung bình động theo cấp số nhân để tính toán trung bình giá của kênh
  2. Tính toán băng thông kênh: Sử dụng trung bình động của biến động thực sự, biến động thực tế trung bình hoặc kích thước giá để tính toán băng thông kênh
  3. Đường ray trên và dưới kênh: trung bình ± N lần băng thông kênh
  4. Lệnh nhập: Khi giá chạm vào đường ray trên, đặt giá mua đột phá và chờ đột phá; khi giá chạm vào đường ray dưới, đặt giá bán đột phá và chờ đột phá
  5. Lệnh thoát: Dừng lỗ khi giá giảm trở lại mức trung bình sau khi mua, hoặc khi giá cao nhất vượt quá giá nhập cảnh; Dừng lỗ khi giá bật trở lại mức trung bình sau khi bán hoặc khi giá thấp nhất thấp hơn giá nhập cảnh

Phân tích lợi thế

  1. Sử dụng các kênh năng động có thể nhanh chóng nắm bắt những thay đổi trong xu hướng thị trường
  2. Sử dụng trung bình là thuận lợi để đánh giá hướng của xu hướng giá
  3. N lần thiết lập băng thông làm cho phạm vi kênh hợp lý để tránh điều chỉnh vị trí thường xuyên
  4. Sử dụng các cơ chế đột phá phù hợp với lý thuyết xu hướng và theo xu hướng
  5. Thiết lập các điều kiện dừng lỗ kiểm soát nghiêm ngặt rủi ro

Phân tích rủi ro

  1. Việc lựa chọn phương pháp tính toán đường trung bình sẽ ảnh hưởng đến hiệu ứng khớp của phạm vi kênh và giá
  2. N quá lớn hoặc nhỏ sẽ ảnh hưởng đến tỷ lệ lợi nhuận của chiến lược
  3. Mua và bán đột phá có xu hướng tạo ra tín hiệu sai và nên được ngăn chặn nghiêm ngặt

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

  1. Hãy thử các phương pháp tính toán đường trung bình khác nhau để tìm các thông số tối ưu
  2. Kiểm tra các giá trị N khác nhau để tìm nhân tối ưu
  3. Tăng cường độ đột phá để tránh tín hiệu sai
  4. Tối ưu hóa logic dừng lỗ để kiểm soát chặt chẽ lỗ duy nhất

Tóm lại

Chiến lược tổng thể sử dụng các phương pháp khoa học và hợp lý để đánh giá xu hướng và hướng giá thông qua các chỉ số kênh năng động, thiết lập các tham số hợp lý để nắm bắt các tín hiệu đột phá, đạt được mức mua thấp-bán cao và thu được lợi nhuận dư thừa. Đồng thời, liên tục tối ưu hóa rủi ro của chiến lược để nó có thể chạy ổn định trên các thị trường khác nhau.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
     : na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
     : na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (src < ma or high >= bprice )
cancelScond = crossScond and (src > ma or low <= sprice )
if (cancelBcond)
	strategy.cancel("KltChLE")
if (crossUpper)
	strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
	strategy.cancel("KltChSE")
if (crossLower)
	strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

Thêm nữa