
Эта стратегия представляет собой комплексную систему технического анализа торговли, которая позволяет идентифицировать высоковероятные торговые возможности в диапазоне через интеграцию нескольких индикаторов. Система основана на индикаторе SuperTrend в качестве фильтра направления тренда в сочетании с ADX (средний индекс направления) для подтверждения силы тренда и использует анализ дисбаланса давления на покупку и продажу в дельте ликвидности, чтобы точно генерировать входные и выходные сигналы в различных рыночных условиях.
Стратегия формирует торговые сигналы, работая совместно с четырьмя ключевыми показателями:
Супертендерные показателиВ качестве основного фильтра направления тренда используется оптимизированная настройка (фактор:3.0, цикл ATR: 10) для балансировки отзывчивости и надежности. Когда цена находится выше линии SuperTrend, она идентифицируется как восходящая тенденция; когда цена находится ниже линии SuperTrend, она идентифицируется как нисходящая тенденция.
Индекс ADX: используется для подтверждения силы текущей тенденции, отфильтровывает горизонтальную или хаотичную рыночную среду. Стратегия использует пользовательскую реализацию, рассчитывает реальную диапазону, движение в положительном и отрицательном направлениях и в конечном итоге генерирует значение ADX. Когда значение ADX выше установленного порога (по умолчанию 25), что указывает на наличие сильной тенденции, система будет более склонна генерировать торговые сигналы.
Индекс дельта ликвидности: Анализируйте неравновесие между давлением на покупку и продажу, рассчитывайте объем покупки и продажи, и получите окончательное значение дельты с помощью ряда стандартизированных и плавных процедур. При наличии более высоких сигналов дельты, когда значение дельты превышает положительную отметку, и низких сигналов дельты, когда оно ниже отрицательной отметки, чтобы подтвердить направление тенденции и потенциальный обратный ход.
Показатели PSAR(опционально): может использоваться в качестве дополнительного подтверждения изменения тренда, по умолчанию отключается для уменьшения фильтрации сигнала. Когда цена выше точки PSAR, она рассматривается как восходящая; когда цена ниже точки PSAR, она рассматривается как нисходящая.
Торговая логика создает комбинированный сигнал путем объединения всех активированных индикаторов. Окончательный сигнал покупки или продажи создается только тогда, когда все индикаторы указывают в одном направлении. Например, система генерирует сигнал покупки только тогда, когда выполняются условия PSAR, условия SuperTrend, условия ADX и условия ликвидной дельты. Кроме того, стратегия позволяет пользователю выбирать направление торговли (только больше, только ничто или двусторонняя торговля), чтобы адаптироваться к различным рыночным условиям или ограничениям счетов.
Эта стратегия имеет следующие значительные преимущества:
Многомерная система подтверждения: путем интеграции различных типов технических показателей, подтверждение сделок в нескольких измерениях, начиная от тенденции, интенсивности и объема сделок, значительно снижает риск ложных сигналов и повышает точность сделок.
Высокая степень адаптации: Стратегии позволяют пользователям гибко выбирать направление торговли и включать/выключать определенные индикаторы, что позволяет системе адаптироваться к различным рыночным условиям и различным видам торгов.
Строгий контроль рискаВстроенный фиксированный коэффициент остановки и остановки, который гарантирует, что каждая сделка имеет предопределенные ограничения риска и целевые показатели прибыли, эффективно защищая безопасность средств.
Учитывайте реальные затраты на сделку: В стратегической модели включены комиссионные ((0,035%) и скользящие ((2 балла) расчеты, что делает результаты обратного измерения более соответствующими реальной торговой среде.
Визуализация торговых сигналов: обеспечивает четкую стрелку для сигналов покупки/продажи, имеет настраиваемый размер и легко распознается на графике.
Информационная панель: Динамически отображает текущие активные показатели и настройки риска, обеспечивая мгновенную обратную связь о состоянии работы стратегии.
Консервативное управление позициямиПо умолчанию используйте 5%-ную долю в качестве размера позиции для каждой сделки, чтобы избежать финансовых потерь, вызванных чрезмерной торговлей.
Несмотря на всеобъемлющий дизайн стратегии, существуют следующие потенциальные риски:
Параметр Чувствительность: Стратегическая эффективность сильно зависит от параметров параметров индикатора, особенно от фактора SuperTrend и от порога ADX. Различные рыночные условия могут потребовать различной оптимизации параметров, иначе это может привести к переторгу или упущению важных возможностей.
Риск отставанияИз-за использования нескольких средних движущихся индикаторов сигнал может быть задержан, что приводит к несвоевременному вхождению или выходу из быстро меняющегося рынка.
Риски соотношенияВнутренняя взаимосвязь между несколькими техническими показателями может существовать, что означает, что кажущиеся независимыми подтверждения могут исходить из показателей, основанных на аналогичных математических моделях, что снижает фактическое значение многократных подтверждений.
Оптимизация рискаХорошая производительность в период отсчета 2021-2033 годов не обязательно означает, что она будет столь же эффективной в будущем рынке, особенно если эти параметры являются результатом переоптимизации для исторических данных.
Решение проблемы:
Эта стратегия может быть оптимизирована в следующих аспектах:
Изменение динамических параметров: реализация механизма автоматической корректировки фактора SuperTrend и понижения ADX в зависимости от волатильности рынка, что позволяет стратегии лучше адаптироваться к различным рыночным условиям. Например, использование меньшего фактора SuperTrend в низко волатильных рынках и использование большего фактора в высоко волатильных рынках.
Фильтр времениДобавление механизма фильтрации на основе времени, чтобы избежать торговли в известные периоды низкой ликвидности или высокой волатильности, такие как выходные на криптовалютном рынке или публикация важных экономических данных на валютном рынке.
Анализ многовременных рамок: подтверждение тенденции в более высоких временных рамках, например, вход в торговлю только в том случае, если направление тренда на японской линейке соответствует текущим временным рамкам торговли. Это может значительно повысить шансы на победу стратегии.
Интеллектуальные стратегии по ликвидации убытков: замена фиксированной пропорциональной остановки на динамическую остановку, основанную на ATR или позиции поддержки/сопротивления, чтобы лучше отражать реальные колебания рынка и уменьшить остановку, вызванную рыночным шумом.
Дополнительные фильтрыВключение фильтров, таких как RSI-оперекуп или граничный тест Брин, может быть рассмотрено для улучшения качества входа только при более выгодном уровне цен.
Оптимизация управления капиталом: реализация динамического управления позициями на основе текущей стратегии и рыночных условий, постепенное увеличение позиций при хорошей стратегии и уменьшение позиций при повышенной неопределенности.
Машинное обучение: Использование технологий машинного обучения для оптимизации распределения веса индикаторов, автоматической адаптации индикаторов в зависимости от различных рыночных условий и их важности в формировании конечного сигнала.
Ключевые преимущества стратегии заключаются в ее многомерном механизме подтверждения сигналов и строгой структуре управления рисками, которая эффективно фильтрует рыночный шум и защищает торговые средства. Однако пользователям необходимо обращать внимание на потенциальные риски, такие как чувствительность параметров и задержка показателей, и регулярно переоценивать эффективность стратегии.
Система имеет потенциал для дальнейшего повышения своей прибыльности и стабильности путем реализации рекомендаций по оптимизации, таких как корректировка динамических параметров, анализ многовременных рамок и интеллектуальная стратегия остановки убытков. В конечном итоге, эта стратегия предоставляет количественным трейдерам прочную структуру, которую можно настроить и расширить в соответствии с личными предпочтениями в отношении риска и рыночными взглядами.
/*backtest
start: 2025-01-27 00:00:00
end: 2025-05-14 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
// This Pine Script® code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © TiamatCrypto
//@version=6
// ====================================================================================
// Multi-Indicator Swing Trading Strategy [TIAMATCRYPTO]v6
// ====================================================================================
// DESCRIPTION:
// This strategy uses a combination of technical indicators to identify swing trading
// opportunities in various markets. The default settings are optimized for daily
// timeframes on cryptocurrency and forex markets.
//
// RECOMMENDED DEFAULT SETTINGS:
// - Trading direction: Both (performs well in trending and ranging markets)
// - Position size: 5% (conservative position sizing to manage risk)
// - Stop Loss: 2% (conservative risk management for capital preservation)
// - Take Profit: 4% (realistic profit target with 1:2 risk-reward ratio)
// - Initial capital: $10,000 (realistic starting account size)
// - Timeframe: 2m (best performance on 2m charts)
// - Testing period: 2021-2033 (provides sufficient sample size of trades)
// ====================================================================================
strategy("Multi-Indicator Swing [TIAMATCRYPTO]v6", overlay=true,
default_qty_type=strategy.percent_of_equity, default_qty_value=5,
initial_capital=10000, commission_type=strategy.commission.percent,
commission_value=0.035, slippage=2)
// === BASIC SETTINGS ===
// Backtesting time period set directly in the code for realistic testing
var startDateInput = timestamp("2021-01-01T00:00:00")
var endDateInput = timestamp("2033-12-31T23:59:59")
var inDateRange = time >= startDateInput and time <= endDateInput
// Trading direction settings
tradeDirection = input.string("Both", "Trading Direction", options=["Long Only", "Short Only", "Both"], group="Basic Settings")
// === INDICATOR SWITCHES ===
// PSAR is now disabled by default
usePSAR = input.bool(false, "Use PSAR", group="Indicator Switches")
useSupertrend = input.bool(true, "Use Supertrend", group="Indicator Switches")
useADX = input.bool(true, "Use ADX", group="Indicator Switches")
useLiquidityDelta = input.bool(true, "Use Liquidity Delta", group="Indicator Switches")
// === INDICATOR SETTINGS SECTION ===
// PSAR Settings
// Default PSAR settings are conservative and work well across multiple markets
psarStart = input.float(0.02, "PSAR Initial Value", minval=0.01, maxval=0.1, step=0.01, group="PSAR Settings")
psarIncrement = input.float(0.02, "PSAR Increment", minval=0.01, maxval=0.1, step=0.01, group="PSAR Settings")
psarMaximum = input.float(0.2, "PSAR Maximum", minval=0.1, maxval=0.5, step=0.05, group="PSAR Settings")
// Supertrend Settings
// Factor 3.0 provides a good balance between sensitivity and false signals
atrPeriod = input.int(10, "SuperTrend ATR Period", minval=1, maxval=50, group="SuperTrend Settings")
factor = input.float(3.0, "SuperTrend Multiplier", minval=1, maxval=10, step=0.1, group="SuperTrend Settings")
// ADX Settings
// ADX threshold of 25 is standard for identifying strong trends
adxLength = input.int(14, "ADX Length", minval=1, maxval=50, group="ADX Settings")
adxThreshold = input.int(25, "ADX Trend Strength Threshold", minval=10, maxval=50, group="ADX Settings")
// Liquidity Delta Settings
// These settings help identify significant volume imbalances for trend confirmation
deltaLength = input.int(14, "Liquidity Delta Length", minval=1, maxval=50, group="Liquidity Delta")
deltaSmooth = input.int(3, "Delta Smoothing", minval=1, maxval=20, group="Liquidity Delta")
deltaThreshold = input.float(0.5, "Delta Signal Threshold", minval=0.1, maxval=5, step=0.1, group="Liquidity Delta")
// Risk Management Settings
// Conservative settings to ensure capital preservation
useStopLoss = input.bool(true, "Use Stop Loss", group="Risk Management")
useTakeProfit = input.bool(true, "Use Take Profit", group="Risk Management")
stopLossPercent = input.float(2.0, "Stop Loss (%)", minval=0.5, maxval=5, step=0.1, group="Risk Management")
takeProfitPercent = input.float(4.0, "Take Profit (%)", minval=1.0, maxval=10, step=0.1, group="Risk Management")
// Visualization Settings
signalSize = input.string("Normal", "Signal Size", options=["Small", "Normal", "Large"], group="Visualization")
buyColor = input.color(color.green, "Buy Signal Color", group="Visualization")
sellColor = input.color(color.red, "Sell Signal Color", group="Visualization")
// === INDICATOR CALCULATIONS ===
// All remaining indicators set to initialize as true when their respective switch is off
// PSAR Calculations
psar = ta.sar(psarStart, psarIncrement, psarMaximum)
psarCondition = not usePSAR or (close > psar)
psarSellCondition = not usePSAR or (close < psar)
// Supertrend Calculations
[supertrendValue, supertrendDirection] = ta.supertrend(factor, atrPeriod)
supertrendCondition = not useSupertrend or (supertrendDirection > 0)
supertrendSellCondition = not useSupertrend or (supertrendDirection < 0)
// ADX Calculations - custom implementation
trueRange = math.max(high - low, math.abs(high - close[1]), math.abs(low - close[1]))
smoothedTrueRange = ta.sma(trueRange, adxLength)
dmPlus = high > high[1] ? math.max(high - high[1], 0) : 0
dmMinus = low[1] > low ? math.max(low[1] - low, 0) : 0
smoothedDmPlus = ta.sma(dmPlus, adxLength)
smoothedDmMinus = ta.sma(dmMinus, adxLength)
diPlus = smoothedTrueRange > 0 ? 100 * smoothedDmPlus / smoothedTrueRange : 0
diMinus = smoothedTrueRange > 0 ? 100 * smoothedDmMinus / smoothedTrueRange : 0
dx = (diPlus + diMinus) > 0 ? math.abs(diPlus - diMinus) / (diPlus + diMinus) * 100 : 0
adxValue = ta.sma(dx, adxLength)
adxCondition = not useADX or (adxValue > adxThreshold)
// Liquidity Delta Calculations
bidVolume = close < open ? volume : volume * (high - close) / (high - low + 0.000001)
askVolume = close > open ? volume : volume * (close - low) / (high - low + 0.000001)
deltaRaw = bidVolume - askVolume
deltaAvg = ta.sma(deltaRaw, deltaLength)
deltaNormalized = deltaAvg / ta.sma(volume, deltaLength)
deltaSmoothed = ta.ema(deltaNormalized, deltaSmooth)
// Delta Signals
bullishDelta = deltaSmoothed > deltaThreshold
bearishDelta = deltaSmoothed < -deltaThreshold
deltaCondition = not useLiquidityDelta or bullishDelta
deltaSellCondition = not useLiquidityDelta or bearishDelta
// === TRADING LOGIC ===
// Buy signal - combination of all active indicators
buySignal = psarCondition and supertrendCondition and adxCondition and deltaCondition
// Sell signal - combination of all active indicators
sellSignal = psarSellCondition and supertrendSellCondition and adxCondition and deltaSellCondition
// Apply trading direction
isLongAllowed = tradeDirection == "Long Only" or tradeDirection == "Both"
isShortAllowed = tradeDirection == "Short Only" or tradeDirection == "Both"
finalBuySignal = buySignal and isLongAllowed
finalSellSignal = sellSignal and isShortAllowed
// === POSITION ENTRY WITH RISK MANAGEMENT ===
// Conservative position management with defined risk parameters
if finalBuySignal and inDateRange
strategy.entry("Long", strategy.long)
// Conditional setting of stop-loss and take-profit
if useStopLoss or useTakeProfit
stopLevel = useStopLoss ? close * (1 - stopLossPercent / 100) : na
takeProfitLevel = useTakeProfit ? close * (1 + takeProfitPercent / 100) : na
strategy.exit("Long Exit", "Long", stop=stopLevel, limit=takeProfitLevel)
if finalSellSignal and inDateRange
strategy.entry("Short", strategy.short)
// Conditional setting of stop-loss and take-profit
if useStopLoss or useTakeProfit
stopLevel = useStopLoss ? close * (1 + stopLossPercent / 100) : na
takeProfitLevel = useTakeProfit ? close * (1 - takeProfitPercent / 100) : na
strategy.exit("Short Exit", "Short", stop=stopLevel, limit=takeProfitLevel)
// === SIGNAL VISUALIZATION ===
// Creating separate signals for different sizes
buySmallSignal = finalBuySignal and signalSize == "Small"
buyNormalSignal = finalBuySignal and signalSize == "Normal"
buyLargeSignal = finalBuySignal and signalSize == "Large"
sellSmallSignal = finalSellSignal and signalSize == "Small"
sellNormalSignal = finalSellSignal and signalSize == "Normal"
sellLargeSignal = finalSellSignal and signalSize == "Large"
// Draw signals for each size
plotshape(buySmallSignal and inDateRange, title="Buy Small", location=location.belowbar, color=buyColor, style=shape.triangleup, size=size.small)
plotshape(buyNormalSignal and inDateRange, title="Buy Normal", location=location.belowbar, color=buyColor, style=shape.triangleup, size=size.normal)
plotshape(buyLargeSignal and inDateRange, title="Buy Large", location=location.belowbar, color=buyColor, style=shape.triangleup, size=size.large)
plotshape(sellSmallSignal and inDateRange, title="Sell Small", location=location.abovebar, color=sellColor, style=shape.triangledown, size=size.small)
plotshape(sellNormalSignal and inDateRange, title="Sell Normal", location=location.abovebar, color=sellColor, style=shape.triangledown, size=size.normal)
plotshape(sellLargeSignal and inDateRange, title="Sell Large", location=location.abovebar, color=sellColor, style=shape.triangledown, size=size.large)
// === INFORMATION PANEL ===
// Building list of active indicators
indList = ""
indList := usePSAR ? indList + "PSAR, " : indList
indList := useSupertrend ? indList + "SuperT, " : indList
indList := useADX ? indList + "ADX, " : indList
indList := useLiquidityDelta ? indList + "Delta" : indList
// Remove last comma if it exists
if str.endswith(indList, ", ")
indList := str.substring(indList, 0, str.length(indList) - 2)
// Building risk management text
riskText = ""
if useStopLoss and useTakeProfit
riskText := str.tostring(stopLossPercent, "#.#") + "% SL, " + str.tostring(takeProfitPercent, "#.#") + "% TP"
else if useStopLoss
riskText := str.tostring(stopLossPercent, "#.#") + "% SL"
else if useTakeProfit
riskText := str.tostring(takeProfitPercent, "#.#") + "% TP"
else
riskText := "Disabled"
// Display strategy information
var table infoTable = table.new(position.top_right, 2, 5, border_width=1)
table.cell(infoTable, 0, 0, "Strategy:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 0, "Multi-Indicator Swing", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 0, 1, "Period:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 1, "2021-2023", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 0, 2, "Direction:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 2, tradeDirection, bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 0, 3, "Indicators:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 3, indList, bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 0, 4, "Risk Management:", bgcolor=color.new(color.blue, 90), text_color=color.white)
table.cell(infoTable, 1, 4, riskText, bgcolor=color.new(color.blue, 90), text_color=color.white)