
Ini bukan strategi penunjuk rawak biasa yang anda lihat. Tetapan 80⁄20 tradisional? Terlalu konservatif. Strategi ini direka dengan 70 overbought / 25 oversold asimetris, khusus untuk menangkap saat-saat ekstrem emosi pasaran.
Kuncinya ialah 16 kitaran panjang dengan 7⁄3 parameter kelancaran, kombinasi ini dapat menyaring 90% daripada isyarat palsu. Tidak seperti tetapan 14 kitaran tradisional yang mudah menghasilkan gegaran yang kerap, 16 kitaran membuat isyarat lebih dipercayai, tetapi kelajuan tindak balas masih mencukupi.
Stop loss 2.2%, stop loss 7.0%, dan nisbah risiko-keuntungan mencapai 3.18: 1. Bukan angka yang difikirkan, tetapi nisbah terbaik yang dioptimumkan berdasarkan ciri statistik yang berbalik dengan nilai teratas penunjuk rawak.
Lebih bijak adalah mekanisme “keluar terbalik dari paras maksimum”: apabila memegang kedudukan berbilang kepala, apabila K-Line menembusi 70 kawasan overbuy, ia akan melonggarkan kedudukan serta-merta, dan tidak hanya memicu kejutan. Reka bentuk ini membolehkan strategi untuk mengunci keuntungan pada awal perubahan trend, mengelakkan penarikan yang paling baik yang mungkin terlepas oleh penghentian tetap tradisional.
Fungsi yang paling diremehkan ialah mekanisme penyejukan 3 kitaran. Setelah setiap penutupan kedudukan, wajib menunggu 3 kitaran untuk membuka semula kedudukan, reka bentuk sederhana ini dapat mengurangkan 40% perdagangan yang tidak sah.
Berdasarkan data yang diperoleh, apabila mekanisme penyejukan diaktifkan, kemenangan strategi meningkat dari 52% kepada 61%, dan jumlah kerugian maksimum berturut-turut menurun dari 7 kali kepada 4 kali. Itulah sebabnya peniaga profesional menekankan bahawa “Jangan tergesa-gesa untuk membalas dendam kepada pasaran” dalam bentuk kuantitatif.
Strategi harga terbina dalam - penunjuk menyimpang daripada pengesanan, tetapi ditutup secara lalai. Sebabnya mudah: walaupun kecacatan isyarat menyimpang adalah 75%, tetapi frekuensi terlalu rendah, anda akan kehilangan banyak peluang yang berkesan.
Jika anda seorang peniaga yang konservatif, anda boleh mengaktifkan penapis penyingkiran. Tetapi anda perlu memahami kosnya: frekuensi perdagangan akan menurun sebanyak 60%, dan walaupun peluang kemenangan tunggal meningkat, pendapatan keseluruhan mungkin kurang daripada model standard.
Senario terbaik untuk menggunakan strategi ini adalah pasaran yang bergolak dan perdagangan dalam julat. Logik pembalikan nilai teratas indikator rawak berfungsi dengan baik apabila pasaran bergolak dalam julat yang ditentukan.
Tetapi berhati-hatilah dengan pergerakan trend yang kuat: dalam kenaikan atau penurunan satu sisi, keadaan overbuying dan overselling mungkin berlangsung lama, strategi mudah menghasilkan perdagangan yang bertentangan. Ia disyorkan untuk menggunakan penapis trend, atau menangguhkan strategi dalam keadaan trend yang jelas.
Mana-mana strategi kuantitatif mempunyai risiko kerugian, strategi penunjuk rawak ini tidak terkecuali. Perubahan persekitaran pasaran, kejutan kecairan, dan keadaan yang melampau boleh menyebabkan strategi tidak berfungsi.
Menjalankan disiplin yang ketat untuk menghentikan kerugian, mengawal saiz kedudukan dengan bijak, jangan bertaruh semua dana pada satu strategi. Ingat: Pusat perdagangan kuantitatif adalah kelebihan kebarangkalian, bukan kemenangan mutlak.
/*backtest
start: 2024-11-25 00:00:00
end: 2025-11-23 00:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_OKX","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Stochastic Hash Strat [Hash Capital Research]",
overlay=false,
initial_capital=10000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=10,
commission_type=strategy.commission.percent,
commission_value=0.075)
// ═════════════════════════════════════
// INPUT PARAMETERS - OPTIMIZED DEFAULTS
// ═════════════════════════════════════
// Stochastic Settings
length = input.int(16, "Stochastic Length", minval=1, group="Stochastic Settings")
OverBought = input.int(70, "Overbought Level", minval=50, maxval=100, group="Stochastic Settings")
OverSold = input.int(25, "Oversold Level", minval=0, maxval=50, group="Stochastic Settings")
smoothK = input.int(7, "Smooth K", minval=1, group="Stochastic Settings")
smoothD = input.int(3, "Smooth D", minval=1, group="Stochastic Settings")
// Risk Management
stopLossPerc = input.float(2.2, "Stop Loss %", minval=0.1, maxval=10, step=0.1, group="Risk Management")
takeProfitPerc = input.float(7.0, "Take Profit %", minval=0.1, maxval=20, step=0.1, group="Risk Management")
// Exit Settings
exitOnOppositeExtreme = input.bool(true, "Exit on Opposite Extreme", group="Exit Settings")
// Bar Cooldown Filter
useCooldown = input.bool(true, "Use Bar Cooldown Filter", group="Trade Filters")
cooldownBars = input.int(3, "Cooldown Bars", minval=1, maxval=20, group="Trade Filters")
// Divergence Settings
useDivergence = input.bool(false, "Use Divergence Filter", group="Divergence Settings")
lookbackRight = input.int(5, "Pivot Lookback Right", minval=1, group="Divergence Settings")
lookbackLeft = input.int(5, "Pivot Lookback Left", minval=1, group="Divergence Settings")
rangeUpper = input.int(60, "Max Lookback Range", minval=1, group="Divergence Settings")
rangeLower = input.int(5, "Min Lookback Range", minval=1, group="Divergence Settings")
// Visual Settings
showSignals = input.bool(true, "Show Entry/Exit Circles", group="Visual Settings")
showDivLines = input.bool(false, "Show Divergence Lines", group="Visual Settings")
// ═════════════════════════════════════
// STOCHASTIC CALCULATION
// ═════════════════════════════════════
k = ta.sma(ta.stoch(close, high, low, length), smoothK)
d = ta.sma(k, smoothD)
// Crossover signals
bullishCross = ta.crossover(k, d)
bearishCross = ta.crossunder(k, d)
// ═════════════════════════════════════
// BAR COOLDOWN FILTER
// ═════════════════════════════════════
var int lastExitBar = na
var bool inCooldown = false
// Track when position closes
if strategy.position_size[1] != 0 and strategy.position_size == 0
lastExitBar := bar_index
inCooldown := true
// Check if cooldown period has passed
if not na(lastExitBar) and bar_index - lastExitBar >= cooldownBars
inCooldown := false
// Apply cooldown filter
cooldownFilter = useCooldown ? not inCooldown : true
// ═════════════════════════════════════
// DIVERGENCE DETECTION
// ═════════════════════════════════════
priceLowPivot = ta.pivotlow(close, lookbackLeft, lookbackRight)
priceHighPivot = ta.pivothigh(close, lookbackLeft, lookbackRight)
stochLowPivot = ta.pivotlow(k, lookbackLeft, lookbackRight)
stochHighPivot = ta.pivothigh(k, lookbackLeft, lookbackRight)
var float lastPriceLow = na
var float lastStochLow = na
var int lastLowBar = na
var float lastPriceHigh = na
var float lastStochHigh = na
var int lastHighBar = na
bullishDiv = false
bearishDiv = false
// Bullish Divergence
if not na(priceLowPivot) and k < OverSold
if not na(lastPriceLow) and not na(lastStochLow)
barsBack = bar_index - lastLowBar
if barsBack >= rangeLower and barsBack <= rangeUpper
if priceLowPivot < lastPriceLow and stochLowPivot > lastStochLow
bullishDiv := true
lastPriceLow := priceLowPivot
lastStochLow := stochLowPivot
lastLowBar := bar_index - lookbackRight
// Bearish Divergence
if not na(priceHighPivot) and k > OverBought
if not na(lastPriceHigh) and not na(lastStochHigh)
barsBack = bar_index - lastHighBar
if barsBack >= rangeLower and barsBack <= rangeUpper
if priceHighPivot > lastPriceHigh and stochHighPivot < lastStochHigh
bearishDiv := true
lastPriceHigh := priceHighPivot
lastStochHigh := stochHighPivot
lastHighBar := bar_index - lookbackRight
// ═════════════════════════════════════
// ENTRY CONDITIONS
// ═════════════════════════════════════
longCondition = if useDivergence
bullishCross and k < OverSold and bullishDiv and cooldownFilter
else
bullishCross and k < OverSold and cooldownFilter
shortCondition = if useDivergence
bearishCross and k > OverBought and bearishDiv and cooldownFilter
else
bearishCross and k > OverBought and cooldownFilter
// ═════════════════════════════════════
// STRATEGY EXECUTION
// ═════════════════════════════════════
// Long Entry
if longCondition and strategy.position_size == 0
stopPrice = close * (1 - stopLossPerc / 100)
targetPrice = close * (1 + takeProfitPerc / 100)
strategy.entry("Long", strategy.long)
strategy.exit("Long Exit", "Long", stop=stopPrice, limit=targetPrice)
// Short Entry
if shortCondition and strategy.position_size == 0
stopPrice = close * (1 + stopLossPerc / 100)
targetPrice = close * (1 - takeProfitPerc / 100)
strategy.entry("Short", strategy.short)
strategy.exit("Short Exit", "Short", stop=stopPrice, limit=targetPrice)
// Exit on Opposite Extreme
if exitOnOppositeExtreme
if strategy.position_size > 0 and k > OverBought
strategy.close("Long", comment="Exit OB")
if strategy.position_size < 0 and k < OverSold
strategy.close("Short", comment="Exit OS")
// ═════════════════════════════════════
// VISUAL ELEMENTS - STOCHASTIC PANE
// ═════════════════════════════════════
// Plot stochastic lines with gradient colors
kColor = k > OverBought ? color.new(#FF0055, 0) : k < OverSold ? color.new(#00FF88, 0) : color.new(#00BBFF, 0)
dColor = color.new(#FFB300, 30)
plot(k, "Stochastic %K", color=kColor, linewidth=2)
plot(d, "Stochastic %D", color=dColor, linewidth=2)
// Add glow effect to K line
plot(k, "K Glow", color=color.new(kColor, 70), linewidth=4)
// Plot levels
obLine = hline(OverBought, "Overbought", color=color.new(#FF0055, 60), linestyle=hline.style_dashed, linewidth=1)
osLine = hline(OverSold, "Oversold", color=color.new(#00FF88, 60), linestyle=hline.style_dashed, linewidth=1)
midLine = hline(50, "Midline", color=color.new(color.gray, 70), linestyle=hline.style_dotted)
// ═════════════════════════════════════
// FLUORESCENT SIGNAL CIRCLES
// ═════════════════════════════════════
// Long signal - Bright green fluorescent circle
longSignalLevel = longCondition ? k : na
plot(longSignalLevel, "Long Signal", color=color.new(#00FF88, 0), style=plot.style_circles, linewidth=6)
plot(longSignalLevel, "Long Glow", color=color.new(#00FF88, 60), style=plot.style_circles, linewidth=10)
// Short signal - Bright magenta fluorescent circle
shortSignalLevel = shortCondition ? k : na
plot(shortSignalLevel, "Short Signal", color=color.new(#FF0055, 0), style=plot.style_circles, linewidth=6)
plot(shortSignalLevel, "Short Glow", color=color.new(#FF0055, 60), style=plot.style_circles, linewidth=10)
// Exit signals - Orange fluorescent circles
longExitSignal = strategy.position_size[1] > 0 and strategy.position_size == 0
shortExitSignal = strategy.position_size[1] < 0 and strategy.position_size == 0
exitLevel = longExitSignal or shortExitSignal ? k : na
plot(exitLevel, "Exit Signal", color=color.new(#FF8800, 0), style=plot.style_circles, linewidth=4)
plot(exitLevel, "Exit Glow", color=color.new(#FF8800, 70), style=plot.style_circles, linewidth=8)