Количественная стратегия пересечения скользящих средних и стоп-лосса динамической волатильности

SMA RSI ATR RISK-TO-REWARD RATIO TREND FOLLOWING
Дата создания: 2025-04-02 11:08:39 Последнее изменение: 2025-04-02 11:08:39
Копировать: 2 Количество просмотров: 323
2
Подписаться
319
Подписчики

Количественная стратегия пересечения скользящих средних и стоп-лосса динамической волатильности Количественная стратегия пересечения скользящих средних и стоп-лосса динамической волатильности

Обзор

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

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

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

  1. Перекрестные сигналыСтратегия использует два простых скользящих средних ((SMA) - краткосрочную среднюю за 50 циклов и долгосрочную среднюю за 200 циклов. Когда краткосрочная средняя ниже долгосрочной средней и значение RSI больше 30, система вызывает многосигналы. Эта конструкция предназначена для идентификации потенциальных точек перехода тенденции.

  2. Фильтрация RSI: Стратегия использует 14-циклический RSI для фильтрации входа. В частности, перебор допускается только тогда, когда RSI выше 30, что помогает избежать слепого входа в глубокие зоны перепродажи. Хотя в коде сохранены рамки для условий курирования, в настоящее время в основном сосредоточены на перебор.

  3. Динамическая остановка ATR: Стратегия применяет 14-циклический показатель ATR для расчета динамического стоп-листа. Стоп-лист устанавливается как начальная цена минус ((ATR × кратность), где кратность ATR по умолчанию равна 1.0. Такой динамический стоп-механизм может адаптироваться к реальной волатильности рынка, предоставляя более свободное пространство для стоп-режима во время высокой волатильности и более тесное управление риском во время низкой волатильности.

  4. Отношение риска к прибыли: Стратегия реализует стоп-установку на основе рисково-возвратного соотношения (RRR) по умолчанию равна 1.5. Стоп-установка рассчитывается как входная цена плюс (входная цена - стоп-убыток) × рисково-возвратное соотношение (RRR), гарантируя, что потенциальная выгода от каждой сделки соотносится с риском.

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

  1. Тренд-трек и фильтрацияСтратегия не только использует пересечение движущихся средних для захвата изменений в тренде, но и фильтрует их по RSI, что уменьшает ошибочные сигналы и повышает качество входа.

  2. Динамическое управление рискамиОснованный на ATR механизм остановки является ярким примером этой стратегии, которая позволяет регулировать остановки в зависимости от динамики волатильности рынка, избегая проблем с преждевременным срабатыванием фиксированных остановок в условиях высокой волатильности, сохраняя при этом надлежащий контроль риска в период низкой волатильности.

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

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

  5. Интеграция управления капиталомСтратегия: По умолчанию используется процент от общей стоимости счета для управления позициями. Этот метод более гибкий, чем фиксированный, и может автоматически корректировать размер сделки с изменением размера счета.

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

  1. Риск изменения трендаХотя стратегия использует движущиеся средние для идентификации тенденции, она может привести к большим потерям в случае резкого рыночного переворота. Решение может заключаться в том, чтобы рассмотреть возможность введения более чувствительных краткосрочных индикаторов в качестве вспомогательного подтверждения или корректировать порог RSI, чтобы повысить чувствительность к перевороту.

  2. Параметр ЧувствительностьКлючевые параметры стратегии, такие как циклы SMA, порог RSI, кратность ATR и т. Д., оказывают значительное влияние на производительность. Различные рыночные условия могут требовать разных параметров, поэтому необходимо провести полное историческое отслеживание, чтобы найти оптимальную комбинацию параметров.

  3. Ограничения одностороннего рынкаВ настоящее время основное внимание уделяется многостратегическому трейдингу, который может оказаться неэффективным в условиях продолжающегося падения рынка. Решение заключается в активировании дисконтированных условий в коде и возможности двусторонней торговли.

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

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

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

  1. Интеграция многовременного анализаПримечание: существующие стратегии работают только в одном временном периоде. Можно рассмотреть возможность интеграции анализа в несколько временных периодов, например, использование более высоких временных периодов для определения направления основных тенденций, а затем поиск входных точек в более низких временных периодах для повышения точности входа.

  2. Совершенствование логики пустоты: активировать и оптимизировать логику дифференциации в стратегии, чтобы она была одинаково эффективной в условиях падения рынка. Это может потребовать корректировки RSI-порога дифференциации (например, дифференциации при RSI больше 70), а также установки различных параметров для различных направлений рынка.

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

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

  5. Добавление фильтрации по времени транзакции: Для рынков с заметной временной спецификой можно добавить временные фильтры, чтобы избежать торговли в периоды низкой ликвидности или высокой неопределенности.

  6. Механизм адаптации параметров: реализация механизма адаптации параметров, основанных на исторических колебаниях или других рыночных характеристиках, что позволяет стратегии автоматически оптимизировать параметры в соответствии с изменениями рыночной среды.

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

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

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

Для трейдеров, которые ищут среднесрочные и долгосрочные трендовые сделки, но при этом уделяют большое внимание контролю риска, эта стратегия предоставляет прочную отправную точку и имеет потенциал стать эффективной торговой системой с помощью индивидуальной настройки и постоянной оптимизации.

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

//@version=6
strategy(title=" VS-NTC> NASDQ100 Long MA+RSI+ATR", shorttitle="VS-NTC> Long NASDQ100 MA+RSI+ATR", overlay=true, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

// ————— Inputs —————
smaLenShort  = input.int(50,  title="Short SMA Length")
smaLenLong   = input.int(200, title="Long SMA Length")
rsiLen       = input.int(14,  title="RSI Length")
atrPeriod    = input.int(14,  title="ATR Period")
atrMult      = input.float(1.0, title="Stop-Loss ATR Multiplier", step=0.1)
rrRatio      = input.float(1.5, title="Risk-to-Reward Ratio",    step=0.1)

// ————— Indicator Calculations —————
smaShort = ta.sma(close, smaLenShort)
smaLong  = ta.sma(close, smaLenLong)
rsiVal   = ta.rsi(close, rsiLen)
atrVal   = ta.atr(atrPeriod)

// ————— Entry Conditions —————
// Long Condition: 50SMA > 200SMA and RSI < 70
longCondition = (smaShort < smaLong) and (rsiVal > 30)
// Short Condition: 50SMA < 200SMA and RSI > 30 (example: avoid oversold)
// Or use RSI > 70 to short if the market is overbought.
shortCondition = false
// shortCondition = (smaShort > smaLong) and (rsiVal < 35)

// ————— Entry Logic —————
if longCondition
    strategy.entry(id="Long", direction=strategy.long)

if shortCondition
    strategy.entry(id="Short", direction=strategy.short)

// ————— Stop-Loss & Take-Profit Calculation —————
var float stopPrice       = na
var float takeProfitPrice = na

// If we have a position open, we determine SL & TP differently for Long or Short.
if strategy.position_size > 0
    // We are in a Long trade
    stopPrice       := strategy.position_avg_price - (atrVal * atrMult)
    takeProfitPrice := strategy.position_avg_price + ((strategy.position_avg_price - stopPrice) * rrRatio)

    strategy.exit("Exit SL/TP", stop=stopPrice, limit=takeProfitPrice)
else if strategy.position_size < 0
    // We are in a Short trade
    stopPrice       := strategy.position_avg_price + (atrVal * atrMult)
    // For short, the distance from entry to stop is (stopPrice - entry)
    // So the take-profit is entry - that same distance times RR
    takeProfitPrice := strategy.position_avg_price - ((stopPrice - strategy.position_avg_price) * rrRatio)

    strategy.exit("Exit SL/TP", stop=stopPrice, limit=takeProfitPrice)
else
    // No open position → reset plots to na
    stopPrice       := na
    takeProfitPrice := na

// ————— Plot the Planned Stop-Loss & Take-Profit —————
plot(stopPrice,       title="Stop Loss",   color=color.red,   linewidth=2)
plot(takeProfitPrice, title="Take Profit", color=color.green, linewidth=2)


// ————— Label Each Closed Trade (Wins & Losses) —————
var int lastClosedTradeCount = 0
currentClosedCount = strategy.closedtrades

// If there's at least one new closed trade, label it
if currentClosedCount > lastClosedTradeCount
    newTradeIndex = currentClosedCount - 1

    tradeProfit  = strategy.closedtrades.profit(newTradeIndex)
    exitBarIndex = strategy.closedtrades.exit_bar_index(newTradeIndex)
    exitPrice    = strategy.closedtrades.exit_price(newTradeIndex)

    // Win label if profit > 0
    if tradeProfit > 0
        labelText  = "Win: " + str.tostring(tradeProfit)
        labelStyle = label.style_label_up
        labelColor = color.new(color.green, 0)
        label.new(exitBarIndex, exitPrice, text=labelText, style=labelStyle, color=labelColor, size=size.tiny)

    // Loss label if profit < 0
    if tradeProfit < 0
        labelText  = "Loss: " + str.tostring(tradeProfit)
        labelStyle = label.style_label_down
        labelColor = color.new(color.red, 0)
        label.new(exitBarIndex, exitPrice, text=labelText, style=labelStyle, color=labelColor, size=size.tiny)

    lastClosedTradeCount := currentClosedCount