
Эта стратегия основана на динамическом канале, который проектирует торговые сигналы, чтобы генерировать сигналы о покупке и продаже в зависимости от того, как цена прорывается вверх и вниз по каналу. Стратегия делает только многоголовые сделки, и если появляется сигнал о продаже, то позиция становится свободной.
Эта стратегия использует средние значения SMA и реальную колебательную величину ATR для построения динамического канала. Верхний и нижний рельсы канала:
Верхняя полоса = SMA + ATR * коэффициент Нижняя линия = SMA - ATR * коэффициент
Когда цена выходит на траекторию, генерируется сигнал покупки; когда цена выходит на траекторию, генерируется сигнал продажи.
Поскольку делается только много голов, то если появляется сигнал продажи, отменяется предыдущий открытый ордер, и позиция становится пустой.
В частности, логика стратегии заключается в следующем:
Эта стратегия имеет следующие преимущества:
Однако есть и другие риски:
Ответ:
Эта стратегия может быть оптимизирована в следующих аспектах:
Эта стратегия основана на динамических канальных показателях, просто и эффективно улавливает рыночные тенденции. Логика стратегии ясна и понятна, она генерирует торговые сигналы путем прорыва цены в канале. Хотя только многоголовый и без механизма выхода недостаточны, но они могут быть улучшены с помощью оптимизации параметров, добавления пустых модулей, добавления стоп-стоп и т. Д. В целом, эта стратегия имеет очень большой простор для улучшения и заслуживает глубокого изучения и применения количественной стратегии.
/*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)