Strategi Mengikuti Trend Heiken Asch: Sistem pengenalan arah aliran berbilang masa dengan mekanisme stop loss berbilang peringkat

supertrend ADX ATR HEIKEN ASHI DMI
Tarikh penciptaan: 2025-04-14 11:31:37 Akhirnya diubah suai: 2025-04-14 11:31:37
Salin: 1 Bilangan klik: 502
2
fokus pada
319
Pengikut

Strategi Mengikuti Trend Heiken Asch: Sistem pengenalan arah aliran berbilang masa dengan mekanisme stop loss berbilang peringkat Strategi Mengikuti Trend Heiken Asch: Sistem pengenalan arah aliran berbilang masa dengan mekanisme stop loss berbilang peringkat

Gambaran keseluruhan

Strategi pengesanan trend Heiken Ashi adalah sistem perdagangan komprehensif yang menggabungkan kelebihan carta Heiken Ashi, indikator trend super dan penapis indeks arah rata-rata ((ADX) yang bertujuan untuk mengenal pasti pergerakan trend yang kuat dan menjalankan pengurusan wang yang berkesan. Strategi ini memberi tumpuan kepada menangkap momentum dalam trend yang telah ditubuhkan, sambil menggunakan mekanisme berhenti kerugian tiga tingkat yang canggih untuk melindungi wang dan mengunci keuntungan.

Prinsip Strategi

Strategi pengesanan trend Heiken Achievements adalah berdasarkan kepada sinergi tiga petunjuk teknikal utama:

  1. Analisis peta Haiken AchinStrategi ini memberi tumpuan khusus kepada “entiti” Haiken Axiom yang hampir tidak mempunyai garis bawah, yang menunjukkan harga bergerak secara tegas dalam satu arah, dengan hampir tidak ada penyesuaian, yang menunjukkan momentum yang kuat dan kesinambungan trend. Axiom hijau yang tidak mempunyai garis bawah dianggap sebagai sinyal ganda, dan axiom merah yang tidak mempunyai garis atas dianggap sebagai sinyal kosong.

  2. Penapis penunjuk trend superSistem menggunakan penunjuk trend super ((faktor lalai: 3.0, kitaran ATR: 10) untuk mengesahkan arah trend yang berpotensi. Isyarat masuk mestilah selaras dengan arah trend super, yang meningkatkan kebolehpercayaan isyarat dan mengurangkan perdagangan yang salah.

  3. Penapis ADX (pilihan)Indeks Arahan Rata-rata digunakan untuk menilai kekuatan trend, perdagangan hanya dicetuskan apabila ADX melebihi had yang ditetapkan (default: 25), yang membantu menyaring isyarat bising dalam pasaran goyah atau melintang.

Sistem perdagangan mempunyai peraturan masuk dan keluar yang jelas:

  • Isyarat masukIa terbentuk apabila syarat-syarat berikut dipenuhi: 1) Heiken Axial hijau tanpa garis bawah (perlu dilakukan lebih) atau Heiken Axial merah tanpa garis atas (perlu dilakukan kosong); 2) Pengesahan arah trend super; 3) Had ADX (jika diaktifkan).
  • Isyarat keluar: Perdagangan berakhir apabila terdapat binari yang berlawanan arah atau apabila mana-mana mekanisme penangguhan berlaku.

Strategi yang paling ketara ialah sistem tiga tahap yang inovatif:

  1. ATR Tracking Stop LossBergantung kepada turun naik pasaran, anda boleh mengubah kedudukan henti anda secara dinamik dan mengunci keuntungan anda mengikut trend.
  2. Stop loss berayunMenggunakan struktur semula jadi pasaran (paling tinggi / rendah terkini dalam tempoh tinjauan semula) untuk menetapkan titik henti yang menghormati kadar pasaran sendiri.
  3. Insurans terhadGaris keselamatan yang disusun berdasarkan peratusan harga kemasukan, memberikan perlindungan modal segera, terutamanya apabila kedudukan berhenti titik berayun mungkin terlalu jauh dari titik kemasukan.

Kelebihan Strategik

  1. Pengurusan risiko berlapisSistem Tiga Lapisan Stop memberikan perlindungan dana yang menyeluruh untuk menyesuaikan diri dengan keadaan pasaran dan senario risiko yang berbeza, yang merupakan kelebihan strategi yang paling ketara.

  2. Sangat boleh menyesuaikan diriSemua komponen ((super trend, ADX) boleh dihidupkan / dimatikan mengikut keadaan pasaran yang berbeza, parameter juga boleh disesuaikan, menjadikan strategi mempunyai fleksibiliti yang tinggi.

  3. Keupayaan untuk menangkap trend yang kuatDengan menggabungkan isyarat visual yang jelas dari Hyke Achim, pengesahan supertrend, dan penilaian kekuatan trend dari ADX, strategi ini dapat mengesan pergerakan trend yang kuat.

  4. Maklumat visual yang jelasStrategi memaparkan status kedudukan, harga masuk, dan tahap stop loss semasa pada carta, yang membolehkan peniaga memahami dan mengesan pelaksanaan strategi secara intuitif.

  5. Pengurusan dana dalamanStrategi menggunakan pengurusan kedudukan berdasarkan peratusan hak dan kepentingan (default: 3%) yang memastikan bahawa celah risiko tetap konsisten dengan perubahan saiz akaun.

  6. Sistem perdagangan yang lengkap: Menyediakan proses perdagangan yang lengkap dari isyarat masuk ke peraturan keluar, tanpa perlu membuat keputusan tambahan atau petunjuk.

Risiko Strategik

  1. Risiko yang terlalu optimumStrategi mengandungi beberapa parameter yang boleh disesuaikan, yang boleh menyebabkan masalah kesesuaian kurva, iaitu strategi berfungsi dengan baik pada data sejarah, tetapi tidak berfungsi dengan baik dalam perdagangan masa nyata. Penyelesaian adalah dengan menggunakan data sejarah yang cukup lama untuk melakukan retesting dan menguji ketahanan strategi dalam keadaan pasaran yang berbeza.

  2. Risiko pembalikan arah aliranWalaupun mempunyai mekanisme stop loss bertingkat, strategi ini masih boleh menghadapi penarikan balik yang lebih besar apabila trend yang kuat tiba-tiba berbalik. Ketegangan yang melampau di pasaran yang tiba-tiba boleh menyebabkan stop loss gagal tercetus dalam masa yang tepat, menyebabkan kerugian melebihi jangkaan. Penyelesaian adalah dengan mempertimbangkan untuk menambah penapis kadar turun naik atau melaksanakan peraturan pengurusan risiko yang lebih ketat.

  3. Kepekaan ParameterPengaturan parameter yang berbeza boleh menyebabkan hasil yang sangat berbeza, terutamanya faktor trend super dan ADX. Ini memerlukan peniaga untuk memahami dengan mendalam kesan setiap parameter dan mencari titik keseimbangan yang sesuai dengan keadaan pasaran tertentu.

  4. Keadaan yang kurang stabilDalam pasaran yang rendah turun naik atau berlainan arah, strategi ini mungkin menghasilkan beberapa isyarat yang salah, yang menyebabkan perdagangan “bergoyang”. Penyelesaian adalah untuk menghentikan perdagangan dalam keadaan seperti itu, atau menambah penapis persekitaran pasaran tambahan.

  5. Risiko pengurusan danaPengurusan kedudukan peratusan tetap mungkin tidak sesuai untuk semua keadaan pasaran, dan saiz kedudukan mungkin perlu dikurangkan untuk mengawal risiko dalam pasaran yang sangat bergolak.

Arah pengoptimuman strategi

  1. Meningkatkan mekanisme adaptasi yang tidak menentuStrategi semasa boleh dioptimumkan lagi dengan memperkenalkan penapis turun naik, seperti penunjuk kadar turun naik bersejarah (HV) atau kadar turun naik tersirat (IV) untuk menyesuaikan parameter secara automatik dalam keadaan pasaran yang berbeza. Ini akan membolehkan strategi mengekalkan prestasi yang stabil semasa turun naik tinggi dan turun naik rendah.

  2. Penapis masa bersepaduPertimbangkan untuk menambah penapis berasaskan masa untuk mengelakkan dagangan pada tempoh masa yang diketahui kurang turun naik atau trend pasaran yang lemah. Ini sangat berguna untuk perdagangan varieti tertentu, kerana varieti yang berbeza menunjukkan ciri tingkah laku yang berbeza pada tempoh masa yang berbeza dalam sehari.

  3. Memperkenalkan pengoptimuman pembelajaran mesinIa boleh menggunakan teknologi pembelajaran mesin untuk mengenal pasti kombinasi parameter terbaik secara automatik dan bukannya bergantung pada tetapan parameter statik. Ia boleh memprediksi tetapan parameter mana yang mungkin terbaik dalam keadaan pasaran tertentu pada masa akan datang dengan menganalisis corak dalam data sejarah.

  4. Menambah penapis pasaran berkaitanMeningkatkan isyarat masuk dengan melihat kelakuan pasaran atau indeks yang berkaitan, contohnya dengan mempertimbangkan trend pasaran keseluruhan atau kekuatan pasaran yang berkaitan semasa berdagang varieti tertentu.

  5. Optimumkan mekanisme penangguhanSistem tiga hala yang sedia ada boleh dioptimumkan lebih jauh, misalnya dengan menyesuaikan peratusan insurans yang terhad kepada pergerakan yang berubah-ubah, atau dengan menggunakan tahap sokongan / rintangan untuk menetapkan titik-titik terhad yang bergoyang dengan tepat, dan bukan hanya pada tahap yang tinggi atau rendah.

  6. Analisis jumlah transaksi yang disatukan: Menambah penapis jumlah transaksi semasa proses pengesahan isyarat untuk memastikan pergerakan harga disokong oleh jumlah transaksi yang mencukupi, yang meningkatkan kebolehpercayaan isyarat.

ringkaskan

Strategi pengesanan trend Haiken Ashi adalah sistem perdagangan yang kompleks dan menyeluruh yang memberi tumpuan kepada menangkap peluang momentum dalam trend yang kuat melalui kombinasi unik carta Haiken Ashi, penunjuk super trend dan penapis ADX. Sistem stop loss tiga tingkatnya menyediakan pengurusan risiko yang menyeluruh, sementara parameter yang boleh disesuaikan membolehkan ia menyesuaikan diri dengan pelbagai keadaan pasaran.

Kelebihan utama strategi ini adalah isyarat visual yang jelas, keupayaan untuk mengenal pasti trend yang kuat dan mekanisme perlindungan wang yang komprehensif. Walau bagaimanapun, peniaga harus sedar tentang cabaran pengoptimuman parameter dan potensi batasan dalam persekitaran yang rendah.

Strategi ini dapat meningkatkan lagi kestabilan dan kesesuaian dengan melaksanakan arah pengoptimuman yang disyorkan, seperti menambah mekanisme penyesuaian turun naik, mengintegrasikan penapis masa dan analisis jumlah dagangan. Akhirnya, strategi pengesanan trend Heiken Aashi mewakili pendekatan seimbang yang menggabungkan isyarat yang jelas dari analisis teknikal dan prinsip pengurusan risiko sistematik, memberikan alat yang berharga kepada pedagang yang mengikuti trend.

Kod sumber strategi
/*backtest
start: 2025-01-01 00:00:00
end: 2025-04-12 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=5
strategy("Heiken Ashi Supertrend ADX - Strategy", overlay=true, initial_capital=1000, commission_type=strategy.commission.percent, commission_value=0, calc_on_every_tick=true, process_orders_on_close=false, default_qty_type=strategy.percent_of_equity, default_qty_value=3)


// Supertrend Settings
useSupertrend = input.bool(true, "Use Supertrend for Entries", group="Supertrend Settings")
atrPeriod = input.int(10, "ATR Period", minval=1, group="Supertrend Settings")
factor = input.float(3.0, "Supertrend Factor", minval=0.5, step=0.1, group="Supertrend Settings")

// ADX Filter Settings
useAdxFilter = input.bool(false, "Use ADX Filter", group="ADX Filter")
adxPeriod = input.int(14, "ADX Period", minval=1, group="ADX Filter")
adxThreshold = input.float(25, "ADX Threshold", minval=0, group="ADX Filter")

// Stop Loss Options
useSwingStop = input.bool(false, "Use Swing Point Stop", group="Stop Loss Options")
swingLookback = input.int(3, "Swing Lookback Periods", minval=1, maxval=20, group="Stop Loss Options")

useSafetyNetStop = input.bool(true, "Use Insurance Stop", group="Stop Loss Options")
safetyNetPercent = input.float(5.0, "Insurance Stop Loss Percent", minval=0.1, step=0.1, group="Stop Loss Options")

// Trailing Stop Loss Settings
useTrailingStop = input.bool(true, "Use ATR Trailing Stop", group="Stop Loss Options")
trailAtrMultiplier = input.float(2.0, "Trailing Stop ATR Multiplier", minval=0.1, step=0.1, group="Stop Loss Options")

// Get HA data for signals
ha_security = ticker.heikinashi(syminfo.tickerid)
[o, h, l, c] = request.security(ha_security, timeframe.period, [open, high, low, close])

// Get real price data
real_open = open
real_high = high
real_low = low
real_close = close

// Calculate Supertrend using built-in function with real price data
[supertrend, direction] = ta.supertrend(factor, atrPeriod)
supertrend := barstate.isfirst ? na : supertrend

// Determine if we're in an uptrend or downtrend based on Supertrend
isUptrend = direction < 0   // In TradingView, negative direction means uptrend
isDowntrend = direction > 0 // In TradingView, positive direction means downtrend

// Calculate ATR for visualization
atrValue = ta.atr(atrPeriod)

// Calculate ADX and Trade Logic
[diplus, diminus, adx] = ta.dmi(adxPeriod, adxPeriod)
int trade = 0
if trade == 0 and diplus > diminus
    trade := 1
else if trade == 0 and diminus > diplus
    trade := -1
else if trade == 1 and diminus > diplus
    trade := -1
else if trade == -1 and diplus > diminus
    trade := 1
else
    trade := trade[1]

// Combine with ADX Threshold
isAdxBullish = diplus > diminus and adx > adxThreshold
isAdxBearish = diminus > diplus and adx > adxThreshold

// Debug ADX Values (only if needed for development)
// plot(adx, "ADX", color=color.orange, linewidth=1)
// plot(diplus, "DI+", color=color.green, linewidth=1)
// plot(diminus, "DI-", color=color.red, linewidth=1)
// hline(adxThreshold, "ADX Threshold", color=color.gray, linestyle=hline.style_dashed)

// Check for wicks on the current candle
threshold = syminfo.mintick * 0.1
noBottomWick = math.abs(math.min(o, c) - l) <= threshold
noTopWick = math.abs(h - math.max(o, c)) <= threshold

// Identify candle color and signal conditions
isGreenCandle = c > o
isRedCandle = c < o

// KEY INTEGRATION: Color the real bars based on HA trend
bullishColor = color.green   // Green for long/bullish
bearishColor = color.purple  // Purple for short/bearish
barcolor(isGreenCandle ? bullishColor : bearishColor)

// Signal conditions for both entry and exit
longCondition = (isGreenCandle and noBottomWick and barstate.isconfirmed) and (not useSupertrend or isUptrend) and (not useAdxFilter or isAdxBullish)

shortCondition = (isRedCandle and noTopWick and barstate.isconfirmed) and (not useSupertrend or isDowntrend) and (not useAdxFilter or isAdxBearish)

exitLongCondition = isRedCandle and noTopWick and barstate.isconfirmed
exitShortCondition = isGreenCandle and noBottomWick and barstate.isconfirmed

// Calculate swing points based on real candles (not HA)
swingLow = ta.lowest(real_low, swingLookback)
swingHigh = ta.highest(real_high, swingLookback)

// Position tracking
var int position = 0  // 0 = no position, 1 = long, -1 = short
var float entryPrice = na
var float trailStopLevel = na  // For ATR trailing stop
var float swingStopLevel = na  // For swing point stop
var float safetyNetStopLevel = na  // For safety net stop
var float highestSinceEntry = na  // For tracking highest price since entry (for long positions)
var float lowestSinceEntry = na   // For tracking lowest price since entry (for short positions)

// Alert variables
var bool longAlert = false
var bool shortAlert = false
var bool exitLongAlert = false
var bool exitShortAlert = false

// Reset alerts each bar
longAlert := false
shortAlert := false
exitLongAlert := false
exitShortAlert := false

// Handle entries and exits
if longCondition and (position <= 0)
    if position < 0
        exitShortAlert := true
        strategy.close("Short", comment="Exit Short")
        position := 0
    longAlert := true
    strategy.entry("Long", strategy.long, comment="Enter Long")
    position := 1
    entryPrice := real_close
    highestSinceEntry := real_close
    lowestSinceEntry := na
    // Initialize trailing stops
    if useTrailingStop
        trailStopLevel := real_close - (atrValue * trailAtrMultiplier)
    // Initialize swing point stop
    if useSwingStop
        swingStopLevel := swingLow
    // Initialize safety net stop
    if useSafetyNetStop
        safetyNetStopLevel := real_close * (1 - safetyNetPercent / 100)
        
if shortCondition and (position >= 0)
    if position > 0
        exitLongAlert := true
        strategy.close("Long", comment="Exit Long")
        position := 0
    shortAlert := true
    strategy.entry("Short", strategy.short, comment="Enter Short")
    position := -1
    entryPrice := real_close
    highestSinceEntry := na
    lowestSinceEntry := real_close
    // Initialize trailing stops
    if useTrailingStop
        trailStopLevel := real_close + (atrValue * trailAtrMultiplier)
    // Initialize swing point stop
    if useSwingStop
        swingStopLevel := swingHigh
    // Initialize safety net stop
    if useSafetyNetStop
        safetyNetStopLevel := real_close * (1 + safetyNetPercent / 100)

if position > 0 and exitLongCondition
    exitLongAlert := true
    strategy.close("Long", comment="Exit Long Signal")
    position := 0
    trailStopLevel := na
    swingStopLevel := na
    safetyNetStopLevel := na
    highestSinceEntry := na

if position < 0 and exitShortCondition
    exitShortAlert := true
    strategy.close("Short", comment="Exit Short Signal")
    position := 0
    trailStopLevel := na
    swingStopLevel := na
    safetyNetStopLevel := na
    lowestSinceEntry := na

// Check for swing point stop hit
if useSwingStop and position != 0 and not na(swingStopLevel)
    // For long positions, check if price drops below the swing low
    if position > 0 and real_low <= swingStopLevel
        strategy.close("Long", comment="Swing Point Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        highestSinceEntry := na
        
    // For short positions, check if price rises above the swing high
    else if position < 0 and real_high >= swingStopLevel
        strategy.close("Short", comment="Swing Point Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        lowestSinceEntry := na

// Check for safety net stop loss hit
if useSafetyNetStop and position != 0 and not na(safetyNetStopLevel)
    // For long positions, check if price drops below the safety net level
    if position > 0 and real_low <= safetyNetStopLevel
        strategy.close("Long", comment="Safety Net Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        highestSinceEntry := na
        
    // For short positions, check if price rises above the safety net level
    else if position < 0 and real_high >= safetyNetStopLevel
        strategy.close("Short", comment="Safety Net Stop Hit")
        position := 0
        trailStopLevel := na
        swingStopLevel := na
        safetyNetStopLevel := na
        lowestSinceEntry := na

// Track highest/lowest prices for trailing stop calculation
if position > 0 and not na(highestSinceEntry)
    highestSinceEntry := math.max(highestSinceEntry, real_high)
    
if position < 0 and not na(lowestSinceEntry)
    lowestSinceEntry := math.min(lowestSinceEntry, real_low)

// Update and check trailing stop (ATR-based)
if useTrailingStop and position != 0 and not na(trailStopLevel)
    // Update trailing stop level for long positions
    if position > 0
        // Calculate new potential trailing stop level
        trailStopNew = real_close - (atrValue * trailAtrMultiplier)
        // Only move the stop up, never down
        if trailStopNew > trailStopLevel
            trailStopLevel := trailStopNew
        // Check if price hit stop
        if real_low <= trailStopLevel
            strategy.close("Long", comment="ATR Trailing Stop Hit")
            position := 0
            trailStopLevel := na
            swingStopLevel := na
            safetyNetStopLevel := na
            highestSinceEntry := na
            
    // Update trailing stop level for short positions
    else if position < 0
        // Calculate new potential trailing stop level
        trailStopNew = real_close + (atrValue * trailAtrMultiplier)
        // Only move the stop down, never up
        if trailStopNew < trailStopLevel
            trailStopLevel := trailStopNew
        // Check if price hit stop
        if real_high >= trailStopLevel
            strategy.close("Short", comment="ATR Trailing Stop Hit")
            position := 0
            trailStopLevel := na
            swingStopLevel := na
            safetyNetStopLevel := na
            lowestSinceEntry := na

// Plot stop loss levels
plot(useTrailingStop and position != 0 ? trailStopLevel : na, "ATR Trailing Stop", color=color.yellow, style=plot.style_linebr, linewidth=1)
plot(useSwingStop and position != 0 ? swingStopLevel : na, "Swing Point Stop", color=color.red, style=plot.style_circles, linewidth=2)
plot(useSafetyNetStop and position != 0 ? safetyNetStopLevel : na, "Insurance Stop", color=color.yellow, style=plot.style_circles, linewidth=1)

// Visual signals for chart (just entry/exit markers, no ADX labels)
plotshape(longAlert, title="Long Entry", location=location.abovebar, color=bullishColor, style=shape.triangleup, size=size.small)
plotshape(shortAlert, title="Short Entry", location=location.belowbar, color=bearishColor, style=shape.triangledown, size=size.small)
plotshape(exitLongAlert, title="Long Exit Signal", location=location.abovebar, color=bullishColor, style=shape.xcross, size=size.small)
plotshape(exitShortAlert, title="Short Exit Signal", location=location.belowbar, color=bearishColor, style=shape.xcross, size=size.small)

// Supertrend visualization
bodyMiddlePlot = plot((real_open + real_close) / 2, "Body Middle", display=display.none)
upTrend = plot(useSupertrend and isUptrend ? supertrend : na, "Up Trend", color=bullishColor, style=plot.style_linebr, linewidth=1)
downTrend = plot(useSupertrend and isDowntrend ? supertrend : na, "Down Trend", color=bearishColor, style=plot.style_linebr, linewidth=1)
fill(upTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bullishColor, 85) : na, title="Uptrend Background")
fill(downTrend, bodyMiddlePlot, color=useSupertrend ? color.new(bearishColor, 85) : na, title="Downtrend Background")

// Position background
bgcolor(position == 1 ? color.new(bullishColor, 85) : position == -1 ? color.new(bearishColor, 85) : na, title="Position Background")

// Position label
var label positionLabel = na
label.delete(positionLabel)
if barstate.islast
    positionText = position == 1 ? "LONG" : position == -1 ? "SHORT" : "FLAT"
    entryInfo = not na(entryPrice) ? "\nEntry: " + str.tostring(entryPrice, "#.00000") : ""
    atrStopInfo = useTrailingStop and not na(trailStopLevel) ? "\nATR Stop: " + str.tostring(trailStopLevel, "#.00000") + " (" + str.tostring(trailAtrMultiplier, "#.0") + "x ATR)" : ""
    swingStopInfo = useSwingStop and not na(swingStopLevel) ? "\nSwing Stop: " + str.tostring(swingStopLevel, "#.00000") + " (" + str.tostring(swingLookback) + " bars)" : ""
    safetyNetInfo = useSafetyNetStop and not na(safetyNetStopLevel) ? "\nInsurance Stop: " + str.tostring(safetyNetStopLevel, "#.00000") + " (" + str.tostring(safetyNetPercent, "#.0") + "%)" : ""
    supertrendInfo = useSupertrend ? "\nSupertrend: " + (isUptrend ? "UPTREND" : "DOWNTREND") : ""
    positionColor = position == 1 ? bullishColor : position == -1 ? bearishColor : color.gray
    positionLabel := label.new(bar_index, high, positionText + entryInfo + atrStopInfo + swingStopInfo + safetyNetInfo + supertrendInfo, color=positionColor, style=label.style_label_down, textcolor=color.white)