Стратегия адаптивного экспоненциального скользящего среднего диапазона

Автор:Чао Чжан, Дата: 2024-02-26 14:58:32
Тэги:

img

Обзор

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

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

  1. Вычислить экспоненциальную взвешенную скользящую среднюю EHMA на основе параметра периода.

  2. Построить адаптивный канал выше и ниже EHMA на основе параметра RangeWidth. Только когда цена поднимается выше верхней линии канала или падает ниже нижней линии канала, считается, что тенденция изменилась, и торговые сигналы запускаются.

  3. Определить отношение цены к каналу. Долгая, когда цена проходит через верхнюю линию, короткая, когда проходит через нижнюю линию. Закрыть длинную позицию, когда цена пересекает нижнюю линию, закрыть короткую позицию, когда цена пересекает нижнюю линию.

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

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

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

  2. Адаптивный канал может эффективно отфильтровывать колебания цен. Торговые сигналы запускаются только тогда, когда ценовая тенденция резко изменилась. Это может отфильтровать некоторые неэффективные сделки и улучшить прибыльность.

  3. Ширина канала может быть гибко регулирована для адаптации к различным рыночным условиям. Более широкие каналы могут фильтровать больше колебаний и уменьшать частоту торговли. Уменьшенные каналы могут идентифицировать изменения тренда раньше и увеличить частоту торговли.

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

Эта стратегия также сопряжена с некоторыми рисками:

  1. Ложные прорывы все еще не могут быть полностью избегнуты. Цены могут разрываться за канал. Параметры должны быть корректированы должным образом для контроля рисков.

  2. Некоторые торговые возможности могут быть упущены, если канал слишком широк.

  3. Слишком узкие каналы могут увеличить неэффективную торговлю.

Руководство по оптимизации

Эта стратегия может быть оптимизирована в следующих аспектах:

  1. Оптимизировать параметр Периода.

  2. Оптимизируйте параметр RangeWidth, корректируйте диапазон канала на основе волатильности рынка и личных предпочтений риска.

  3. Добавьте стратегию стоп-лосса. Установите разумные точки стоп-лосса во время хранения позиций, чтобы эффективно контролировать максимальную потерю на сделку.

  4. Комбинируйте с другими показателями фильтрации записей, например, добавляйте объем, чтобы уменьшить ложные записи.

  5. Диверсифицировать стратегические приложения и оптимизировать параметры. Испытать и оптимизировать универсальные параметры для большего числа продуктов и временных рамок.

Резюме

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


/*backtest
start: 2023-02-25 00:00:00
end: 2024-02-25 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
args: [["v_input_1",1]]
*/

// Credit is due where credit is due:
// Hull Moving Average: developed by Alan Hull
// EHMA: coded by Twitter @borserman
// I've built on their work in an attempt to create a strategy more robust to fake moves
// @0xLetoII

//@version=4
strategy(
  title="EHMA Range Strategy",
  process_orders_on_close=true,
  explicit_plot_zorder=true,
  overlay=true, 
  initial_capital=1500, 
  default_qty_type=strategy.percent_of_equity, 
  commission_type=strategy.commission.percent, 
  commission_value=0.085,
  default_qty_value=100
  )
  

// Position Type
pos_type = input(defval = "Long", title="Position Type", options=["Both", "Long", "Short"])

// Inputs
Period = input(defval=180, title="Length")
RangeWidth = input(defval=0.02, step=0.01, title="Range Width")
sqrtPeriod = sqrt(Period)

// Function for the Borserman EMA
borserman_ema(x, y) =>
    alpha = 2 / (y + 1)
    sum = 0.0
    sum := alpha * x + (1 - alpha) * nz(sum[1])

// Calculate the Exponential Hull Moving Average
EHMA = borserman_ema(2 * borserman_ema(close, Period / 2) - borserman_ema(close, Period), sqrtPeriod)

// Create upper & lower bounds around the EHMA for broader entries & exits
upper = EHMA + (EHMA * RangeWidth)
lower = EHMA - (EHMA * RangeWidth)

// Plots
EHMAcolor = (close > EHMA ? color.green : color.red)
plot(EHMA, color=EHMAcolor, linewidth=2)
plot(lower, color=color.orange, linewidth=2)
plot(upper, color=color.blue, linewidth=2)


// Strategy
long = close > upper
exit_long = close < lower
short = close < lower
exit_short = close > upper


// Calculate start/end date and time condition
startDate  = input(timestamp("2017-01-01T00:00:00"))
finishDate = input(timestamp("2029-01-01T00:00:00"))
 
time_cond  = true


// Entries & Exits
if pos_type == "Both"
    strategy.entry("Long", strategy.long, comment="Long", when=long and time_cond)
    strategy.close("Long", comment="Exit Long", when=exit_long and time_cond)
    strategy.entry("Short", strategy.short, comment="Short", when=short and time_cond)
    strategy.close("Short", comment="Exit Short", when=exit_short and time_cond)
if pos_type == "Long"
    strategy.entry("Long", strategy.long, comment="Long", when=long and time_cond)
    strategy.close("Long", comment="Exit Long", when=exit_long and time_cond)
if pos_type == "Short"
    strategy.entry("Short", strategy.short, comment="Short", when=short and time_cond)
    strategy.close("Short", comment="Exit Short", when=exit_short and time_cond)
    

Больше