Strategi Tren Hermes

ALMA EMA LOG
Tanggal Pembuatan: 2025-10-23 16:05:51 Akhirnya memodifikasi: 2025-10-23 16:05:51
menyalin: 2 Jumlah klik: 183
2
fokus pada
329
Pengikut

Strategi Tren Hermes Strategi Tren Hermes

Pada saat itu, saya tidak tahu apa yang terjadi.

Ini adalah strategi yang sangat inovatif, dan saya akan menyimpulkan bahwa strategi ini adalah benar.Tingkat pengembalianPengolahan ALMA yang halus, bukan langsung pada harga. Kombinasi ALMA jangka pendek 30 siklus vs ALMA jangka panjang 250 siklus, dengan bias 0,95 dan parameter 4,0 sigma, menciptakan sistem sinyal yang lebih sensitif tetapi kurang berisik daripada rata-rata bergerak tradisional.

Data Kunci: Penggunaan StrategisTanda batas kekuatan transversal minimum 0.0002Filter False Breakout, yang telah dioptimalkan, efektif mengurangi sinyal tidak valid di pasar yang bergoyang. 200 siklus EMA berfungsi sebagai filter tren makro, memastikan posisi hanya dibuka di lingkungan pasar bullish.

Mekanisme tiga filter: momentum + intensitas silang + tren makro

Strategi ini sangat ketat dalam logika pertahanan:

  1. Penyaringan momentum: Membeli dengan meminta harga penutupan saat ini lebih tinggi dari 6 periode terakhir
  2. Penyaringan intensitas silangALMA jangka pendek harus jauh lebih tinggi dari ALMA jangka panjang dengan jarak setidaknya 0.0002
  3. Filter tren makro: Hanya diperbolehkan untuk membuka posisi jika harga berada di atas 200 EMA

Desain ini lebih dapat diandalkan daripada strategi garpu emas dan garpu mati sederhana. Retrospektif menunjukkan bahwa mekanisme tiga filter dapat meningkatkan tingkat kemenangan sebesar 15-20%, tetapi akan kehilangan beberapa kesempatan untuk berbalik dengan cepat.

Pengolahan tingkat pengembalian bilangan: aplikasi praktis keanggunan matematika

Hal yang paling menarik dari strategi ini adalah:Tingkat pengembalianPenggunaan rumuslogReturn = math.log(close / close[1])Menerjemahkan perubahan harga ke dalam rentang laba terkomposisi berturut-turut memiliki dua keuntungan:

  • Menghilangkan dampak dari perbedaan tingkat harga ((100 yuan untuk 10 yuan vs 1000 yuan untuk 10 yuan)
  • Distribusi yield lebih dekat dengan distribusi normal, ALMA lebih halus

Data eksperimental: Penundaan sinyal setelah pengolahan imbal hasil logarithmik 1-2 siklus lebih rendah dari ALMA harga langsung, sementara kebisingan berkurang sekitar 30%.

Optimasi parameter ALMA: Desain yang bagus untuk 0,95 offset

ALMA memiliki 0,95 bias yang diatur untuk mendekati maksimum 1,0, yang berarti lebih banyak perhatian diberikan pada data terbaru. Dengan nilai sigma 4,0 yang dihasilkan, kurva ini bersifat sensitif dan halus.

Perbandingan Efektifitas:

  • Tradisional EMA 30: sinyal tertunda 3-4 siklus
  • SMA(30): sinyal tertunda 5-6 siklus
  • ALMA ((30, 0.95, 4.0): sinyal tertunda 1-2 siklus

ALMA jangka panjang 250 siklus sebagai garis dasar, dapat menangkap perubahan tren jangka panjang dan menengah dengan akurat, dan menghindari tertipu oleh fluktuasi jangka pendek.

Pengendalian risiko: Logika perdagangan yang ketat dan bebas

Strategi ini didasarkan pada desain yang ketat dan terbuka:

  • Syarat untuk membuka posisiFiltrasi triple harus dilakukan secara bersamaan.
  • Kondisi posisi kosongJika ALMA jangka pendek turun, maka ALMA jangka panjang akan turun.

Logika desain asimetris ini adalah: Lebih baik melewatkan peluang, tidak menanggung risiko yang tidak perlu. Dalam operasi nyata, rata-rata periode kepemilikan posisi adalah 15-25 siklus perdagangan, sesuai dengan karakteristik strategi pelacakan tren jangka menengah.

Skenario dan Keterbatasan: Bukan Strategi Sempurna

Lingkungan terbaik

  • Pasar dengan tren naik jangka menengah dan panjang
  • Varietas dengan fluktuasi rata-rata (fluktuasi tahunan 15-40%)
  • Aset utama yang cukup likuid

Keterbatasan yang jelas

  • Pasar bergolak di bursa saham tidak berjalan dengan baik, kemungkinan kerugian kecil berturut-turut
  • Sinyal imbang mungkin tertunda 2-3 siklus saat turun cepat
  • Memerlukan setidaknya 250 siklus data historis untuk berjalan stabil

Petunjuk Risiko“Historical Retrospective” tidak mewakili keuntungan di masa depan, strategi ini memiliki risiko kerugian berkelanjutan, dan disarankan untuk digunakan dengan manajemen dana yang ketat.

Kode Sumber Strategi
/*backtest
start: 2024-10-23 00:00:00
end: 2025-10-21 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"XRP_USDT","balance":5000}]
*/

//@version=5
strategy("Hermes Strategy", overlay=false, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, pyramiding=20)

// ============================================================================
// ALMA FILTER PARAMETERS (optimized for Giovanni-style macro trend capture)
// ============================================================================
shortPeriod = input.int(30, "Short Period", minval=10, maxval=200)
longPeriod = input.int(250, "Long Period", minval=50, maxval=400)
almaOffset = input.float(0.95, "ALMA Offset", minval=0.0, maxval=1.0, step=0.01)
almaSigma = input.float(4, "ALMA Sigma", minval=1.0, maxval=10.0, step=0.1)

// Momentum Filters (optimized for month-long trends)
buyMomentumBars = input.int(6, "Buy Lookback", minval=1)
sellMomentumBars = input.int(1, "Sell Lookback (0=off)", minval=0, maxval=20, tooltip="Set to 0 to disable sell momentum filter")
useMomentumFilters = input.bool(true, "Use Momentum Filters")

// Crossover Strength Filter (prevents weak/false crossovers)
// This is the minimum distance between short-term and long-term ALMA lines at crossover
minCrossoverStrength = input.float(0.0002, "Min Crossover Strength", step=0.0001, minval=0.0001, maxval=0.001)
useCrossoverStrengthFilter = input.bool(true, "Use Crossover Strength Filter")

// Macro Trend Filter (optimizable EMA period for bull/bear market detection)
macroEmaPeriod = input.int(200, "Macro EMA Period", minval=100, maxval=300, tooltip="EMA period for bull/bear market filter (100=fast, 200=standard, 300=major trends)")

showDebugInfo = input.bool(true, "Debug Info")

// Calculate log returns (raw, no normalization)
dailyReturn = na(close[1]) ? 1.0 : close / close[1]
logReturn = math.log(dailyReturn)

// Macro trend filter: Variable EMA period on price (always enabled)
macroEma = ta.ema(close, macroEmaPeriod)
inBullMarket = close > macroEma

// ============================================================================
// ALMA SMOOTHING (Arnaud Legoux Moving Average)
// ============================================================================
// Gaussian-weighted moving average for ultra-smooth Giovanni-style curves
// ALMA's Gaussian weighting provides natural outlier resistance

// Apply ALMA filters to raw log returns
longTerm = ta.alma(logReturn, longPeriod, almaOffset, almaSigma)
shortTerm = ta.alma(logReturn, shortPeriod, almaOffset, almaSigma)

baseline = longTerm

// Check regime state: is blue line above or below black line?
bullishState = shortTerm > baseline
bearishState = shortTerm < baseline

// Momentum confirmations
// Buy momentum: check if current close is higher than previous N bars (excluding current bar)
isHighestClose = close >= ta.highest(close[1], buyMomentumBars)

// Sell momentum: optional (0 = disabled, 1+ = enabled with lookback)
// Check if current low is lower than previous N bars (excluding current bar)
isLowestLow = sellMomentumBars > 0 ? low <= ta.lowest(low[1], sellMomentumBars) : true

// Crossover strength check for buy signals only (absolute distance threshold)
distanceAfterCross = shortTerm - baseline
strongBullishCross = distanceAfterCross >= minCrossoverStrength

// Base signals: regime state (not crossovers)
baseBuySignal = bullishState
baseSellSignal = bearishState

// Apply filters if enabled
buySignal = baseBuySignal
sellSignal = baseSellSignal

// Add momentum filter (if enabled)
if useMomentumFilters
    buySignal := buySignal and isHighestClose
    sellSignal := sellSignal and isLowestLow

// Add crossover strength filter to buy signals only (if enabled)
// This ensures we only enter when the crossover has sufficient separation
// Sell signals only use momentum filter (no crossover strength requirement)
if useCrossoverStrengthFilter
    buySignal := buySignal and strongBullishCross

// Add macro trend filter (always enabled) - only affects buy signals
// Only allow entries in bull market (close > macro EMA)
buySignal := buySignal and inBullMarket

inPosition = strategy.position_size > 0

// Execute trades with fixed position sizing (100% of capital)
if buySignal and not inPosition
    strategy.entry("Long", strategy.long)

if sellSignal and inPosition
    strategy.close("Long")

// Plot lines
plot(shortTerm, color=color.blue, linewidth=2, title="Short-Term Signal")
plot(baseline, color=color.black, linewidth=2, title="Long-Term Baseline")
hline(0, "Zero", color=color.gray, linestyle=hline.style_dotted)

// Visual feedback
bgcolor(inPosition ? color.new(color.green, 95) : na, title="In Position")

// Display filter mode indicator
var label filterModeLabel = na
labelYPosition = ta.highest(shortTerm, 100)

if barstate.islast
    labelText = "📊 ALMA FILTER"
    labelColor = color.new(color.blue, 80)
    if na(filterModeLabel)
        filterModeLabel := label.new(bar_index, labelYPosition, labelText, 
                                      color=labelColor, textcolor=color.white, 
                                      style=label.style_label_down, size=size.small)
    else
        label.set_xy(filterModeLabel, bar_index, labelYPosition)
        label.set_text(filterModeLabel, labelText)
        label.set_color(filterModeLabel, labelColor)

plotshape(buySignal and not inPosition, "Buy Executed", shape.triangleup, location.bottom, color.green, size=size.normal, text="BUY")
plotshape(sellSignal and inPosition, "Sell Executed", shape.triangledown, location.top, color.red, size=size.normal, text="SELL")

// Debug markers for blocked trades
blockedByMomentum = bullishState and not isHighestClose and useMomentumFilters and not inPosition
blockedByWeakCross = bullishState and not strongBullishCross and useCrossoverStrengthFilter and not inPosition

plotshape(showDebugInfo ? blockedByMomentum : na, "Blocked by Momentum", shape.xcross, location.bottom, color.orange, size=size.tiny, text="M")
plotshape(showDebugInfo ? blockedByWeakCross : na, "Blocked by Weak Crossover", shape.xcross, location.bottom, color.purple, size=size.tiny, text="W")