
Chiến lược này dựa trên chỉ số động lực kênh thiết kế tín hiệu giao dịch, tạo ra tín hiệu mua và bán dựa trên giá phá vỡ kênh lên xuống đường. Chiến lược chỉ giao dịch nhiều đầu, nếu có tín hiệu bán, thì vị trí trống đến vị trí trống.
Chiến lược này sử dụng SMA trung bình và ATR thực để xây dựng kênh động lực. Các kênh trên và dưới của kênh là:
Đường đua trên = SMA + ATR * hệ số Đường đua dưới = SMA - ATR * hệ số
Khi giá lên đường, nó tạo ra tín hiệu mua; khi giá xuống đường, nó tạo ra tín hiệu bán.
Vì chỉ làm nhiều đầu, nên nếu có tín hiệu bán, hãy hủy lệnh mở kho trước đó, và đặt hàng vào trạng thái trống.
Chính xác thì, chiến lược này có thể diễn ra như sau:
Chiến lược này có những ưu điểm sau:
Chiến lược này cũng có một số rủi ro:
Phản ứng:
Chính sách này có thể được tối ưu hóa theo các khía cạnh sau:
Chiến lược này dựa trên chỉ số kênh động lực, đơn giản và hiệu quả để nắm bắt xu hướng thị trường. Logic của chiến lược rõ ràng và dễ hiểu, tạo ra tín hiệu giao dịch bằng cách phá vỡ kênh giá lên xuống. Mặc dù chỉ làm nhiều đầu và không có cơ chế thoát ra là không đủ, nhưng có thể được cải thiện bằng cách tối ưu hóa tham số, thêm mô-đun đầu trống, thêm cách dừng lỗ.
/*backtest
start: 2023-11-24 00:00:00
end: 2023-12-24 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Keltner Channel Strategy", overlay=true)
source = close
useTrueRange = input(true)
length = input(20, minval=1)
mult = input(1.0)
ma = sma(source, length)
range = useTrueRange ? tr : high - low
rangema = sma(range, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = crossover(source, upper)
crossLower = crossunder(source, 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 (source < ma or high >= bprice )
cancelScond = crossScond and (source > 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")
//plot(strategy.equity, title="equity", color=red, linewidth=2, style=areabr)