На основе стратегии динамического прорыва канала


Дата создания: 2024-02-27 15:15:07 Последнее изменение: 2024-02-27 15:15:07
Копировать: 0 Количество просмотров: 567
1
Подписаться
1617
Подписчики

На основе стратегии динамического прорыва канала

Обзор

Эта стратегия использует индикатор Keltner Channel в сочетании с движущейся средней, чтобы установить динамическую цену покупки и продажи, чтобы реализовать операцию покупки и продажи по низкой цене. Стратегия может автоматически идентифицировать возможность покупки и продажи по каналу.

Стратегический принцип

  1. Вычисление средней полосы в канале: средняя полоса цены с использованием индекса
  2. Расчет пропускной способности канала: расчет пропускной способности канала с использованием фактической пропускной способности или средней фактической пропускной способности или пропускной способности цены
  3. Вверх и вниз по орбите: пропускная способность в ±N раз больше, чем на средней орбите
  4. Входная последовательность: когда цена касается верхней линии, устанавливается прорыв покупательской цены, ожидая прорыва; когда цена касается нижней линии, устанавливается прорыв продажи, ожидая прорыва
  5. Последовательность выхода: остановка после покупки, когда цена возвращается к средней траектории или когда максимальная цена превышает цену входа; остановка после продажи, когда цена возвращается к средней траектории или когда минимальная цена ниже цены входа

Анализ преимуществ

  1. Использование динамических каналов, позволяющих быстро улавливать изменения в рыночных тенденциях
  2. Использование средней полосы для определения направления движения цены
  3. N-кратное увеличение полосы пропускания позволяет рационально расширять пропускную способность и избегать частого изменения позиции
  4. Использование прорывных механизмов в соответствии с теорией тенденций, с учетом динамики
  5. Установка стоп-условий и строгий контроль риска

Анализ рисков

  1. Выбор метода расчета орбитальной линии влияет на эффективность сопоставления диапазона и цены
  2. Слишком большие или слишком маленькие N-разряды влияют на доходность стратегии.
  3. Прорыв в торговле может привести к появлению ложных сигналов, поэтому следует строго пресекать их распространение.

Направление оптимизации

  1. Попробуйте различные методы вычисления орбитальной линии, чтобы найти оптимальные параметры
  2. Тестирование различных N-значений для поиска оптимального множителя
  3. Повышение пропускной способности, чтобы избежать ложных сигналов
  4. Оптимизация логики остановки убытков, строгий контроль одиночных потерь

Подвести итог

Эта стратегия в целом использует науку, чтобы оценить движение и направление цены с помощью динамических канальных индикаторов, установить разумные параметры для захвата прорыва, достижения низких покупок и высоких продаж, а затем получения избыточной прибыли. При этом стратегия постоянно оптимизирует риск, чтобы она могла стабильно работать на различных рынках.

Исходный код стратегии
/*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")