
KDJ Extreme Reversal Trend Tracking Strategy - это количественная торговая система, объединяющая концепцию динамического реверса и трендового отслеживания, которая основана на поимке первого обратного сигнала после показателя J в предельной зоне (0 или 100), а также на фильтрации направления тенденции через равновесную линию EMA676, чтобы обеспечить соответствие направления торговли с основной тенденцией. Система использует точные условия входа, гибкое управление позициями и строгий механизм контроля риска для поиска высоковероятных торговых возможностей на волатильных рынках.
Основная логика стратегии основана на J-значительном свойстве KDJ-индикатора и в сочетании с фильтрацией тенденций обеспечивает точный вход. Конкретные принципы следующие:
Определение J-значений: стратегия отслеживает, достигает ли J-значение предельного диапазона по умолчанию ((по умолчанию верхний предел 100, нижний предел 0), которые обычно представляют собой перекуп или перепродажу на рынке.
Подтверждение непрерывного изменения модели: Стратегия требует, чтобы после достижения предельного значения значения J, должны быть односторонние изменения в 3 последовательных K-линии ((последовательное повышение или последовательное снижение), эта модель позволяет подтвердить сильное движение показателя.
Захват обратного сигнала: когда J-значение завершает одностороннее движение по 3 последовательным K-линиям, стратегия отслеживает первые возникшие обратные изменения, то есть J-значение переходит от последовательного повышения к понижению, или от последовательного снижения к восходящему повороту.
Фильтр направленияСтратегия использует среднюю линию EMA676 в качестве критерия для определения тенденции, только когда цена выше средней линии, и только когда цена ниже средней линии, чтобы убедиться, что направление торговли соответствует общей тенденции.
Динамическая остановка остановкиСтратегия использует стоп-стоп, рассчитываемый в процентном соотношении от цены входа, с по умолчанию 3% стоп-стоп и 2.2% стоп-стоп, для достижения структуры с риском-прибылью более 1.
Интеллектуальное управление складомСистема предоставляет два способа расчета позиций: фиксированное количество контрактов и процент риска, который позволяет оптимизировать эффективность использования средств, изменяя размер позиции в зависимости от динамики рискового порога каждой сделки.
После глубокого анализа кода, эта стратегия показала следующие значительные преимущества:
Точный сигнал запускаКомбинированное условие: требуя, чтобы J-значение не только достигло предельного значения, но и переживало последовательное одностороннее движение 3 K-линий, а затем зафиксировало первое обращение, это условие значительно повышает надежность сигнала и уменьшает ложные прорывы.
Идеальное сочетание тренда и обратного.Стратегия хитро сочетает в себе два вида торговли: отслеживание тренда (фильтрация в направлении EMA676) и реверсивное торговое мышление (реверсивное торговое мышление) (реверсивное торговое мышление в пределах J-значения), которое уважает направление большого тренда, но также может уловить высокую вероятность реверса в тренде.
Самостоятельное управление рисками: В коде реализован динамический расчет позиций, основанный на процентах риска, что позволяет сохранить рисковый порог для каждой сделки, независимо от того, как меняется волатильность рынка, поддерживая стабильный контроль риска.
Ясный визуальный отзывСтратегия: на графике изображены входные сигналы, остановки и остановки, а также ключевые ценовые линии, чтобы трейдер мог интуитивно понять логику и результаты выполнения каждой сделки.
Гибкая конфигурация параметровСистема предоставляет множество настраиваемых параметров, включая циклы расчета KDJ, длину EMA, предельные параметры, стоп-стоп-лосс и т. д., что позволяет стратегии адаптироваться к различным рыночным условиям и видам торгов.
Система раннего предупреждения: В коде разработаны предварительные условия для приближения к сигналу, например, когда J-значение приближается к предельной зоне или когда будет сформирован входный сигнал, чтобы предупредить трейдеров о готовности и повысить эффективность операций.
Несмотря на то, что стратегия была продуманной, она содержит следующие потенциальные риски:
Стоп-лосс в экстремальных ситуацияхВ случае возникновения рыночных взлетов или экстремальных колебаний, предполагаемый процентный стоп может не выполняться по ожидаемой цене, что приводит к фактическим потерям, превышающим ожидания. Решением является введение стоп-механизма вне поля или рассмотрение использования условий в поле.
Риск отставания от средней:EMA676 как долгосрочная средняя линия имеет значительную отсталость и может давать ошибочное направление в начале трендового поворота. Рекомендуется оптимизировать качество сигнала в сочетании с многоциклическим анализом или добавлением показателей подтверждения краткосрочных тенденций.
Оптимизация параметров сверхприспособленияТекущие параметры (например, 60 циклов KDJ, 100⁄0) могут быть получены на основе оптимизации исторических данных. Существует риск чрезмерного соответствия. Рекомендуется проверять стабильность параметров путем предварительного тестирования и тестирования на разных циклах.
Расчетная погрешность J: Политика Используйте пользовательскую функцию bcwsma для вычисления значения KDJ, которые могут отличаться от стандартных вычислений KDJ на разных платформах, что приводит к несовместимости отслеживания с сигналом на реальном диске. Согласованность метода вычисления должна быть подтверждена перед реальном диске.
Риски низкой ликвидности рынка: На рынках с небольшим объемом торгов, скольжение стоп-стоп может быть большим, влияя на фактическую эффективность стратегии. Рекомендуется применять стратегию на высоколиквидных рынках или основных торговых разновидностях.
Нестабильная частота сигналаСигналы, основанные на реверсии крайних значений, могут сильно различаться в частоте в различных рыночных условиях, что приводит к нестабильности эффективности использования средств. Можно рассмотреть возможность добавления вспомогательных торговых сигналов или механизмов подтверждения многократных временных рамок для сглаживания частоты торгов.
Для оптимизации существующих особенностей стратегии можно рассмотреть следующие направления:
Динамические параметры: текущая стратегия использует фиксированные верхние и нижние пределы крайних значений ((100 и 0), можно рассмотреть возможность динамической корректировки предельного диапазона на основе исторической волатильности, адаптируясь к различным волатильным условиям, например, надлежащее сужение предельного диапазона в период низкой волатильности, расширение предельного диапазона в период высокой волатильности.
Подтверждение многократных временных рамокВведение более высокого уровня сигналов подтверждения временных рамок, например, требуя, чтобы значения J на уровне солнечного света также находились в предельной зоне, или подтверждение согласованности сигналов с 3-минутным и 15-минутным периодами, повышающее качество сигнала.
Интеллектуальные тормозные механизмыПрименение динамических стоп-стратегий, таких как расчет стоп-поста на основе ATR, или использование стоп-поста после достижения определенного уровня прибыли, чтобы максимально уловить трендовую прибыль.
Фильтрация рыночной средыУвеличение фильтрации на волатильность, приостановка торговли в условиях чрезмерной или крайне низкой волатильности рынка или корректировка размеров позиций, чтобы избежать торговли в условиях рынка, не соответствующих стратегическим характеристикам.
Сигнальная степень: На основе J-значения обратной величины, K-линии формы, подтверждения объема передачи и других факторов, для классификации силы сигнала, и в соответствии с динамикой силы сигнала регулировать размер позиции, сильный сигнал увеличить позиции, слабый сигнал уменьшить позиции.
Оптимизация машинного обученияВнедрение алгоритмов машинного обучения для автоматической оптимизации параметров или извлечения характеристик исторических сигналов, создание прогнозных моделей для оценки вероятности успеха каждого сигнала, повышение адаптивности и устойчивости стратегий.
KDJ Extreme Reversal Trend Tracker является структурированной, логически четкой системой количественного трейдинга, которая контролирует риск, сохраняя высокую выигрышную долю, путем захвата экстремальных реверсий технических показателей и фильтрации направления тенденции. Основные преимущества стратегии заключаются в точности ее сигнальных триггеров и целостности управления рисками, которые подходят для рыночной среды с ясными, но волатильными среднесрочными тенденциями.
С точки зрения реализации, стратегия имеет четкую структуру кода, строгую вычислительную логику, включает в себя полную функцию управления сделками, имеет подробную реализацию от генерации сигналов, расчета позиций до выполнения стоп-стоп-убытков. Ожидается дальнейшее повышение стабильности и адаптивности стратегии с помощью направлений оптимизации, предложенных в этой статье, в частности, регулирование динамических параметров и подтверждение многомерных сигналов.
Для трейдеров при применении этой стратегии следует обратить внимание на применимость параметров верификации в различных рыночных условиях и настраивать свои стоп-лоры и позиции в соответствии с личными предпочтениями в отношении риска. В то же время рекомендуется комбинировать фундаментальный анализ с техническим анализом более высоких временных рамок для повышения полноты и точности торговых решений.
//@version=6
strategy("J值极值趋势跟随策略", overlay = true,
default_qty_type = strategy.percent_of_equity, default_qty_value = 10, // 降低每笔交易的仓位大小
initial_capital = 10000,
margin_long = 20, margin_short = 20) // 设置合理的保证金要求
// === 策略说明:J值极值趋势跟随策略 ===
// 主图:显示J值连续下降后反弹的买点和连续上升后回调的卖点
// 副图:显示J线走势、中轴线、极值区域
// 方向过滤:676均线,价格在上方只做多,下方只做空
// 止盈止损:基于百分比波动,默认1%止盈1%止损
// === 输入参数 ===
lengthK = input.int(60, title = "K period")
lengthD = input.int(3, title = "D period")
smoothK = input.int(3, title = "Smooth K")
emaLength = input.int(576, title = "趋势EMA周期", inline="ema")
extremeHigh = input.float(100, title = "J值极值上限", minval = 80, maxval = 120)
extremeLow = input.float(0, title = "J值极值下限", minval = -20, maxval = 20)
// === 止盈止损参数(改为百分比) ===
takeProfitPercent = input.float(3, title = "止盈百分比", minval = 0.1, step = 0.1)
stopLossPercent = input.float(2.2, title = "止损百分比", minval = 0.1, step = 0.1)
// === 风险控制参数 ===
useFixedPositionSize = input.bool(true, title = "使用固定合约数量")
fixedPositionSize = input.float(1.0, title = "固定合约数量", minval = 0.1, step = 0.1)
riskPerTrade = input.float(1.0, title = "每笔交易风险百分比", minval = 0.1, maxval = 10, step = 0.1)
// === KDJ计算(使用与bitcoinwisdom一致的算法) ===
// 自定义加权移动平均函数(与bitcoinwisdom一致)
bcwsma(s, l, m) =>
var _bcwsma = 0.0
_bcwsma := (m*s + (l-m)*nz(_bcwsma[1])) / l
_bcwsma
highestHigh = ta.highest(high, lengthK)
lowestLow = ta.lowest(low, lengthK)
rsv = (close - lowestLow) / (highestHigh - lowestLow) * 100
K = bcwsma(rsv, smoothK, 1)
D = bcwsma(K, lengthD, 1)
J = 3 * K - 2 * D
// === 676均线方向判断 ===
ema676 = ta.ema(close, emaLength)
trendUp = close > ema676 // 价格在676均线上方
trendDown = close < ema676 // 价格在676均线下方
// === 检测J值连续下降和上升 ===
// 检测连续3根下降:J < J[1] < J[2] < J[3]
jContinuousDown = J < J[1] and J[1] < J[2] and J[2] < J[3]
// 检测连续3根上升:J > J[1] > J[2] > J[3]
jContinuousUp = J > J[1] and J[1] > J[2] and J[2] > J[3]
// === 检测反弹和回调(必须在极值区域内) ===
// 反弹:当前J值上升,且之前连续下降,且J值在极值下限以下
jBounce = J > J[1] and jContinuousDown[1] and J[1] <= extremeLow
// 回调:当前J值下降,且之前连续上升,且J值在极值上限以上
jPullback = J < J[1] and jContinuousUp[1] and J[1] >= extremeHigh
// === 开仓信号(带方向过滤) ===
// 买点:J值连续下降后反弹 + 价格在676均线上方
longEntry = jBounce and trendUp
// 卖点:J值连续上升后回调 + 价格在676均线下方
shortEntry = jPullback and trendDown
// === 记录开仓价格和止盈止损价格 ===
var float entryPrice = na
var float tpPrice = na
var float slPrice = na
// === 计算仓位大小 ===
// 基于风险百分比的仓位计算需要考虑止损百分比
positionSize = useFixedPositionSize ? fixedPositionSize : (strategy.equity * (riskPerTrade / 100)) / (close * stopLossPercent / 100)
// === 止盈止损信号变量 ===
var bool longTakeProfitHit = false
var bool longStopLossHit = false
var bool shortTakeProfitHit = false
var bool shortStopLossHit = false
// === 警报信号指示器 ===
// 多单入场信号将触发
longSignalComing = J <= extremeLow and jContinuousDown and trendUp
// 空单入场信号将触发
shortSignalComing = J >= extremeHigh and jContinuousUp and trendDown
// J值接近极值区域
jNearExtremeLow = J <= extremeLow + 5 and J > extremeLow
jNearExtremeHigh = J >= extremeHigh - 5 and J < extremeHigh
// === 策略执行 ===
if (longEntry and strategy.position_size == 0)
entryPrice := close
// 计算基于百分比的止盈止损价格
tpPrice := entryPrice * (1 + takeProfitPercent / 100)
slPrice := entryPrice * (1 - stopLossPercent / 100)
strategy.entry("多单", strategy.long, qty=positionSize)
// 重置止盈止损信号
longTakeProfitHit := false
longStopLossHit := false
if (shortEntry and strategy.position_size == 0)
entryPrice := close
// 计算基于百分比的止盈止损价格
tpPrice := entryPrice * (1 - takeProfitPercent / 100)
slPrice := entryPrice * (1 + stopLossPercent / 100)
strategy.entry("空单", strategy.short, qty=positionSize)
// 重置止盈止损信号
shortTakeProfitHit := false
shortStopLossHit := false
// === 手动检查止盈止损条件 ===
// 多单止盈止损
longTPHit = strategy.position_size > 0 and high >= tpPrice and not longTakeProfitHit
longSLHit = strategy.position_size > 0 and low <= slPrice and not longStopLossHit
if (longTPHit)
strategy.close("多单", comment="止盈")
longTakeProfitHit := true
if (longSLHit)
strategy.close("多单", comment="止损")
longStopLossHit := true
// 空单止盈止损
shortTPHit = strategy.position_size < 0 and low <= tpPrice and not shortTakeProfitHit
shortSLHit = strategy.position_size < 0 and high >= slPrice and not shortStopLossHit
if (shortTPHit)
strategy.close("空单", comment="止盈")
shortTakeProfitHit := true
if (shortSLHit)
strategy.close("空单", comment="止损")
shortStopLossHit := true
// === 在主图绘制676均线 ===
plot(ema676, title="676 EMA", color=color.blue, linewidth=2)
// === 在主图标注开仓信号 ===
plotshape(longEntry, title="多单入场", location=location.belowbar, color=color.lime, style=shape.triangleup, size=size.small, text="多单", force_overlay=true)
plotshape(shortEntry, title="空单入场", location=location.abovebar, color=color.red, style=shape.triangledown, size=size.small, text="空单", force_overlay=true)
// === 添加止盈止损信号 ===
// 多单止盈信号
plotshape(longTPHit, title="多单止盈", location=location.abovebar,
color=color.green, style=shape.circle, size=size.normal, text="止盈", force_overlay=true)
// 多单止损信号
plotshape(longSLHit, title="多单止损", location=location.abovebar,
color=color.red, style=shape.xcross, size=size.normal, text="止损", force_overlay=true)
// 空单止盈信号
plotshape(shortTPHit, title="空单止盈", location=location.belowbar,
color=color.green, style=shape.circle, size=size.normal, text="止盈", force_overlay=true)
// 空单止损信号
plotshape(shortSLHit, title="空单止损", location=location.belowbar,
color=color.red, style=shape.xcross, size=size.normal, text="止损", force_overlay=true)
// === 绘制止盈止损线 ===
plot(strategy.position_size != 0 ? tpPrice : na, title="止盈", color=color.green, style=plot.style_line, linewidth=1)
plot(strategy.position_size != 0 ? slPrice : na, title="止损", color=color.red, style=plot.style_line, linewidth=1)
plot(strategy.position_size != 0 ? entryPrice : na, title="入场价", color=color.yellow, style=plot.style_line, linewidth=1)
// === 设置警报条件(使用常量字符串) ===
// 基础信号警报
alertcondition(longEntry, title="多单入场信号", message="J值极值策略: 多单入场信号触发")
alertcondition(shortEntry, title="空单入场信号", message="J值极值策略: 空单入场信号触发")
alertcondition(longTPHit, title="多单止盈触发", message="J值极值策略: 多单止盈触发")
alertcondition(longSLHit, title="多单止损触发", message="J值极值策略: 多单止损触发")
alertcondition(shortTPHit, title="空单止盈触发", message="J值极值策略: 空单止盈触发")
alertcondition(shortSLHit, title="空单止损触发", message="J值极值策略: 空单止损触发")
// === 添加交易详情标签 ===
if (longTPHit)
label.new(bar_index, high, text="多单止盈 +" + str.tostring(takeProfitPercent) + "%",
style=label.style_label_down, color=color.green, textcolor=color.white)
if (longSLHit)
label.new(bar_index, low, text="多单止损 -" + str.tostring(stopLossPercent) + "%",
style=label.style_label_up, color=color.red, textcolor=color.white)
if (shortTPHit)
label.new(bar_index, low, text="空单止盈 +" + str.tostring(takeProfitPercent) + "%",
style=label.style_label_up, color=color.green, textcolor=color.white)
if (shortSLHit)
label.new(bar_index, high, text="空单止损 -" + str.tostring(stopLossPercent) + "%",
style=label.style_label_down, color=color.red, textcolor=color.white)