
Strategi KDJ Extreme Reversal Trend Tracking adalah sistem perdagangan kuantitatif yang menggabungkan konsep reversal momentum dan trend tracking. Strategi ini berpusat pada menangkap isyarat reversal pertama selepas indikator J berada di kawasan nilai ekstrem (~ 0 atau 100) sambil menyaring arah trend melalui garis rata EMA676 untuk memastikan arah perdagangan selaras dengan trend utama. Sistem ini menggunakan syarat kemasukan yang tepat, pengurusan kedudukan yang fleksibel dan mekanisme kawalan risiko yang ketat untuk mencari peluang perdagangan berkemungkinan tinggi di pasaran yang bergolak.
Logik teras strategi ini adalah berdasarkan kepada ciri-ciri nilai-nilai J dalam indikator KDJ, dan digabungkan dengan penapisan trend untuk mencapai kemasukan yang tepat. Prinsip-prinsipnya adalah seperti berikut:
Pengiktirafan nilai JStrategi memantau apakah nilai J mencapai julat terhad yang telah ditetapkan (default upper 100, lower 0), yang biasanya mewakili pasaran yang terlalu dibeli atau terlalu dijual.
Pengesahan pola perubahan berterusanKaedah ini memerlukan J untuk mencapai nilai maksimum, tetapi ia mesti berubah dalam satu arah dengan 3 garis K berturut-turut (berturut-turut naik atau berturut-turut turun). Kaedah ini dapat mengesahkan pergerakan indikator yang kuat.
Penangkap isyarat balikApabila nilai J selesai bergerak satu arah dalam 3 garis K berturut-turut, strategi memantau perubahan arah yang berlawanan yang pertama kali muncul, iaitu nilai J berubah dari kenaikan berturut-turut menjadi penurunan, atau dari penurunan berturut-turut menjadi titik tikungan naik.
Penapisan arah trendStrategi menggunakan garis rata-rata EMA676 sebagai kriteria untuk menentukan trend, hanya mempertimbangkan untuk membuat lebih banyak isyarat apabila harga berada di atas garis rata-rata, mempertimbangkan isyarat shorting di bawah garis rata-rata, memastikan arah perdagangan selaras dengan trend keseluruhan.
Hentikan Dinamika HentikanStrategi menggunakan peratusan stop loss berdasarkan harga kemasukan, dengan seting default 3% stop loss dan 2.2% stop loss, untuk mencapai struktur perdagangan yang mempunyai nisbah keuntungan risiko lebih besar daripada 1.
Pengurusan gudang pintarSistem ini menyediakan dua cara untuk mengira kedudukan berdasarkan jumlah kontrak tetap dan peratusan risiko berdasarkan risiko, yang kemudian akan menyesuaikan saiz kedudukan mengikut pergerakan risiko setiap perdagangan, mengoptimumkan kecekapan penggunaan dana.
Setelah menganalisis kod secara mendalam, strategi ini menunjukkan kelebihan yang ketara:
Mekanisme pemicu isyarat tepatDengan memerlukan J tidak hanya mencapai nilai maksimum, tetapi juga mengalami pergerakan satu arah 3 garis K berturut-turut, dan kemudian menangkap pembalikan pertama, keadaan komposit ini meningkatkan kebolehpercayaan isyarat dan mengurangkan penembusan palsu.
Perpaduan yang sempurna antara trend dan pembalikanStrategi ini menggabungkan strategi trend-following ((EMA676 arah penapisan) dan perdagangan reversal ((J nilai rebound) yang menghormati arah trend besar dan menangkap peluang rebound yang berkemungkinan tinggi dalam trend.
Pengurusan risiko yang bersesuaian: Kod ini mengimplementasikan pengiraan kedudukan dinamik berdasarkan peratusan risiko, menjadikan setiap perdagangan mempunyai had risiko yang sama, dan dapat mengekalkan kawalan risiko yang stabil, tidak kira bagaimana turun naik pasaran berubah.
Maklumat visual yang jelasStrategi ini memetakan isyarat masuk, titik penangguhan dan penangguhan, serta garis harga utama di atas carta, yang membolehkan peniaga memahami secara intuitif logik dan hasil pelaksanaan setiap perdagangan.
Konfigurasi parameter yang fleksibelSistem ini menyediakan banyak parameter yang boleh disesuaikan, termasuk kitaran pengiraan KDJ, panjang EMA, tetapan maksimum, peratusan stop loss, dan sebagainya, yang membolehkan strategi menyesuaikan diri dengan keadaan pasaran dan jenis perdagangan yang berbeza.
Sistem amaran awalKod ini direka bentuk untuk memberi amaran kepada peniaga yang bersedia untuk meningkatkan kecekapan operasi apabila nilai J mendekati zon nilai teratas atau apabila isyarat masuk akan terbentuk.
Walaupun strategi ini direka dengan baik, terdapat risiko yang berpotensi:
Kesan penghentian kerugian dalam keadaan yang melampauDalam pasaran yang bergelombang atau bergelombang secara melampau, peratusan stop loss yang dirancang mungkin tidak dapat dilaksanakan dengan harga yang dijangkakan, menyebabkan kerugian sebenar melebihi jangkaan. Penyelesaian adalah dengan memperkenalkan mekanisme stop loss di luar lapangan, atau mempertimbangkan penggunaan dasar tunggal dalam keadaan lapangan.
Risiko ketinggalan rata-rataEMA676 mempunyai keterlambatan yang ketara sebagai garis rata-rata jangka panjang, yang mungkin memberikan panduan arah yang salah pada permulaan perubahan trend. Ia disyorkan untuk mengoptimumkan kualiti isyarat dengan menggabungkan analisis pelbagai kitaran atau menambah indikator pengesahan trend jangka pendek.
Parameter optimasi overfitParameter semasa ((seperti kitaran KDJ 60, tetapan nilai 100⁄0) mungkin berdasarkan pengoptimuman data sejarah, terdapat risiko overfit. Disarankan untuk mengesahkan kestabilan parameter melalui ujian pra-penarikan dan ujian kitaran yang berbeza.
J nilai kecacatanKaedah: Menggunakan fungsi bcwsma yang disesuaikan untuk mengira nilai KDJ, mungkin terdapat perbezaan dengan pengiraan KDJ standard di platform yang berbeza, menyebabkan pengesanan tidak sesuai dengan isyarat cakera. Kesesuaian kaedah pengiraan harus disahkan sebelum cakera.
Risiko pasaran yang kurang kecairan: Dalam pasaran dengan jumlah perdagangan yang lebih kecil, titik berhenti dan kerugian mungkin lebih besar, mempengaruhi prestasi sebenar strategi. Disarankan untuk menggunakan strategi ini di pasaran yang tinggi kecairan atau varieti perdagangan utama.
Frekuensi isyarat tidak stabilIsyarat berdasarkan nilai terbalik yang melampau mungkin berbeza-beza dalam frekuensi dalam persekitaran pasaran yang berbeza, menyebabkan ketidakstabilan dalam penggunaan dana. Anda boleh mempertimbangkan untuk menambah isyarat perdagangan tambahan atau mekanisme pengesahan bingkai masa untuk meratakan frekuensi perdagangan.
Kaedah ini boleh dipertimbangkan untuk mengoptimumkan ciri-ciri strategi yang sedia ada:
Tetapan DinamikStrategi semasa menggunakan had atas dan bawah yang ditetapkan ((100 dan 0), anda boleh mempertimbangkan untuk menyesuaikan julat had secara dinamik berdasarkan kadar turun naik sejarah, menyesuaikan diri dengan persekitaran turun naik yang berbeza, misalnya dengan mengehadkan julat had yang sesuai semasa turun naik rendah, dan meluaskan julat had semasa turun naik tinggi.
Pengesahan pelbagai kerangka masa: Memperkenalkan isyarat pengesahan bingkai masa yang lebih tinggi, seperti meminta nilai J pada tahap cahaya matahari juga berada di zon nilai ekstrem, atau pengesahan kesesuaian isyarat pada kitaran 3 minit dan 15 minit, meningkatkan kualiti isyarat.
Penguat kecerdasanMengamalkan strategi berhenti dinamik, seperti perhitungan stop-loss berdasarkan ATR atau menggunakan tracking stop-loss untuk menangkap trend dan memaksimumkan keuntungan selepas keuntungan mencapai tahap tertentu.
Penapisan persekitaran pasaranMenambah syarat penapis kadar turun naik, menangguhkan dagangan dalam keadaan pasaran yang terlalu turun naik atau turun naik yang sangat rendah, atau menyesuaikan saiz kedudukan untuk mengelakkan dagangan dalam keadaan pasaran yang tidak sesuai dengan ciri strategi.
Kekuatan isyarat bertarafBerdasarkan J nilai reversal amplitude, K line shape, dan pengesahan kuantiti pertukaran, kekuatan isyarat dikelaskan, dan saiz kedudukan disesuaikan mengikut dinamik kekuatan isyarat, isyarat kuat meningkatkan kedudukan, isyarat lemah mengurangkan kedudukan.
Pengoptimuman Pembelajaran MesinMengenaikan algoritma pembelajaran mesin untuk mengoptimumkan secara automatik set parameter, atau untuk mengekstrak ciri-ciri dari isyarat sejarah, membina model ramalan untuk menilai kebarangkalian kejayaan setiap isyarat, meningkatkan kemampuan adaptasi dan ketahanan strategi.
KDJ Extreme Reversal Trend Tracking Strategy adalah sistem perdagangan kuantitatif yang tersusun dengan sempurna dan logik yang jelas, yang mengawal risiko dengan menangkap perubahan arah trend dan penapisan arah trend dengan penunjuk teknikal. Kelebihan utama strategi ini adalah ketepatan pemicu isyarat dan integriti pengurusan risiko, sesuai untuk persekitaran pasaran yang jelas tetapi bergelombang dalam jangka masa panjang.
Dari sudut pelaksanaan, struktur kod strategi ini jelas, logik pengiraan yang ketat, mengandungi fungsi pengurusan perdagangan yang lengkap, dari penjanaan isyarat, pengiraan kedudukan hingga pelaksanaan hentian berhenti. Dengan arah pengoptimuman yang dikemukakan dalam artikel ini, terutamanya penyesuaian parameter dinamik dan pengesahan isyarat pelbagai dimensi, kestabilan dan kesesuaian strategi dijangka meningkat.
Bagi peniaga, dalam menggunakan strategi ini, perhatian harus diberikan kepada kesesuaian parameter pengesahan dalam keadaan pasaran yang berbeza, dan penyesuaian seting stop loss dan kedudukan mengikut keutamaan risiko peribadi. Di samping itu, disarankan untuk menggabungkan analisis asas dengan analisis teknikal pada jangka masa yang lebih tinggi untuk meningkatkan keutuhan dan ketepatan keputusan perdagangan.
//@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)