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

Автор:Чао Чжан, Дата: 2024-02-27 15:15:07
Тэги:

img

Обзор

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

Принцип стратегии

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

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

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

Больше