
Динамическая система отслеживания убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков с отслеживанием убытков
Основные принципы этой стратегии основаны на взаимодействии трех ключевых элементов: точный вход, оптимальное время и управление состоянием.
Система приема: Стратегия ищет возможности для обратного хода, динамически идентифицируя ключевые ценовые уровни. Она использует конфигурируемые периоды отсчета для вычисления уровней поддержки и сопротивления и запускает входные сигналы, когда цена взаимодействует с этими ключевыми зонами. Условия входа включают взаимодействие цены с уровнем поддержки / сопротивления, подтверждение объема сделки и подтверждение опционального фильтра тренда.
Система фильтрации времени: Стратегия реализует полную систему фильтрации времени, позволяющую трейдерам определять оптимальные торговые периоды. Это включает в себя:
Система управления рисками: Стратегия использует трехуровневый подход к управлению рисками:
При глубоком анализе кода, эта стратегия имеет следующие преимущества:
Комплексный входный сигнал: в сочетании с ценовым поведением, подтверждением объемов сделок и согласованностью тенденций повышает надежность торговых сигналов. Система ищет высоковероятные переломные точки вблизи ключевых уровней поддержки и сопротивления, снижая риск ложных прорывов.
Гибкая система фильтрации времени: позволяет трейдерам сосредоточиться на оптимальных торговых часах, избегая низкой ликвидности или высокой волатильности рынка. Это помогает повысить эффективность торговли и уменьшить вероятность торговли в неблагоприятных рыночных условиях.
Расширенные возможности управления рискамиДвижущаяся система отслеживания стоп-убытков автоматически корректируется в соответствии с рыночными колебаниями, помогая защитить прибыль и сохранить выигрышные позиции. Многоуровневые цели стоп-убытков и частичные опции плавающего положения позволяют блокировать прибыль на разных уровнях цен.
Полный визуальный отзывСистема предоставляет подробные элементы графиков и диаграммы в режиме реального времени, которые помогают трейдерам визуально понять состояние рынка и стратегическую эффективность. Выделенное отображение входных зон, динамическая визуализация линий риска/возмещения и отслеживание стоп-убытков позволяют более прозрачно принимать торговые решения.
Высокая настройкаОт ключевых параметров стратегии до возможностей управления фильтрацией времени и управления рисками, стратегия предлагает широкий спектр возможностей настройки, которые могут быть адаптированы к различным стилям торговли и рыночным условиям.
Несмотря на множество преимуществ этой стратегии, она также несет в себе ряд потенциальных рисков:
Риски оптимизации параметров: Стратегия зависит от множества параметров, таких как период обратного отсчета, ATR-множитель и параметры трендовых фильтров. Эти параметры требуют тщательной оптимизации и регулярной корректировки, чтобы адаптироваться к различным рыночным условиям. Чрезмерная оптимизация параметров может привести к перенастройке и плохой производительности в будущих рыночных условиях.
Чувствительность к рыночным условиямВ условиях экстремальных рынков цены могут быстро пробиться через критические уровни, что приводит к появлению стоп-ложа.
Фильтрация по времениХотя временная фильтрация помогает избежать неблагоприятных торговых периодов, она также может привести к тому, что некоторые высококачественные торговые возможности будут упущены. Рынки не всегда следуют за заданной временной моделью, особенно во время важных событий или внезапных новостей.
Отслеживание стоп-ловушекВ условиях рыночной нестабильности динамические стоп-стопы могут быть задействованы преждевременно, что приводит к досрочному окончанию сделок, которые могли бы быть прибыльными. Различные настройки стоп-стоп-стоп (консервативные, сбалансированные, радикальные) действуют по-разному в различных рыночных условиях.
Конфликт сигналовСмешанные сигналы могут возникать, когда цена приближается к нескольким уровням поддержки и сопротивления, или когда временная фильтрация конфликтует с входными сигналами. Это требует дополнительного суждения или более сложных правил принятия решений.
Основываясь на анализе кода, можно сделать следующее:
Адаптационные параметрыВнедрение механизма автоматической корректировки ключевых параметров, таких как период ретроспекции и кратность ATR, в зависимости от недавней волатильности рынка и результатов торгов. Это может помочь стратегии лучше адаптироваться к различным рыночным условиям без ручного вмешательства.
Усиление анализа структуры рынкаИнтеграция более сложных методов идентификации ценовой структуры, таких как определение более высоких уровней зоны поддержки и сопротивления, идентификация трендовых каналов или ценовых форм. Это может повысить качество и надежность входных сигналов.
Оптимизация логики фильтрации времени: Найти оптимальные торговые часы для конкретного рынка с помощью анализа данных и автоматически корректировать окно торговых часов в зависимости от исторической производительности… … … … … … . .
Улучшение механизма управления рисками: Разработка более интеллектуальной системы управления позициями, динамически корректирующей размер позиций в зависимости от исторической волатильности, текущих рыночных условий и эффективности стратегии.
Интегрированная модель машинного обученияИспользование алгоритмов машинного обучения для прогнозирования надежности поддержки и сопротивления или оценки вероятности успеха входящего сигнала в определенных рыночных условиях. Это может помочь отфильтровать потенциальные низкокачественные торговые сигналы.
Система стоп-трейдинга с динамической временной фильтрацией поддержки и сопротивления является полнофункциональной торговой стратегией, которая сочетает в себе точные входные сигналы, интеллектуальную временную фильтрацию и адаптивное управление рисками. Она повышает качество торговли, ищу высоковероятные возможности поворота в ключевых позициях поддержки и сопротивления, используя при этом временную фильтрацию и подтверждение сделки.
Основными преимуществами этой стратегии являются ее всесторонняя система фильтрации времени, динамическая технология отслеживания стоп-лосс и высоковизуальный пользовательский интерфейс. Вместе эти функции создают мощный и гибкий торговый инструмент, подходящий для различных рыночных условий и стилей торговли.
Однако, чтобы полностью реализовать потенциал стратегии, трейдеру необходимо тщательно оптимизировать параметры, понимать их характеристики в различных рыночных условиях, и, возможно, при необходимости производить индивидуальные коррективы в соответствии с конкретными рынками и индивидуальными торговыми целями. Реализация рекомендованных мер оптимизации может дополнительно повысить производительность и грубость стратегии, предоставляя трейдеру более надежные инструменты для анализа рынка и исполнения сделок.
/*backtest
start: 2025-08-13 00:00:00
end: 2025-08-20 00:00:00
period: 10m
basePeriod: 10m
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT","balance":5000}]
*/
//@version=5
strategy("FlowStateTrader", overlay=true)
// Input Parameters
lookbackPeriod = input.int(20, "Lookback Period for Key Levels", minval=5, maxval=100)
atrPeriod = input.int(14, "ATR Period", minval=5, maxval=50)
atrMultiplierSL = input.float(1.5, "SL ATR Multiplier", minval=0.5, maxval=5.0, step=0.1)
atrMultiplierTP1 = input.float(1.5, "TP1 ATR Multiplier", minval=0.5, maxval=5.0, step=0.1)
atrMultiplierTP2 = input.float(2.0, "TP2 ATR Multiplier", minval=0.5, maxval=5.0, step=0.1)
rewardToRisk = input.float(2.0, "Reward to Risk Ratio", minval=1.0, maxval=5.0, step=0.1)
// Trend Filter Settings
enableTrendFilter = input.bool(true, "Enable Trend Filter")
trendMAPeriod = input.int(20, "Trend MA Period", minval=5, maxval=200)
trendMAType = input.string("EMA", "Trend MA Type", options=["EMA", "SMA"])
// TIME FILTER SETTINGS
enableTimeFilter = input.bool(false, "Enable Time-Based Filter", tooltip="Filter trades based on specific time windows")
// 12-hour format time inputs
startHour12 = input.int(9, "Start Hour (1-12)", minval=1, maxval=12, tooltip="Trading start hour in 12-hour format")
startAMPM = input.string("AM", "Start AM/PM", options=["AM", "PM"])
endHour12 = input.int(4, "End Hour (1-12)", minval=1, maxval=12, tooltip="Trading end hour in 12-hour format")
endAMPM = input.string("PM", "End AM/PM", options=["AM", "PM"])
// Timezone selection
timeZone = input.string("UTC", "Time Zone", options=["UTC", "EST", "PST", "CST"], tooltip="Time zone for trading hours")
// Additional controls
avoidLunchHour = input.bool(true, "Avoid Lunch Hour (12:00-1:00 PM)", tooltip="Skip trading during typical lunch break")
weekendsOnly = input.bool(false, "Weekends Only", tooltip="Only trade on weekends")
weekdaysOnly = input.bool(false, "Weekdays Only", tooltip="Only trade on weekdays")
// Strategy Settings
entryQty = input.int(10, "Entry Quantity (Contracts)", minval=1, maxval=1000)
enablePartialClose = input.bool(true, "Enable Partial Close at TP1")
partialCloseQty = input.int(1, "Contracts to Close at TP1", minval=1, maxval=100)
enableAlerts = input.bool(true, "Enable Strategy Alerts")
// Dashboard Settings
dashboardSize = input.string("Medium", "Dashboard Size", options=["Small", "Medium", "Large"], tooltip="Control the size of the information dashboard")
enableScorecard = input.bool(true, "Enable Performance Scorecard", tooltip="Show performance metrics in lower right corner")
// Trailing Stop Settings
enableTrailingStop = input.bool(true, "Enable Trailing Stop")
trailMode = input.string("Balanced", "Trailing Stop Mode", options=["Conservative", "Balanced", "Aggressive"], tooltip="Conservative: Protect more profit | Balanced: Good middle ground | Aggressive: Let winners run longer")
// Set trailing parameters based on mode
trailActivationMultiplier = trailMode == "Conservative" ? 0.8 : trailMode == "Balanced" ? 1.0 : 1.2
trailDistanceMultiplier = trailMode == "Conservative" ? 0.6 : trailMode == "Balanced" ? 0.8 : 1.0
// TIME FILTER FUNCTIONS
// Convert 12-hour format to 24-hour format
convertTo24Hour(hour12, ampm) =>
var int hour24 = na
if ampm == "AM"
hour24 := hour12 == 12 ? 0 : hour12
else // PM
hour24 := hour12 == 12 ? 12 : hour12 + 12
hour24
// Convert timezone to UTC offset
getUTCOffset(tz) =>
var int offset = na
if tz == "UTC"
offset := 0
else if tz == "EST"
offset := -5 // EST is UTC-5
else if tz == "CST"
offset := -6 // CST is UTC-6
else if tz == "PST"
offset := -8 // PST is UTC-8
offset
getCurrentHour() =>
hour(time, "UTC")
getCurrentDayOfWeek() =>
dayofweek(time)
isWeekend() =>
currentDay = getCurrentDayOfWeek()
currentDay == dayofweek.saturday or currentDay == dayofweek.sunday
isWeekday() =>
not isWeekend()
isInTradingWindow() =>
if not enableTimeFilter
true
else
// Convert 12-hour inputs to 24-hour UTC
startHour24 = convertTo24Hour(startHour12, startAMPM)
endHour24 = convertTo24Hour(endHour12, endAMPM)
utcOffset = getUTCOffset(timeZone)
// Convert local time to UTC
startHourUTC = (startHour24 - utcOffset + 24) % 24
endHourUTC = (endHour24 - utcOffset + 24) % 24
currentHour = getCurrentHour()
// Handle trading window logic
var bool inWindow = false
// Handle same-day window vs overnight window
if startHourUTC <= endHourUTC
// Same day window (e.g., 9 AM to 4 PM)
inWindow := currentHour >= startHourUTC and currentHour <= endHourUTC
else
// Overnight window (e.g., 10 PM to 6 AM)
inWindow := currentHour >= startHourUTC or currentHour <= endHourUTC
// Apply day-of-week filters
if weekendsOnly and not isWeekend()
inWindow := false
if weekdaysOnly and not isWeekday()
inWindow := false
// Apply lunch hour filter (12:00-1:00 PM in selected timezone)
if avoidLunchHour and inWindow
lunchStart24 = 12 // 12 PM
lunchEnd24 = 13 // 1 PM
lunchStartUTC = (lunchStart24 - utcOffset + 24) % 24
lunchEndUTC = (lunchEnd24 - utcOffset + 24) % 24
// Check if current hour falls in lunch period
if lunchStartUTC <= lunchEndUTC
// Normal case: lunch doesn't cross midnight
if currentHour >= lunchStartUTC and currentHour < lunchEndUTC
inWindow := false
else
// Edge case: lunch period crosses midnight (shouldn't happen but safety check)
if currentHour >= lunchStartUTC or currentHour < lunchEndUTC
inWindow := false
inWindow
// Combined time filter
isGoodTradingTime() =>
isInTradingWindow()
// ATR and Volume Calculation
atr = ta.atr(atrPeriod)
volumeSMA = ta.sma(volume, atrPeriod)
// Trend Filter
trendMA = enableTrendFilter ? (trendMAType == "EMA" ? ta.ema(close, trendMAPeriod) : ta.sma(close, trendMAPeriod)) : na
isBullishTrend = enableTrendFilter ? close > trendMA : true
isBearishTrend = enableTrendFilter ? close < trendMA : true
// Key Levels Identification (Support & Resistance Zones)
support = ta.lowest(low, lookbackPeriod)
resistance = ta.highest(high, lookbackPeriod)
supportBuffer = support - atr * 0.5
resistanceBuffer = resistance + atr * 0.5
// Define Entry Conditions (with time filter)
isBullishEntry = (close > supportBuffer) and (low <= support) and (volume > volumeSMA) and isBullishTrend and isGoodTradingTime()
isBearishEntry = (close < resistanceBuffer) and (high >= resistance) and (volume > volumeSMA) and isBearishTrend and isGoodTradingTime()
// Calculate Stop Loss and Take Profit Levels
bullishSL = support - atr * atrMultiplierSL
bullishTP1 = support + atr * rewardToRisk * atrMultiplierTP1
bullishTP2 = support + atr * rewardToRisk * atrMultiplierTP2
bearishSL = resistance + atr * atrMultiplierSL
bearishTP1 = resistance - atr * rewardToRisk * atrMultiplierTP1
bearishTP2 = resistance - atr * rewardToRisk * atrMultiplierTP2
// Strategy Position Management
var float longEntryPrice = na
var float shortEntryPrice = na
var bool tp1HitLong = false
var bool tp1HitShort = false
// Trailing Stop Variables
var float longTrailStop = na
var float shortTrailStop = na
var bool longTrailActive = false
var bool shortTrailActive = false
// Calculate position sizing
finalQty = entryQty
// Long Entry
if isBullishEntry and strategy.position_size == 0
strategy.entry("Long", strategy.long, qty=finalQty)
longEntryPrice := close
tp1HitLong := false
// Reset trailing stop variables
longTrailStop := na
longTrailActive := false
if enableAlerts
alert("Long Entry Signal at " + str.tostring(close) + " - Qty: " + str.tostring(finalQty), alert.freq_once_per_bar)
// Short Entry
if isBearishEntry and strategy.position_size == 0
strategy.entry("Short", strategy.short, qty=finalQty)
shortEntryPrice := close
tp1HitShort := false
// Reset trailing stop variables
shortTrailStop := na
shortTrailActive := false
if enableAlerts
alert("Short Entry Signal at " + str.tostring(close) + " - Qty: " + str.tostring(finalQty), alert.freq_once_per_bar)
// Long Position Management
if strategy.position_size > 0
// Calculate current profit
currentProfit = close - strategy.position_avg_price
profitInATR = currentProfit / atr
// Trailing Stop Logic
if enableTrailingStop and profitInATR >= trailActivationMultiplier
// Activate trailing stop
if not longTrailActive
longTrailActive := true
longTrailStop := close - atr * trailDistanceMultiplier
else
// Update trailing stop (only move up, never down)
newTrailStop = close - atr * trailDistanceMultiplier
longTrailStop := math.max(longTrailStop, newTrailStop)
// Determine which stop loss to use
effectiveStopLoss = enableTrailingStop and longTrailActive ? longTrailStop : bullishSL
// Stop Loss (either original or trailing)
strategy.exit("Long SL", "Long", stop=effectiveStopLoss)
// Take Profit 1 (Partial Close by Contracts)
if enablePartialClose and not tp1HitLong and high >= bullishTP1 and strategy.position_size >= partialCloseQty
strategy.close("Long", qty=partialCloseQty, comment="Long TP1", immediately=true)
tp1HitLong := true
// Take Profit 2 (Close Remaining Position) or Full Close if Partial is Disabled
if (enablePartialClose and tp1HitLong and high >= bullishTP2) or (not enablePartialClose and high >= bullishTP1)
strategy.close("Long", comment=enablePartialClose ? "Long TP2" : "Long TP1", immediately=true)
// Short Position Management
if strategy.position_size < 0
// Calculate current profit (for shorts, profit when price goes down)
currentProfit = strategy.position_avg_price - close
profitInATR = currentProfit / atr
// Trailing Stop Logic
if enableTrailingStop and profitInATR >= trailActivationMultiplier
// Activate trailing stop
if not shortTrailActive
shortTrailActive := true
shortTrailStop := close + atr * trailDistanceMultiplier
else
// Update trailing stop (only move down, never up)
newTrailStop = close + atr * trailDistanceMultiplier
shortTrailStop := math.min(shortTrailStop, newTrailStop)
// Determine which stop loss to use
effectiveStopLoss = enableTrailingStop and shortTrailActive ? shortTrailStop : bearishSL
// Stop Loss (either original or trailing)
strategy.exit("Short SL", "Short", stop=effectiveStopLoss)
// Take Profit 1 (Partial Close by Contracts)
if enablePartialClose and not tp1HitShort and low <= bearishTP1 and math.abs(strategy.position_size) >= partialCloseQty
strategy.close("Short", qty=partialCloseQty, comment="Short TP1", immediately=true)
tp1HitShort := true
// Take Profit 2 (Close Remaining Position) or Full Close if Partial is Disabled
if (enablePartialClose and tp1HitShort and low <= bearishTP2) or (not enablePartialClose and low <= bearishTP1)
strategy.close("Short", comment=enablePartialClose ? "Short TP2" : "Short TP1", immediately=true)
// Reset flags when position closes
if strategy.position_size == 0
tp1HitLong := false
tp1HitShort := false
// Reset trailing stop variables
longTrailStop := na
shortTrailStop := na
longTrailActive := false
shortTrailActive := false
// Visualization - Entry Zones
var box bullishBox = na
var box bearishBox = na
var label bullishZoneLabel = na
var label bearishZoneLabel = na
// Bullish Entry Zone
// Bearish Entry Zone
// Visualization - Risk/Reward Lines for Active Positions
var line longTP1Line = na
var line longTP2Line = na
var line longSLLine = na
var line shortTP1Line = na
var line shortTP2Line = na
var line shortSLLine = na
// Labels for TP/SL Values
// Short Position Lines and Labels
// Support and Resistance Lines
plot(support, "Support", color=color.green, linewidth=1, style=plot.style_line)
plot(resistance, "Resistance", color=color.red, linewidth=1, style=plot.style_line)
// Plot Trend MA if enabled
plot(enableTrendFilter ? trendMA : na, "Trend MA", color=color.blue, linewidth=2)
// Plot Trailing Stops if active
plot(strategy.position_size > 0 and longTrailActive ? longTrailStop : na, "Long Trail Stop", color=color.orange, linewidth=2, style=plot.style_stepline)
plot(strategy.position_size < 0 and shortTrailActive ? shortTrailStop : na, "Short Trail Stop", color=color.orange, linewidth=2, style=plot.style_stepline)