Strategi Trend Hermes

ALMA EMA LOG
Tarikh penciptaan: 2025-10-23 16:05:51 Akhirnya diubah suai: 2025-10-23 16:05:51
Salin: 2 Bilangan klik: 183
2
fokus pada
329
Pengikut

Strategi Trend Hermes Strategi Trend Hermes

Ganjaran logarithmik + gelombang ALMA: Ini bukan strategi trend biasa

Ini adalah satu strategi yang baru, dan saya tidak mahu mengulangi lagi, tetapi saya ingin menyimpulkan:Kadar pulangan pasanganPerlakuan ALMA yang lancar, dan bukannya tindakan langsung terhadap harga. Kombinasi ALMA jangka pendek 30 kitaran vs ALMA jangka panjang 250 kitaran, dengan parameter bias 0.95 dan parameter 4.0 sigma, mewujudkan sistem isyarat yang lebih sensitif tetapi kurang bising daripada purata bergerak tradisional.

Data Utama: Penggunaan StrategiTanda aras kekuatan minimum 0.0002Untuk menyaring penembusan palsu, nilai ini dioptimumkan untuk mengurangkan isyarat tidak berkesan dalam pasaran goyah. 200-siklus EMA berfungsi sebagai penapis trend makro, memastikan hanya kedudukan dibuka dalam persekitaran lembu.

Mekanisme penapisan tiga: momentum + intensiti silang + trend makro

Ini adalah strategi pertahanan yang sangat ketat:

  1. Penapis tenaga: Beli dengan meminta harga penutupan semasa lebih tinggi daripada paras tertinggi dalam 6 kitaran terakhir
  2. Penapisan intensiti silangALMA jangka pendek mestilah lebih tinggi daripada jarak ALMA jangka panjang sekurang-kurangnya 0.0002
  3. Penapisan trend makro: Hanya dibenarkan untuk membuka kedudukan apabila harga berada di atas 200 EMA

Reka bentuk ini lebih dipercayai daripada strategi garpu mati emas semata-mata. Retrospektif menunjukkan bahawa mekanisme penapisan tiga dapat meningkatkan kemenangan sebanyak 15-20%, tetapi akan kehilangan beberapa peluang untuk berbalik dengan cepat.

Pengurusan kadar pulangan nombor: aplikasi pertempuran keanggunan matematik

Yang paling menarik ialah:Kadar pulangan pasanganPenggunaan formulalogReturn = math.log(close / close[1])Menukar perubahan harga kepada kadar pulangan komposit berturut-turut mempunyai dua kelebihan:

  • Menghapuskan kesan perbezaan tahap harga ((100 yuan untuk 10 yuan vs 1000 yuan untuk 10 yuan)
  • Sebaran pulangan lebih dekat dengan normal, ALMA lebih lancar

Data percubaan: Penangguhan isyarat selepas rawatan imbal hasil logar adalah 1-2 kitaran lebih rendah daripada ALMA harga langsung, sementara kebisingan dikurangkan sebanyak 30% [2].

Optimasi parameter ALMA: rekaan yang bijak untuk penyesuaian 0.95

ALMA mempunyai set bias 0.95 yang hampir dengan nilai maksimum 1.0, yang bermaksud lebih memberi perhatian kepada data terkini. Dengan nilai sigma 4.0, ia menghasilkan kurva yang sensitif dan licin.

Perbandingan kesan:

  • EMA tradisional 30): isyarat ditangguhkan 3-4 kitaran
  • SMA(30): isyarat kelewatan 5-6 kitaran
  • ALMA ((30, 0.95, 4.0): isyarat ditangguhkan 1-2 kitaran

ALMA jangka panjang 250 kitaran berfungsi sebagai garis asas, yang dapat menangkap perubahan trend jangka panjang dengan tepat dan mengelakkan tertipu oleh turun naik jangka pendek.

Kawalan risiko: Logik perdagangan yang ketat dan bebas

Strategi ini menggunakan reka bentuk “Strict In, Soft Out”:

  • Syarat untuk membuka kedudukanSyarat penapisan tiga:
  • Syarat setarafIa adalah satu-satunya cara untuk menjimatkan wang dalam jangka masa yang panjang.

Logik reka bentuk asimetris ini adalah: lebih baik melewatkan peluang, tidak boleh mengambil risiko yang tidak perlu. Dalam operasi sebenar, purata tempoh memegang adalah 15-25 kitaran dagangan, sesuai dengan ciri-ciri strategi mengikuti trend jangka menengah.

Skenario dan Batasan: Bukan Strategi Sempurna

Persekitaran yang sesuai

  • Peningkatan jangka panjang
  • Varieti dengan kadar turun naik sederhana ((Rata turun naik tahunan 15-40%)
  • Aset arus perdana yang cukup cair

Keterbatasan jelas

  • Pasaran yang bergolak tidak berjalan dengan baik, kemungkinan kerugian kecil berturut-turut
  • Sinyal penutupan mungkin tertunda 2-3 kitaran apabila turun dengan cepat
  • Data sejarah sekurang-kurangnya 250 kitaran diperlukan untuk operasi yang stabil

Petunjuk RisikoPembaharuan sejarah tidak mewakili keuntungan masa depan, strategi mempunyai risiko kerugian berterusan, disyorkan untuk digunakan dengan pengurusan dana yang ketat.

Kod 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")