
Система количественной торговли с помощью фильтра ADX - это комплексная торговая стратегия, которая сочетает в себе идентификацию точек сопротивления поддержки, подтверждение тренда и проверку силы рынка в техническом анализе. Эта стратегия основана на прорыве рыночной цены на ключевые ценовые уровни и повышает надежность торгового сигнала, используя движущиеся средние и средний индекс направления ((ADX) в качестве фильтра. Система использует 1-часовую временную рамку, чтобы создать динамические зоны сопротивления поддержки, идентифицируя центральные высокие и низкие точки, и устанавливает стоп-лосс с фиксированным процентом для контроля риска при выходе торгового сигнала в этих зонах.
Основные принципы стратегии основаны на прорыве цены в ключевых поддерживающих устойчивых позициях, в сочетании с направлением тенденции и фильтрацией рыночной силы, чтобы сформировать целостную торговую систему. Конкретные принципы реализации включают:
Поддержка идентификации точек сопротивленияСистема использует метод Pivot Points для определения важных уровней цен.ta.pivothighиta.pivotlowФункция, рассчитывающая высокие и низкие точки на центральной оси с параметрами по умолчанию 5 циклов и использующая эти точки в качестве потенциальных резистентных и поддерживающих точек.
Динамичное управление территориейСистема использует структуру массиваsupportLevelsиresistanceLevelsХранилище поддерживает биты сопротивления и использует функции настройкиf_add_levelИнтеллектуальное управление этими ценовыми уровнями. Функция обеспечивает достаточное расстояние между новыми уровнями и существующими уровнями (по умолчанию 2%) для предотвращения перенаселения территорий, при этом ограничивает сохранение до пяти новейших уровней.
Фильтр подтверждения тренда: Стратегия использует 50-циклическую простую движущуюся среднюю ((SMA) в качестве индикатора направления тренда. Только когда цена находится выше средней линии, следует учитывать лишние, а когда она находится ниже средней линии, следует учитывать пустоту, чтобы следовать общей тенденции рынка.
Проверка силы рынка: Оценка силы рынка с помощью настраиваемой функции ADX (средний индекс направления). Значение ADX должно быть выше, чем установленный порог (дифолт 25), чтобы обеспечить вход в торговлю только при достаточной силе рынка и избежать ложных прорывов в слабой рыночной среде.
Входящий сигнал генерируется:
Механизм управления рисками: Стратегия использует фиксированный процент стоп-стоп-убытков, многоголовые по умолчанию на 15% стоп-стоп и 10% стоп-убытков, пустые головы по умолчанию на 10% стоп-стоп и 10% стоп-убытков. Как только цена достигает этих уровней, система автоматически ликвидирует позиции и перезапускает торговлю.
Основываясь на глубоком анализе кода, эта стратегия имеет следующие значительные преимущества:
Механизм многократного подтвержденияТрехкратное подтверждение в сочетании с прорывом сопротивления поддержки, направлением тренда и силой ADX эффективно снижает риск ложного прорыва. Многократный механизм подтверждения повышает надежность торговых сигналов по сравнению с одним индикатором.
Динамические зоны поддержки сопротивления: Система динамически идентифицирует и управляет сопротивлениями поддержки, способная адаптироваться к различным рыночным условиям. Сохраняется максимум 5 последних сопротивлений поддержки, что гарантирует, что стратегия будет сосредоточена на наиболее релевантных уровнях цен.
Интеллектуальные региональные кластеры: С помощью параметра максимальной ширины зоны ((maxZoneWidthPct), избегается перерасчет слишком близких точек сопротивления, уменьшается избыточный сигнал.
Настраиваемые вычисления ADX: Стратегия использования пользовательских ADX-функций, чтобы обеспечить точность и гибкость вычислений показателей путем прямого вычисления реальной амплитуды, направленного движения и плавной обработки
Гибкая конфигурация параметров: Стратегия предлагает множество регулируемых параметров, включая длину центральной оси, циклы отсчета, максимальную ширину зоны, стоп-стоп-лосс и ADX-терминал, которые пользователь может оптимизировать в зависимости от различных рыночных условий и торговых предпочтений.
Конкретные меры по контролю риска: Предоставление четкой структуры управления рисками для каждой сделки с помощью заданного стоп-стоп-лосса, предотвращение чрезмерных потерь в каждой сделке и одновременное блокирование разумной прибыли.
Интуитивная визуализацияСтратегия: маркировка на графике поддерживающих сопротивлений и торговых сигналов, предоставление интуитивной визуальной обратной связи с помощью цветового кодирования (поддерживающие сопротивления - зеленым, сопротивления - красным) и ярлыков (длинные, короткие, выходные) для анализа обратной связи и мониторинга в реальном времени.
Несмотря на разумную конструкцию этой стратегии, существуют следующие потенциальные риски и ограничения:
Фальшивые прорывы в условиях высокой волатильностиВ условиях высокой волатильности рынка, цена может часто прорывать поддерживающие сопротивления и возвращаться к исходному диапазону, что приводит к увеличению количества ложных сигналов прорыва. Решение: можно рассмотреть возможность увеличения подтверждающего цикла, требуя, чтобы цена после прорыва сохранялась определенное время или формировала определенную форму, чтобы подтвердить сигнал.
Чрезмерная зависимость от исторических уровней поддержки и сопротивления: Стратегия основана на историческом формировании уровней поддержки и сопротивления, которые могут потерять силу при фундаментальных изменениях в структуре рынка (например, крупных новостных событиях). Решение: можно рассмотреть возможность добавления механизма динамической корректировки, автоматически корректирующего уровень поддержки и сопротивления в зависимости от рыночной волатильности.
Ограничения фиксированного процента стоп-лосса: фиксированный стоп-стоп может быть не подходящим для всех рыночных условий, может быть слишком большим в рынках с низкой волатильностью, может быть слишком маленьким в рынках с высокой волатильностью. Решение: можно рассмотреть возможность динамической корректировки уровня стоп-стоп-стоп на основе ATR (реальной волатильности).
Риск изменения тренда: Использование 50-циклического SMA в качестве индикатора тренда может привести к задержке реакции на начальный поворот тренда, что приводит к тому, что тренд все еще вступает в строй, когда он близок к концу. . Решение: можно рассмотреть возможность добавления более чувствительного краткосрочного индикатора тренда или индикатора динамики в качестве вспомогательного решения.
Компьютерно-интенсивные стратегии: Стратегия требует вычисления и поддержания нескольких массивов и показателей в реальном времени и может иметь проблемы с производительностью в условиях высокой частоты торгов или ограниченных ресурсов. . Способы решения: оптимизация эффективности алгоритма, сокращение ненужных вычислений или рассмотрение возможности снижения частоты обновлений.
Параметр Чувствительность: Стратегическая производительность чувствительна к параметрам (например, длине оси оси, порогу ADX), неправильный выбор параметров может привести к чрезмерной торговле или упущенным возможностям. Решение: создание рамок для оптимизации параметров путем отслеживания их эффективности в различных рыночных условиях.
Основываясь на глубоком анализе кода стратегии, можно сделать следующее:
Механизм адаптации параметровВнедрение механизмов автоматической корректировки ключевых параметров в зависимости от рыночной волатильности. Например, увеличение порога ADX или ширины зоны сопротивления поддержки во время высокой волатильности и уменьшение этих параметров во время низкой волатильности, чтобы стратегия лучше адаптировалась к различным рыночным условиям. Это позволяет сократить ошибочные сделки в неподходящих рыночных условиях.
Анализ многовременных рамокУдостоверение уровня сопротивления поддержки на более высоких временных рамках. Выявление ключевых ценовых зон с более сильным признанием на более высоких временных рамках позволяет повысить качество сигнала, проверяя, соответствует ли уровень сопротивления поддержки на дневном или круговом графике уровню на текущем часовом графике.
Подтверждение объема сделкиВ сочетании с анализом объема сделок проверяется эффективность прорыва. По-настоящему эффективные прорывы обычно сопровождаются значительным увеличением объема сделок, и риск ложных прорывов, вызванных низким объемом сделок, может быть уменьшен путем добавления фильтров объема сделок.
Динамическая остановка остановкиЭто позволяет управлять рисками более гибко, позволяя автоматически корректировать уровень защиты в зависимости от текущих рыночных условий, устанавливая более мягкие остановки на рынках с высокой волатильностью и более жесткие остановки на рынках с низкой волатильностью.
Механизм частичного блокирования прибылиВнедрение механизма поэтапного получения прибыли, позволяющего перемещать убытки к цене стоимости или блокировать часть прибыли после достижения определенного уровня прибыли. Этот метод позволяет снизить риск вывода при сохранении высокого потенциала прибыли.
Интеграция эмоциональных показателейВ качестве дополнительных фильтров следует учитывать интеграцию показателей рыночной сентиментальности (например, VIX или показатели относительной силы). Рыночная сентиментальность часто влияет на устойчивость прорыва. Повышение понимания стратегии состояния рынка может быть достигнуто за счет увеличения измерения эмоционального анализа.
Классификация силы сопротивленияВведение механизма оценки силы удерживающего сопротивления и оценки силы на уровнях, основанных на факторах, таких как количество исторических испытаний и продолжительность времени формирования. Таким образом, можно уделять первоочередное внимание ценовому уровню, который является более сильным и более вероятным для эффективного реагирования.
Оптимизация машинного обучения: Рассмотрите возможность использования методов машинного обучения для оптимизации выбора параметров и генерации сигналов. Алгоритмы машинного обучения могут помочь определить наиболее эффективные комбинации параметров и рыночные условия, анализируя успешные и неудачные торговые модели в исторических данных.
Поддерживающая сопротивление-пробивая стратегия с количественной торговой системой тренда-ADX-фильтра является хорошо разработанной комплексной торговой системой, которая сочетает в себе несколько ключевых элементов в техническом анализе. Эта стратегия создает относительно надежный механизм для генерации торговых сигналов, путем динамического идентификации и мониторинга сопротивления в поддержке, в сочетании с фильтрацией направления тренда и силы рынка.
Ключевые преимущества стратегии заключаются в ее многократном подтверждении механизмов и совершенной структуре управления рисками, эффективно снижает риск ложных прорывов и ограничивает потенциальные потери от одной сделки. В то же время, стратегия предоставляет богатые параметры вариантов конфигурации, позволяя трейдерам гибко адаптироваться в соответствии с личными предпочтениями риска и рыночной среды.
Тем не менее, стратегия также сталкивается с некоторыми проблемами, такими как риск ложного прорыва в высоко волатильных рынках, ограниченность фиксированных стоп-стоп-убытков и чувствительность к параметрам. Предполагается дальнейшее повышение эффективности стратегии путем внедрения оптимизированных мер, таких как адаптивные механизмы параметров, анализ многократных временных рамок, подтверждение объема сделки и динамическое управление рисками.
В целом, это логически ясная, разумно спроектированная количественная торговая стратегия, подходящая для использования трейдером, имеющим некоторое понимание технического анализа и структуры рынка. Благодаря постоянной оптимизации и адаптации к изменениям рынка, стратегия имеет потенциал для стабильной работы в различных рыночных условиях.
/*backtest
start: 2024-05-30 00:00:00
end: 2025-05-29 00:00:00
period: 3d
basePeriod: 3d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("S/R Breakout Strategy (1H) with Trend and ADX Filter", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// ─────────────────────────────────────────────────────────────
// INPUTS
// ─────────────────────────────────────────────────────────────
pivotLen = input.int(5, title="Pivot Length")
lookbackBars = input.int(300, title="Lookback Bars")
maxZoneWidthPct = input.float(2.0, title="Max Zone Width %")
tpLong = input.float(0.15, title="Take Profit % (Long)")
slLong = input.float(0.10, title="Stop Loss % (Long)")
tpShort = input.float(0.10, title="Take Profit % (Short)")
slShort = input.float(0.10, title="Stop Loss % (Short)")
allowLong = input.bool(true, title="Allow Long Trades")
allowShort = input.bool(true, title="Allow Short Trades")
// ADX settings
adxThreshold = input.float(25.0, title="ADX Threshold")
adxLen = input.int(14, title="ADX Length")
// Trend filter: 50-period moving average
ma50 = ta.sma(close, 50)
// ─────────────────────────────────────────────────────────────
// CUSTOM ADX FUNCTION
// ─────────────────────────────────────────────────────────────
// This function calculates ADX using the common method based on true range,
// directional movement and smoothing it with the RMA.
f_adx(len) =>
// true range for the current bar
tr = ta.tr
// Calculate upward and downward moves
upMove = high - high[1]
downMove = low[1] - low
// Determine directional movements
plusDM = (upMove > downMove and upMove > 0) ? upMove : 0.0
minusDM = (downMove > upMove and downMove > 0) ? downMove : 0.0
// Smooth the values using RMA (running moving average)
smPlusDM = ta.rma(plusDM, len)
smMinusDM = ta.rma(minusDM, len)
smTR = ta.rma(tr, len)
// Calculate the directional indicators, avoid division by zero
plusDI = (smTR != 0) ? 100 * smPlusDM / smTR : 0.0
minusDI = (smTR != 0) ? 100 * smMinusDM / smTR : 0.0
diSum = plusDI + minusDI
dx = (diSum != 0) ? 100 * math.abs(plusDI - minusDI) / diSum : 0.0
// Smooth the DX to get ADX
ta.rma(dx, len)
// Compute ADX value using the custom function
adxValue = f_adx(adxLen)
// ─────────────────────────────────────────────────────────────
// PIVOT DETECTION & SUPPORT/RESISTANCE LEVELS
// ─────────────────────────────────────────────────────────────
pivotHigh = ta.pivothigh(high, pivotLen, pivotLen)
pivotLow = ta.pivotlow(low, pivotLen, pivotLen)
// Declare arrays for support and resistance levels
var float[] supportLevels = array.new_float()
var float[] resistanceLevels = array.new_float()
// Function to add a level into the provided array if it meets the criteria.
// Always returns a float (0.0) for consistency.
f_add_level(arr, newLevel) =>
if array.size(arr) == 0
array.push(arr, newLevel)
else
shouldAdd = true
for i = 0 to (array.size(arr) - 1)
existing = array.get(arr, i)
if math.abs(existing - newLevel) / newLevel * 100 <= maxZoneWidthPct
shouldAdd := false
if shouldAdd
array.push(arr, newLevel)
if array.size(arr) > 5
array.shift(arr)
0.0
// Update support and resistance arrays once sufficient bars have formed
if bar_index > pivotLen * 2
if not na(pivotLow)
f_add_level(supportLevels, pivotLow)
if not na(pivotHigh)
f_add_level(resistanceLevels, pivotHigh)
// ─────────────────────────────────────────────────────────────
// TRADE MANAGEMENT VARIABLES
// ─────────────────────────────────────────────────────────────
var bool inTrade = false
var bool isLong = false
var float entryPrice = na
// Signal flags
longSignal = false
shortSignal = false
// Detect long signal: price crosses above support level
if array.size(supportLevels) > 0
for i = 0 to (array.size(supportLevels) - 1)
lvl = array.get(supportLevels, i)
if low < lvl and close > lvl
longSignal := true
// Detect short signal: price crosses below resistance level
if array.size(resistanceLevels) > 0
for i = 0 to (array.size(resistanceLevels) - 1)
lvl = array.get(resistanceLevels, i)
if high > lvl and close < lvl
shortSignal := true
// ─────────────────────────────────────────────────────────────
// ENTRY CONDITIONS & EXECUTION
// ─────────────────────────────────────────────────────────────
if not inTrade
// Long entry: require long signal, price above 50MA, and ADX above threshold
if allowLong and longSignal and close > ma50 and adxValue > adxThreshold
strategy.entry("Long", strategy.long)
label.new(x=bar_index, y=low, text="LONG", xloc=xloc.bar_index, style=label.style_label_up, color=color.green, textcolor=color.white)
entryPrice := close
isLong := true
inTrade := true
// Short entry: require short signal, price below 50MA, and ADX above threshold
else if allowShort and shortSignal and close < ma50 and adxValue > adxThreshold
strategy.entry("Short", strategy.short)
label.new(x=bar_index, y=high, text="SHORT", xloc=xloc.bar_index, style=label.style_label_down, color=color.red, textcolor=color.white)
entryPrice := close
isLong := false
inTrade := true
// ─────────────────────────────────────────────────────────────
// EXIT CONDITIONS
// ─────────────────────────────────────────────────────────────
if inTrade
ret = isLong ? (close - entryPrice) / entryPrice : (entryPrice - close) / entryPrice
tp = isLong ? tpLong : tpShort
sl = isLong ? slLong : slShort
if ret >= tp or ret <= -sl
strategy.close_all()
label.new(x=bar_index, y=close, text="EXIT", xloc=xloc.bar_index, style=label.style_label_left, color=color.orange, textcolor=color.black)
inTrade := false
entryPrice := na
// ─────────────────────────────────────────────────────────────
// ALERT CONDITIONS
// ─────────────────────────────────────────────────────────────
alertcondition(longSignal and allowLong, title="Long Breakout", message="🚀 Long breakout on {{ticker}} at {{close}}")
alertcondition(shortSignal and allowShort, title="Short Breakout", message="🔻 Short breakout on {{ticker}} at {{close}}")