Динамическая поддержка-сопротивление пивот адаптивная количественная торговая стратегия

ATR Pivot
Дата создания: 2025-01-10 15:08:24 Последнее изменение: 2025-01-10 15:08:24
Копировать: 3 Количество просмотров: 416
1
Подписаться
1617
Подписчики

Динамическая поддержка-сопротивление пивот адаптивная количественная торговая стратегия

Обзор

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

Стратегический принцип

Основная логика стратегии основана на следующих ключевых элементах:

  1. Расчет динамической точки разворота: использует регулируемый параметр длины точки разворота (по умолчанию 2) для определения локальных максимумов и минимумов.
  2. Диапазон поддержки и сопротивления: установите процентный диапазон (по умолчанию 0,4%) на основе точки разворота, чтобы определить эффективную торговую зону.
  3. Формирование торгового сигнала: Когда цена пробивает уровень поддержки снизу, формируется длинный сигнал, а когда цена пробивает уровень сопротивления сверху, формируется короткий сигнал.
  4. Контроль рисков: применяются динамические настройки стоп-лосса (10%) и прибыли (27%), а размер позиции автоматически корректируется в соответствии с балансом счета.

Стратегические преимущества

  1. Высокая адаптивность: стратегия может динамически корректировать позиции поддержки и сопротивления в соответствии с состоянием рынка, чтобы избежать запаздывания, вызванного статическими уровнями.
  2. Контролируемый риск: благодаря строгому процентному стоп-лоссу и динамическому управлению позициями риск каждой транзакции контролируется в разумных пределах.
  3. Масштабируемость: поддерживает несколько временных периодов и комбинаций параметров для упрощения оптимизации в соответствии с различными рыночными условиями.
  4. Высокая прозрачность: торговая логика понятна, все сигналы и уровни цен наглядно отображаются на графике.

Стратегический риск

  1. Риск ложного пробоя: на нестабильном рынке могут возникать частые сигналы ложного пробоя, которые необходимо уменьшить путем корректировки параметров интервала поддержки и сопротивления.
  2. Влияние проскальзывания: в рыночной среде с низкой ликвидностью фактическая цена транзакции может значительно отклоняться от сигнальной цены.
  3. Зависимость от тренда: стратегия работает лучше на рынке с сильным трендом, но может генерировать слишком много торговых сигналов в боковой фазе.
  4. Чувствительность параметров: эффективность стратегии чувствительна к настройкам параметров, и для определения оптимальной комбинации параметров требуется бэктестинг.

Направление оптимизации стратегии

  1. Добавлен модуль распознавания рыночной среды для автоматической корректировки параметров в соответствии с волатильностью.
  2. Ввести объем и другие технические индикаторы в качестве вспомогательных подтверждающих сигналов
  3. Оптимизируйте алгоритмы управления позициями и вносите динамические корректировки в зависимости от волатильности рынка
  4. Добавьте временной фильтр, чтобы избежать генерации торговых сигналов в неблагоприятные периоды
  5. Разработать адаптивный алгоритм стоп-лосса для динамической корректировки позиции стоп-лосса в соответствии с волатильностью рынка.

Подвести итог

Стратегия обеспечивает надежную основу для следования за трендом и торговли на разворотах путем динамического определения ключевых уровней цен в сочетании со строгим контролем рисков. Несмотря на определенную степень чувствительности параметров и зависимости от рыночной среды, благодаря постоянной оптимизации и совершенствованию можно поддерживать стабильную работу в различных рыночных условиях. Успешная реализация стратегии требует от трейдеров глубокого понимания ее принципов и внесения соответствующих корректировок параметров в зависимости от конкретных рыночных условий.

Исходный код стратегии
/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-08 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © felipemiransan

//@version=6
strategy("Dynamic Support and Resistance Pivot Strategy ", overlay=true)

// Strategy parameters
pivot_length = input.int(2, title="Pivot Length", tooltip="Pivot size to identify peaks and troughs")
support_resistance_distance = input.float(0.4, title="Support/Resistance Distance %", tooltip="Distance to consider a support or resistance level in %")

// Stop Loss and Take Profit parameters
stop_loss_pct = input.float(10.0, title="Stop Loss %", tooltip="Stop loss percentage", minval=0.1) / 100
take_profit_pct = input.float(26.0, title="Take Profit %", tooltip="Take profit percentage", minval=0.1) / 100

// Functions to identify high and low pivots
pivot_high = ta.pivothigh(high, pivot_length, pivot_length)
pivot_low = ta.pivotlow(low, pivot_length, pivot_length)

// Storing support and resistance levels
var float resistance_level = na
var float support_level = na
var float last_pivot_high = na
var float last_pivot_low = na

// Updating support and resistance based on pivots
if (not na(pivot_high))
    resistance_level := high[pivot_length]
    last_pivot_high := high[pivot_length]

if (not na(pivot_low))
    support_level := low[pivot_length]
    last_pivot_low := low[pivot_length]

// Function to check if the current price is near a support or resistance level
is_near_resistance = (not na(resistance_level)) and (close >= resistance_level * (1 - support_resistance_distance / 100)) and (close <= resistance_level * (1 + support_resistance_distance / 100))
is_near_support = (not na(support_level)) and (close >= support_level * (1 - support_resistance_distance / 100)) and (close <= support_level * (1 + support_resistance_distance / 100))

// Cross conditions variables
long_cross = ta.crossover(close, support_level) and not na(support_level)
short_cross = ta.crossunder(close, resistance_level) and not na(resistance_level)

// Entry conditions
long_condition = is_near_support and long_cross  // Buy when crossing support from below
short_condition = is_near_resistance and short_cross  // Sell when crossing resistance from above

// Order execution
if (long_condition)
    strategy.entry("Long", strategy.long)

if (short_condition)
    strategy.entry("Short", strategy.short)

// Stop Loss and Take Profit
if (strategy.opentrades > 0)
    if (strategy.position_size > 0)  // For long position
        avg_price_long = strategy.position_avg_price
        long_stop_level = avg_price_long * (1 - stop_loss_pct)
        long_take_profit_level = avg_price_long * (1 + take_profit_pct)
        strategy.exit("Exit Long", from_entry="Long", stop=long_stop_level, limit=long_take_profit_level)

    if (strategy.position_size < 0)  // For short position
        avg_price_short = strategy.position_avg_price
        short_stop_level = avg_price_short * (1 + stop_loss_pct)
        short_take_profit_level = avg_price_short * (1 - take_profit_pct)
        strategy.exit("Exit Short", from_entry="Short", stop=short_stop_level, limit=short_take_profit_level)

// Plotting support and resistance levels on the chart
plot(support_level, title="Support", color=color.green, linewidth=2, style=plot.style_line)
plot(resistance_level, title="Resistance", color=color.red, linewidth=2, style=plot.style_line)

// Adding labels to show pivot values
if (long_condition and not na(support_level))
    label.new(bar_index, low[pivot_length], str.tostring(low[pivot_length]), style=label.style_label_up, color=color.green, textcolor=color.white, size=size.small)

if (short_condition and not na(resistance_level))
    label.new(bar_index, high[pivot_length], str.tostring(high[pivot_length]), style=label.style_label_down, color=color.red, textcolor=color.white, size=size.small)