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.
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")