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