Динамическая стратегия торговли фьючерсами с несколькими техническими индикаторами

EMA ATR FVG BOS HTF ORDER BLOCK Liquidity Sweep
Дата создания: 2025-04-02 09:41:48 Последнее изменение: 2025-04-02 09:41:48
Копировать: 0 Количество просмотров: 381
2
Подписаться
319
Подписчики

Динамическая стратегия торговли фьючерсами с несколькими техническими индикаторами Динамическая стратегия торговли фьючерсами с несколькими техническими индикаторами

Обзор стратегии

Эта стратегия является продвинутой системой торговли фьючерсами, которая объединяет несколько технических условий и анализ более высоких временных рамок для выявления высоковероятных торговых возможностей. Эта стратегия использует метод, основанный на объединении нескольких условий, требующих одновременного удовлетворения нескольких технических условий, чтобы войти в сделку. Она объединяет несколько передовых технических концепций, включая пробелы справедливой стоимости (FVG), блоки заказов (Order Blocks), сканирование ликвидности (Liquidity Sweeps) и структурные прорывы (BOS), используя при этом индикаторы для определения направления тенденции в разных временных периодах.

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

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

  1. Пробел в справедливой стоимости (FVG)- признается, когда существенная разница в цене между двумя кубиками, что указывает на то, что на рынке может быть незаполненное пространство.
  2. Блоки заказов- Это ключевые зоны, в которых происходит обратный курс, обычно проявляющийся в виде сильных отклонений, которые затем становятся зонами поддержки или сопротивления.
  3. Мобильность сканирования- выявление случаев, когда рынок пересекает предыдущие высокие или низкие точки, а затем реверсирует, что обычно указывает на то, что крупные учреждения собирают ликвидность;
  4. Структурный прорыв (BOS)- возникает, когда цена прорывает предыдущую структуру, образуя более высокие высокие точки или более низкие низкие точки.
  5. Подтверждение высоких временных циклов- использование 15-минутных и 60-минутных временных периодов для определения направления общей тенденции.

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

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

Для прибыльного конца, стратегия использует методы сбора прибыли, прибыльные позиции 50% при достижении прибыли, эквивалентной риску ((1R), а остальные остановки позиции перемещаются в защищенную позицию, создавая возможность для безрисковой торговли. Кроме того, есть механизм выхода на основе времени, который автоматически закрывается, если сделка не будет двигаться в благоприятном направлении в течение заданного времени ((по умолчанию 30 минут).

Кроме того, стратегия включает в себя функцию управления счетом, которая автоматически выходит из всех позиций, когда прибыль счета достигает заданной цели (3000 долларов США) или вызывает стоп-стоп (прибыль счета превышает 2500 долларов США, после чего начинается отслеживание).

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

После глубокого анализа кода мы можем сделать вывод о следующих явных преимуществах:

  1. Система многократного подтверждения- Для вступления в систему требуется одновременно выполнить несколько технических условий, что эффективно уменьшает количество ложных сигналов и повышает качество транзакций.
  2. Умный риск-менеджмент- использование динамического стоп-интервью, основанного на ATR, более адаптирующегося к изменениям волатильности рынка, чем фиксированный точечный или процентный стоп-интервью;
  3. Фильтр высоких временных циклов- использование более высоких временных циклов в направлении тренда, торгуя только в направлении тренда, избегая обратной торговли;
  4. Стратегия сегментированной прибыли- Защита части прибыли, обеспеченная с помощью выигрыша в рассрочку и перемещения стоп-лосса к залоговой позиции, обеспечивает безрисковую возможность для оставшихся позиций.
  5. Механизм выхода на основе времени- автоматический выход из недействительных сделок, чтобы избежать длительного задержки средств в неимущественных сделках;
  6. Общее управление счетами- Защита прибыльности счетов в целом и обеспечение надежного управления средствами путем установления целевых показателей прибыли и сдерживания убытков.
  7. Высокая степень адаптации- высокая гибкость, обеспечиваемая несколькими параметрами, которые могут быть скорректированы в зависимости от различных рыночных условий и стилей торговли;
  8. Интеграция профессионально-технических показателей- сочетание различных высокотехнологичных аналитических концепций, которые обычно используются только профессиональными трейдерами.

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

Несмотря на то, что стратегия была хорошо продумана, она содержит в себе ряд потенциальных рисков, в том числе:

  1. Риски оптимизации параметров- Стратегия зависит от множества параметров, и если ее переоптимизация может привести к перенастройке, она будет плохо работать в будущих рыночных условиях. Решение заключается в использовании достаточно длинных тестовых циклов и тестировании вперед.
  2. Зависимость от рыночной среды- Стратегия может хорошо работать в трендовых рынках, но может генерировать больше ложных сигналов в промежуточных рыночных потрясениях. Решение заключается в добавлении фильтров рыночных условий, корректировке частоты торговли или полной остановке торговли, когда она идентифицируется как потрясающая.
  3. Исполнение риска скольжения- Во время высокой волатильности входные и выходные цены могут сильно отличаться от ожиданий, что влияет на эффективность стратегии. Решение заключается в моделировании реальных точек скольжения в обратном отчете и использовании в реальной торговле лимитных цен вместо рыночных цен.
  4. Риск технических сбоев- Автоматизированные торговые системы могут столкнуться с техническими сбоями или сбоями в сети. Решением является создание резервных систем и механизмов ручного вмешательства.
  5. Управление сложностью- Сложность стратегии может привести к тому, что будет трудно диагностировать проблемы или понять, почему некоторые сделки терпят неудачу. Решение состоит в том, чтобы вести подробный журнал сделок и регулярно анализировать эффективность стратегии.
  6. Риск ликвидности рынка- В определенных рыночных условиях, например, перед важными новостными публикациями, ликвидность может быстро снизиться, что приводит к более крупным провалам или невозможности выхода из позиции. Решение заключается в том, чтобы избежать торговли во время публикации важных экономических данных или уменьшить размер позиции в эти периоды.

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

Основываясь на анализе кода, можно выделить несколько возможных направлений оптимизации:

  1. Усиление идентификации тенденций- текущая стратегия использует простую пересечение EMA для определения тенденции, можно рассмотреть возможность добавления других трендовых показателей, таких как ADX (индекс среднего направления), для подтверждения силы тенденции, поскольку сильные трендовые рынки обычно предоставляют лучшие возможности для торговли.
  2. Состояние рынка адаптируется- Добавление механизма идентификации состояния рынка для автоматической корректировки параметров стратегии в различных рыночных условиях (тенденции, диапазоны, высокая волатильность, низкая волатильность). Это позволяет стратегии быть более гибкими и адаптироваться к различным рыночным условиям.
  3. Оптимизация времени поступления- Подумайте о добавлении динамических показателей, таких как RSI или случайные показатели, чтобы убедиться, что вы входите в направлении тренда, но также избегаете входа в случае чрезмерного перекупа или перепродажи, что снижает риск обратного хода.
  4. Улучшение стратегии получения прибыли- текущая фиксированная прибыль 1R может быть слишком консервативной или слишком радикальной, можно подумать о динамическом изменении целевой прибыли на основе волатильности или уровня поддержки/сопротивления, и установить более отдаленную цель при большей волатильности.
  5. Управление рисками- внедрение механизма динамического регулирования размера позиции, который автоматически регулирует рисковые отверстия в зависимости от недавней стратегии и волатильности рынка, увеличивая риск при хорошей стратегии и уменьшая риск при плохой.
  6. Добавить фильтр времени суток- Фьючерсные рынки имеют различные характеристики в разные периоды времени, добавление временных фильтров позволяет избежать периодов низкой ликвидности или отсутствия направления.
  7. Интеграция показателей рыночных настроений- Добавление индикаторов рыночной сентиментальности, таких как VIX, для корректировки параметров стратегии или приостановки торговли при экстремальных эмоциях.
  8. Оптимизация эффективности кода- В текущем коде имеются некоторые циклические операции, которые могут повлиять на эффективность выполнения, особенно на более короткие временные рамки. Оптимизация этих циклов может повысить скорость отклика стратегии.

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

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

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

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

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

// @version=5
strategy("NQ Futures Trading Strategy", overlay=true, initial_capital=50000, default_qty_type=strategy.cash, default_qty_value=5000)

// ==========================================
// Parameters
// ==========================================

// Account Parameters
accountSize = 50000
profitGoal = 3000
trailingThreshold = 2500
stopsTrailing = 52650

// Trading Parameters
atrLength = input.int(14, "ATR Period", minval=1)
atrMultiplier = input.float(1.5, "ATR Multiplier for SL", minval=0.5, maxval=3.0, step=0.1)
timeoutPeriod = input.int(30, "Exit after X minutes if trade doesn't move favorably", minval=5, maxval=120)

// FVG (Fair Value Gap) Parameters
fvgLength = input.int(5, "FVG Look-back Period", minval=2, maxval=20)
fvgThreshold = input.float(0.1, "FVG Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Order Block Parameters
obLength = input.int(5, "Order Block Look-back Period", minval=2, maxval=20)
obThreshold = input.float(0.1, "Order Block Size Threshold (%)", minval=0.05, maxval=1.0, step=0.05) * 0.01

// Liquidity Sweep Parameters
sweepLength = input.int(5, "Liquidity Sweep Look-back Period", minval=2, maxval=20)
sweepThreshold = input.float(0.05, "Sweep Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Break of Structure Parameters
bosLength = input.int(5, "BOS Look-back Period", minval=2, maxval=20)
bosThreshold = input.float(0.05, "BOS Size Threshold (%)", minval=0.01, maxval=0.5, step=0.01) * 0.01

// Debug Mode
debugMode = input.bool(false, "Debug Mode (more signals)")

// Higher Timeframe Trend Parameters
htfPeriod1 = input.timeframe("15", "First Higher Timeframe")
htfPeriod2 = input.timeframe("60", "Second Higher Timeframe")

// ==========================================
// Indicators & Calculations
// ==========================================

// ATR Calculation
atr = ta.atr(atrLength)

// Higher Timeframe EMAs for Trend Determination
htf1_ema20 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf1_ema50 = request.security(syminfo.tickerid, htfPeriod1, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema20 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 20), barmerge.gaps_off, barmerge.lookahead_off)
htf2_ema50 = request.security(syminfo.tickerid, htfPeriod2, ta.ema(close, 50), barmerge.gaps_off, barmerge.lookahead_off)

// Higher Timeframe Trend
htf1_bullish = htf1_ema20 > htf1_ema50
htf1_bearish = htf1_ema20 < htf1_ema50
htf2_bullish = htf2_ema20 > htf2_ema50
htf2_bearish = htf2_ema20 < htf2_ema50

// ==========================================
// Entry Conditions
// ==========================================

// 1. Fair Value Gap (FVG)
bullishFVG = false
bearishFVG = false

for i = 1 to fvgLength
    if low[i] > high[i+2] and (low[i] - high[i+2]) / high[i+2] > fvgThreshold
        bullishFVG := true
    if high[i] < low[i+2] and (low[i+2] - high[i]) / high[i] > fvgThreshold
        bearishFVG := true

// 2. Inverse Fair Value Gap
inverseBullishFVG = false
inverseBearishFVG = false

for i = 1 to fvgLength
    if high[i+1] < low[i+2] and close[i] > open[i] and close[i] > high[i+1]
        inverseBullishFVG := true
    if low[i+1] > high[i+2] and close[i] < open[i] and close[i] < low[i+1]
        inverseBearishFVG := true

// 3. Order Block / Breaker Block
bullishOrderBlock = false
bearishOrderBlock = false

for i = 1 to obLength
    if close[i+1] < open[i+1] and (open[i+1] - close[i+1]) / close[i+1] > obThreshold and close[i] > open[i]
        bullishOrderBlock := true
    if close[i+1] > open[i+1] and (close[i+1] - open[i+1]) / open[i+1] > obThreshold and close[i] < open[i]
        bearishOrderBlock := true

// 4. Liquidity Sweep
bullishSweep = false
bearishSweep = false

lowestLow = ta.lowest(low, sweepLength+1)
highestHigh = ta.highest(high, sweepLength+1)

if low[1] < lowestLow[2] and close > open
    bullishSweep := true
if high[1] > highestHigh[2] and close < open
    bearishSweep := true

// 5. Break of Structure (BOS)
bullishBOS = false
bearishBOS = false

prevHigh = high[2]
prevLow = low[2]

if high > prevHigh and low[1] < low[2]
    bullishBOS := true
if low < prevLow and high[1] > high[2]
    bearishBOS := true

// Simpler version for debug mode
if debugMode
    bullishBOS := close > open and close > close[1]
    bearishBOS := close < open and close < close[1]

// ==========================================
// Signal Generation
// ==========================================

// Count valid entry conditions
bullishConditions = bullishFVG ? 1 : 0
bullishConditions := bullishConditions + (inverseBullishFVG ? 1 : 0)
bullishConditions := bullishConditions + (bullishOrderBlock ? 1 : 0)
bullishConditions := bullishConditions + (bullishSweep ? 1 : 0)

bearishConditions = bearishFVG ? 1 : 0
bearishConditions := bearishConditions + (inverseBearishFVG ? 1 : 0)
bearishConditions := bearishConditions + (bearishOrderBlock ? 1 : 0)
bearishConditions := bearishConditions + (bearishSweep ? 1 : 0)

// Entry signals (need at least 2 conditions + BOS confirmation)
// In debug mode, require only 1 condition
minConditions = debugMode ? 1 : 2
longSignal = bullishConditions >= minConditions and bullishBOS and (htf1_bullish or htf2_bullish)
shortSignal = bearishConditions >= minConditions and bearishBOS and (htf1_bearish or htf2_bearish)

// Debug mode override for testing
if debugMode
    longSignal := longSignal or (bullishBOS and htf1_bullish)
    shortSignal := shortSignal or (bearishBOS and htf1_bearish)

// ==========================================
// Risk Management
// ==========================================

// Calculate dynamic stop loss based on ATR
longStopDistance = atr * atrMultiplier
shortStopDistance = atr * atrMultiplier

// Default fixed values for testing
if debugMode
    longStopDistance := close * 0.01  // 1% stop
    shortStopDistance := close * 0.01  // 1% stop

// Calculate position size based on risk
nqPointValue = 20  // Each point is $20 for NQ
longPositionSize = math.floor(2000 / (longStopDistance * nqPointValue))
shortPositionSize = math.floor(2000 / (shortStopDistance * nqPointValue))

// Ensure at least 1 contract
longPositionSize := math.max(longPositionSize, 1)
shortPositionSize := math.max(shortPositionSize, 1)

// Variables to track entry time
var int entryTime = 0
var float equityCurve = accountSize

// ==========================================
// Strategy Execution
// ==========================================

// Make sure we don't get multiple signals on the same bar
var longEnteredThisBar = false
var shortEnteredThisBar = false

longEnteredThisBar := false
shortEnteredThisBar := false

// Entry conditions
if longSignal and not longEnteredThisBar and strategy.position_size <= 0
    strategy.close_all()
    strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEnteredThisBar := true
    entryTime := time

if shortSignal and not shortEnteredThisBar and strategy.position_size >= 0
    strategy.close_all()
    strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEnteredThisBar := true
    entryTime := time

// Take profit and stop loss orders
if strategy.position_size > 0
    stopPrice = strategy.position_avg_price - longStopDistance
    takeProfitPrice1 = strategy.position_avg_price + longStopDistance
    strategy.exit("Long TP1", "Long", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if high >= takeProfitPrice1
        strategy.exit("Long BE", "Long", stop=strategy.position_avg_price)

if strategy.position_size < 0
    stopPrice = strategy.position_avg_price + shortStopDistance
    takeProfitPrice1 = strategy.position_avg_price - shortStopDistance
    strategy.exit("Short TP1", "Short", qty_percent=50, limit=takeProfitPrice1, stop=stopPrice)
    
    // Move stop to breakeven after 1R move
    if low <= takeProfitPrice1
        strategy.exit("Short BE", "Short", stop=strategy.position_avg_price)

// Time-based exit
if strategy.position_size != 0
    currentTime = time
    if (currentTime - entryTime) >= timeoutPeriod * 60000  // Convert minutes to milliseconds
        strategy.close_all(comment="Time Exit")

// ==========================================
// Trailing Stop for Account Management
// ==========================================

// Update equity curve
equityCurve := strategy.equity

// Check if profit target is reached or trailing stop is hit
if strategy.equity >= accountSize + profitGoal
    strategy.close_all(comment="Profit Goal")

if strategy.equity >= accountSize + trailingThreshold
    trailingStop = math.max(accountSize, strategy.equity - trailingThreshold)
    if strategy.equity <= trailingStop
        strategy.close_all(comment="Trailing Stop")

// Stop trailing if account reaches the stop trailing threshold
if strategy.equity >= stopsTrailing
    strategy.close_all(comment="Stop Trailing")

// ==========================================
// Plotting
// ==========================================

// Plot entry conditions
plotshape(longSignal, title="Long Signal", location=location.belowbar, color=color.green, style=shape.triangleup, size=size.small)
plotshape(shortSignal, title="Short Signal", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small)

// Plot current position
bgcolor(strategy.position_size > 0 ? color.new(color.green, 90) : strategy.position_size < 0 ? color.new(color.red, 90) : na)

// Alert conditions
alertcondition(longSignal, title="Long Entry Signal", message="NQ LONG ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(shortSignal, title="Short Entry Signal", message="NQ SHORT ENTRY: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and high >= strategy.position_avg_price + longStopDistance, title="Long Take Profit", message="NQ LONG TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and low <= strategy.position_avg_price - shortStopDistance, title="Short Take Profit", message="NQ SHORT TP: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size > 0 and low <= strategy.position_avg_price - longStopDistance, title="Long Stop Loss", message="NQ LONG SL: {{ticker}}, Price: {{close}}")
alertcondition(strategy.position_size < 0 and high >= strategy.position_avg_price + shortStopDistance, title="Short Stop Loss", message="NQ SHORT SL: {{ticker}}, Price: {{close}}")