Эта стратегия объединяет базовый сигнал реверсии среднего значения, фильтр волатильности ATR и фильтр тренда HMA для создания надежных торговых сигналов для количественных торговых стратегий.
Стратегия использует 37-периодную скользящую среднюю в качестве базовой линии. Когда цена выходит вверх от этой базовой линии, она генерирует сигнал покупки, а когда она выходит вниз сверху, она генерирует сигнал продажи. Чтобы избежать ложных сигналов, стратегия требует, чтобы цена переместилась за пределы волатильности 2xATR после проникновения в базовую линию, чтобы подтвердить действительность сигналов. Кроме того, стратегия использует 11-периодную HMA для оценки основного тренда. Она подтверждает действительные сигналы только тогда, когда цена проникает в базовую линию, выравнивается с направлением HMA, чтобы предотвратить неблагоприятный отбор.
Для получения прибыли стратегия поддерживает использование одного или нескольких (двух или трех) уровней получения прибыли.
По сравнению с простыми стратегиями прорыва скользящей средней, эта стратегия добавляет фильтр волатильности ATR, который удаляет много недействительных сигналов. Это очень хорошо согласуется с методами прорыва визуальных моделей, что приводит к более высоким показателям выигрыша. Кроме того, тенденционный уклон HMA предотвращает неблагоприятный отбор и значительно снижает ненужные потери.
Основной риск заключается в том, что фильтр волатильности ATR может удалить некоторые действительные сигналы, что приводит к неспособности своевременно открывать позиции. Кроме того, суждение о тренде HMA не очень значимо иногда, когда цена просто имеет краткосрочное отступление, а не обратное движение. Это может привести к ненужным стоп-лосс. Чтобы снизить риски, мы можем снизить параметр фильтра волатильности ATR, чтобы позволить больше сигналов. Мы также можем скорректировать параметр периода HMA, чтобы использовать долгосрочный HMA для оценки основных тенденций, предотвращая вмешательство от краткосрочных колебаний.
Стратегия может быть оптимизирована в следующих аспектах:
Испытывать больше комбинаций параметров, чтобы найти оптимальный набор значений, например, базовый период, период ATR, коэффициент волатильности и т.д.
Добавить больше фильтров или осцилляторов для оценки рыночных условий для повышения надежности модели.
Оптимизировать параметры для механизмов получения прибыли, тестировать больше уровней цен и схемы распределения.
Включить модели машинного обучения для создания более эффективных торговых сигналов.
Эта стратегия объединяет двойной движущийся средний базовый сигнал, фильтр волатильности 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)