В процессе загрузки ресурсов... загрузка...

Базовый перекрестный квалификатор ATR Volatility & HMA Trend Bias Mean Reversal Strategy

Автор:Чао Чжан, Дата: 2024-01-17 16:37:23
Тэги:

img

Обзор

Эта стратегия объединяет базовый сигнал реверсии среднего значения, фильтр волатильности ATR и фильтр тренда HMA для создания надежных торговых сигналов для количественных торговых стратегий.

Логика стратегии

Стратегия использует 37-периодную скользящую среднюю в качестве базовой линии. Когда цена выходит вверх от этой базовой линии, она генерирует сигнал покупки, а когда она выходит вниз сверху, она генерирует сигнал продажи. Чтобы избежать ложных сигналов, стратегия требует, чтобы цена переместилась за пределы волатильности 2xATR после проникновения в базовую линию, чтобы подтвердить действительность сигналов. Кроме того, стратегия использует 11-периодную HMA для оценки основного тренда. Она подтверждает действительные сигналы только тогда, когда цена проникает в базовую линию, выравнивается с направлением HMA, чтобы предотвратить неблагоприятный отбор.

Для получения прибыли стратегия поддерживает использование одного или нескольких (двух или трех) уровней получения прибыли.

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

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

Риски и решения

Основной риск заключается в том, что фильтр волатильности ATR может удалить некоторые действительные сигналы, что приводит к неспособности своевременно открывать позиции. Кроме того, суждение о тренде HMA не очень значимо иногда, когда цена просто имеет краткосрочное отступление, а не обратное движение. Это может привести к ненужным стоп-лосс. Чтобы снизить риски, мы можем снизить параметр фильтра волатильности ATR, чтобы позволить больше сигналов. Мы также можем скорректировать параметр периода HMA, чтобы использовать долгосрочный HMA для оценки основных тенденций, предотвращая вмешательство от краткосрочных колебаний.

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

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

  1. Испытывать больше комбинаций параметров, чтобы найти оптимальный набор значений, например, базовый период, период ATR, коэффициент волатильности и т.д.

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

  3. Оптимизировать параметры для механизмов получения прибыли, тестировать больше уровней цен и схемы распределения.

  4. Включить модели машинного обучения для создания более эффективных торговых сигналов.

Заключение

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


/*backtest
start: 2023-01-10 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © sevencampbell

//@version=5
strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true)

// --- User Inputs ---

// Baseline Inputs
baselineLength = input.int(title="Baseline Length", defval=20)
baseline = ta.sma(close, baselineLength)

// PBCQ Inputs
pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true)
pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3)

// Volatility Inputs
atrLength = input.int(title="ATR Length", defval=14)
multiplier = input.float(title="Volatility Multiplier", defval=2.0)
rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0)
qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5)

// Take Profit Inputs
takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit")

// HMA Inputs
hmaLength = input.int(title="HMA Length", defval=50)

// --- Calculations ---

// ATR
atr = ta.atr(atrLength)

// Range Calculation
rangeHigh = baseline + rangeMultiplier * atr
rangeLow = baseline - rangeMultiplier * atr
rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na
bgcolor(rangeColor, transp=90)

// Qualifier Calculation
qualifier = qualifierMultiplier * atr

// Dot Calculation
isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength)
isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength)
colorDot = isLong ? color.green : isShort ? color.red : na
plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3)

// --- Strategy Logic ---

// PBCQ
pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline

// Entry Logic
longCondition = isLong and pbcqValid
shortCondition = isShort and pbcqValid
if (longCondition)
    strategy.entry("Long", strategy.long)
if (shortCondition)
    strategy.entry("Short", strategy.short)

// Exit Logic
if (takeProfitType == "1 Take Profit")
    strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow)
    strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh)
else if (takeProfitType == "2 Take Profits")
    strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2)
    strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh)
    strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2)
    strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow)
else if (takeProfitType == "3 Take Profits")
    strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2)
    strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75)
    strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)


Больше