Strategi sasaran berbilang peringkat dan trailing stop loss

HEIKIN ASHI HA TARGET ZONE Trailing Stop PYRAMIDING BREAK-EVEN risk management
Tarikh penciptaan: 2025-03-31 16:20:21 Akhirnya diubah suai: 2025-03-31 16:20:21
Salin: 1 Bilangan klik: 309
2
fokus pada
319
Pengikut

Strategi sasaran berbilang peringkat dan trailing stop loss Strategi sasaran berbilang peringkat dan trailing stop loss

Gambaran keseluruhan

Strategi sasaran dan hentian berturut-turut bertingkat adalah sistem pengesanan trend berdasarkan model carta Heinsey yang direka untuk menangkap pergerakan pasaran dan melindungi keuntungan. Strategi ini membenarkan kemasukan awal dan kemasukan kedua (pyramidal), dengan sasaran keuntungan dan hentian kerugian yang berasingan untuk setiap kemasukan. Ia menggunakan kawasan sasaran dinamik untuk mengembangkan potensi keuntungan dan melaksanakan sistem hentian berturut-turut yang fleksibel untuk mengunci keuntungan apabila harga bergerak ke arah yang menguntungkan.

Prinsip Strategi

Strategi ini beroperasi berdasarkan beberapa prinsip utama:

  1. Isyarat peta Heineken: Gunakan carta Heineken untuk menyaring kebisingan pasaran dan mengenal pasti trend. Isyarat multihead dicetuskan apabila harga penutupan HA semasa lebih tinggi daripada harga penutupan HA dan lebih tinggi daripada harga penutupan HA sebelumnya; isyarat kosong sebaliknya.

  2. Sistem kemasukan dua tingkat:

    • Pendaftaran pertama: Berdasarkan isyarat HA awal, menetapkan sasaran dan tahap kemusnahan yang telah ditetapkan
    • Pendaftaran kedua: Pendaftaran tambahan dibenarkan jika pasaran terus menunjukkan isyarat HA yang baik selepas sasaran pertama dicapai
  3. Menembusi Perlindungan Keseimbangan: Apabila sasaran pertama dicapai, strategi secara automatik akan memindahkan tahap stop loss ke harga masuk (titik keseimbangan untung-rugi) untuk memastikan perdagangan tidak rugi

  4. Konsep kawasan sasaran: Apabila harga mendekati tahap sasaran (dalam penurunan yang telah ditentukan), strategi memulakan “kawasan sasaran”, meningkatkan tahap sasaran untuk menangkap lebih banyak potensi keuntungan

  5. Mekanisme Hentikan Kerosakan:

    • Pengekalan kemasukan pertama: Setelah mencapai sasaran awal, titik berhenti akan mengikuti pergerakan harga tertinggi / terendah, dengan jarak tetap
    • Pengesanan masuk kedua: mempunyai parameter penghentian kerugian pengesanan yang berasingan untuk bahagian penempatan
  6. Pengesanan statusStrategi: Menjaga pelbagai pembolehubah untuk mengesan arah perdagangan, paras harga, sama ada sasaran pertama telah dicapai dan sama ada ia berada di kawasan sasaran

Kelebihan Strategik

  1. Pengurusan risiko menyeluruhStrategi ini menyediakan pengurusan risiko berlapis untuk melindungi modal daripada kejatuhan yang ketara dengan menetapkan pencegahan kerugian, perlindungan keseimbangan kerugian dan pencegahan kerugian akibat.

  2. Peluang Pendapatan PiramidDengan membenarkan kemasukan kedua, strategi ini dapat meningkatkan kedudukan dalam trend yang telah disahkan, meningkatkan potensi keuntungan, dan pada masa yang sama tidak meningkatkan risiko keseluruhan kerana perdagangan pertama telah dikunci pada titik keseimbangan untung rugi.

  3. Penangkapan keuntungan dinamik: Kawasan sasaran dan fungsi penambahan sasaran membolehkan strategi untuk secara automatik memperluaskan sasaran keuntungan dalam pasaran yang kuat, dan bukannya keluar dari trend yang kuat lebih awal.

  4. Ketinggian disesuaikanStrategi menawarkan pelbagai parameter yang membolehkan peniaga menyesuaikan diri dengan keadaan pasaran, ciri-ciri jenis perdagangan dan pilihan risiko peribadi.

  5. Pelaksanaan automatik: Apabila parameter telah ditetapkan, strategi melakukan semua kemasukan, keluar dan penyesuaian hentian kerugian, menghilangkan kesan perdagangan emosi.

  6. Maklum balas visualStrategi ini mengandungi komponen visual yang jelas yang menunjukkan tahap sasaran, tahap stop loss dan petunjuk status semasa, yang membolehkan peniaga memantau kemajuan perdagangan dengan mudah.

Risiko Strategik

  1. Kepekaan ParameterPrestasi strategi sangat bergantung pada parameter yang ditetapkan. Tujuan yang tidak betul atau parameter berhenti boleh menyebabkan keluar awal dari perdagangan yang baik atau mengambil risiko penurunan yang berlebihan. Risiko ini dapat dikurangkan dengan mengkaji semula sejarah dan mengoptimumkan parameter khusus pasaran.

  2. Risiko Tergelincir: Terutamanya semasa pelaksanaan hentian penghentian, jurang pasaran atau kekurangan kecairan boleh menyebabkan harga pelaksanaan yang sebenarnya berbeza dengan tahap hentian yang ideal. Pertimbangan untuk menambah penyangga slip atau menggunakan parameter penghentian yang lebih konservatif dapat mengurangkan risiko ini.

  3. Berbalik kepada overtrading: Membolehkan kemasukan kedua boleh menyebabkan perdagangan berlebihan dalam pasaran yang tidak stabil. Pelaksanaan syarat penapisan tambahan atau sekatan masa kemasukan kedua dapat mengurangkan keadaan seperti itu.

  4. Risiko pertukaran pasaranWalaupun strategi berfungsi dengan baik dalam pasaran yang sedang tren, ia mungkin tidak berfungsi dengan baik dalam pasaran yang bergolak atau berubah secara tiba-tiba. Menggabungkan strategi dengan penapis keadaan pasaran dapat meningkatkan keberkesanan keseluruhan.

  5. Ketumpatan pengiraan: Strategi untuk mengesan pelbagai pembolehubah dan keadaan yang boleh menyebabkan kelewatan pelaksanaan pada platform tertentu. Mengoptimumkan kod dan mempermudahkan pengiraan tertentu dapat meningkatkan prestasi.

Arah pengoptimuman strategi

  1. Menambah penapis trend: Indikator trend bersepadu ((seperti purata bergerak, ADX atau penunjuk kekuatan trend) dapat meningkatkan kualiti masuk, hanya berdagang di arah trend yang disahkan.

  2. Memperkenalkan syarat penapis masa: Tambah waktu atau tempoh penyejukan untuk kemasukan kedua, untuk mengelakkan perdagangan berlebihan dalam masa yang singkat atau aliran yang sama berulang.

  3. Penyesuaian VolatilitiDengan menyesuaikan parameter sasaran dan hentian secara dinamik berdasarkan turun naik pasaran (seperti ATR), strategi dapat disesuaikan dengan keadaan pasaran yang berbeza. Ini akan menjadikan tahap hentian dan sasaran lebih sesuai dengan ciri pasaran semasa.

  4. Peningkatan Logik Heinrich AnsiPenghakiman HA pada masa ini agak mudah, dan kualiti isyarat boleh dipertingkatkan dengan mempertimbangkan pelbagai bentuk grafik HA atau indikator dinamik HA.

  5. Menambah sebahagian daripada keuntungan yang dikunci: Menerapkan fungsi penguncian keuntungan berpecah, yang membolehkan sebahagian daripada kedudukan untuk dipadamkan apabila tahap keuntungan tertentu dicapai, sambil membiarkan sisa terus beroperasi, mengimbangi perlindungan keuntungan dan memaksimumkan potensi keuntungan.

  6. Mengoptimumkan Logik Daerah Sasaran: Kawasan sasaran semasa menggunakan langkah tambahan tetap. Algoritma penyesuaian sasaran dinamik berdasarkan turun naik pasaran atau pergerakan harga baru-baru ini boleh dipertimbangkan untuk menyesuaikan diri dengan perubahan keadaan pasaran.

ringkaskan

Strategi sasaran bertingkat-tingkat dan hentikan kerugian adalah sistem perdagangan yang komprehensif yang menggabungkan pengesanan trend Heineken, pengurusan sasaran dinamik, peluang masuk kedua dan kawalan risiko bertingkat-tingkat. Keunggulan utama strategi ini adalah mekanisme pelebaran keuntungan yang fleksibel dan kerangka pengurusan risiko yang ketat, yang menjadikannya sesuai untuk menangkap pergerakan yang ketara dalam pasaran yang sedang tren.

Walaupun strategi ini menyediakan kerangka yang kuat, keberkesanannya masih bergantung pada penyesuaian parameter dan keadaan pasaran yang sesuai. Strategi ini dapat meningkatkan lagi kestabilan dan adaptasi dengan menambahkan penapis keadaan pasaran, mekanisme penyesuaian turun naik, dan logik pengesahan masuk yang lebih kompleks.

Kod sumber strategi
/*backtest
start: 2024-03-31 00:00:00
end: 2025-03-29 08:00:00
period: 2d
basePeriod: 2d
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/

//@version=6
strategy("Algo Trading v1 | SUNNY GUHA By OIESU", overlay=true, margin_long=100, margin_short=100, pyramiding=100)

// ———— USER INPUTS ———— //
// First Entry Settings
float initialTarget  = input.float(10000, "First Entry: Target ($)", minval=1, tooltip="First target level")
float initialStopLoss = input.float(3000, "First Entry: Stop Loss ($)", minval=1, tooltip="Initial stop loss distance")
bool  useTrailFirst = input.bool(true, "First Entry: Enable Trail", tooltip="Enable trailing features after first target hit")
float profitTrailStepFirst = input.float(1500, "First Entry: Trail Amount ($)", minval=1, tooltip="Trail amount after first target hit")
bool  useTargetZoneFirst = input.bool(true, "First Entry: Enable Target Zone", tooltip="Enable target zone feature")
float targetZoneThresholdFirst = input.float(1000, "First Entry: Target Zone Threshold ($)", minval=1, tooltip="Distance to activate target zone")
float targetIncreaseStepFirst = input.float(2000, "First Entry: Target Increase ($)", minval=1, tooltip="Amount to increase target")

// Second Entry Settings
bool  enableSecondEntries = input.bool(true, "Enable Second Entries", tooltip="Allow re-entries after first target hit")
float secondTarget = input.float(5000, "Second Entry: Target ($)", minval=1, tooltip="Target for second entries")
float secondStopLoss = input.float(2000, "Second Entry: Stop Loss ($)", minval=1, tooltip="Stop loss for second entries")
bool  useTrailSecond = input.bool(true, "Second Entry: Enable Trail", tooltip="Enable trailing for second entries")
float profitTrailStepSecond = input.float(1500, "Second Entry: Trail Amount ($)", minval=1, tooltip="Trail amount for second entries")
bool  useTargetZoneSecond = input.bool(true, "Second Entry: Enable Target Zone", tooltip="Enable target zone")
float targetZoneThresholdSecond = input.float(1000, "Second Entry: Target Zone Threshold ($)", minval=1)
float targetIncreaseStepSecond = input.float(2000, "Second Entry: Target Increase ($)", minval=1)

// ———— HEIKIN-ASHI CALCULATIONS ———— //
var float haOpen   = na
var float haClose  = na
var float haHigh   = na
var float haLow    = na

haClose := (open + high + low + close)/4
haOpen  := na(haOpen[1]) ? (open + close)/2 : (haOpen[1] + haClose[1])/2
haHigh  := math.max(high, math.max(haOpen, haClose))
haLow   := math.min(low, math.min(haOpen, haClose))

// ———— TRACKING VARIABLES ———— //
var float highestPrice     = na  // Tracks highest price for long positions
var float lowestPrice      = na  // Tracks lowest price for short positions
var float basePrice        = na  // Entry price for position
var float targetLevel      = na  // Current target level
var float stopLevel        = na  // Current stop level
var bool  firstTargetHit   = false  // Indicates if first target was hit
var string tradeDirection  = "none"  // Current trade direction
var bool   isSecondEntry   = false   // Tracks if current position is a second entry
var bool   inTargetZone    = false   // Tracks if price is in target zone

// ———— SIGNAL DETECTION ———— //
bullish = haClose > haOpen and haClose > haClose[1]
bearish = haClose < haOpen and haClose < haClose[1]

// Entry conditions - only allow second entries if enabled and after first target hit
longCondition  = bullish and (tradeDirection != "long" or (enableSecondEntries and firstTargetHit))
shortCondition = bearish and (tradeDirection != "short" or (enableSecondEntries and firstTargetHit))

// Position Management - Long Positions
if strategy.position_size > 0
    highestPrice := math.max(high, nz(highestPrice, high))

    if isSecondEntry
        // Second Entry Management
        inTargetZone := useTargetZoneSecond and high >= targetLevel - targetZoneThresholdSecond

        if inTargetZone and useTargetZoneSecond
            targetLevel := targetLevel + targetIncreaseStepSecond

        if useTrailSecond
            stopLevel := math.max(stopLevel, highestPrice - profitTrailStepSecond)

        if low <= stopLevel
            strategy.close_all("Second Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"
    else
        // First Entry Management - improved profit locking
        if not firstTargetHit and high >= basePrice + initialTarget
            // First target hit - ALWAYS lock profit at break-even
            firstTargetHit := true
            stopLevel := basePrice  // Move stop to break-even
            targetLevel := useTrailFirst ? high + targetIncreaseStepFirst : basePrice + initialTarget
        else if firstTargetHit
            // Only modify target if trailing is enabled
            if useTrailFirst
                inTargetZone := useTargetZoneFirst and high >= targetLevel - targetZoneThresholdFirst
                if inTargetZone and useTargetZoneFirst
                    targetLevel := targetLevel + targetIncreaseStepFirst
                // Trail stop-loss but never below break-even
                stopLevel := math.max(basePrice, highestPrice - profitTrailStepFirst)
        else
            // Before first target hit
            targetLevel := basePrice + initialTarget
            stopLevel := basePrice - initialStopLoss

        // Exit on stop hit - this could only be at break-even or better after first target
        if low <= stopLevel
            strategy.close_all("First Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"

// Position Management - Short Positions
if strategy.position_size < 0
    lowestPrice := math.min(low, nz(lowestPrice, low))

    if isSecondEntry
        // Second Entry Management
        inTargetZone := useTargetZoneSecond and low <= targetLevel + targetZoneThresholdSecond

        if inTargetZone and useTargetZoneSecond
            targetLevel := targetLevel - targetIncreaseStepSecond

        if useTrailSecond
            stopLevel := math.min(stopLevel, lowestPrice + profitTrailStepSecond)

        if high >= stopLevel
            strategy.close_all("Second Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"
    else
        // First Entry Management - improved profit locking
        if not firstTargetHit and low <= basePrice - initialTarget
            // First target hit - ALWAYS lock profit at break-even
            firstTargetHit := true
            stopLevel := basePrice  // Move stop to break-even
            targetLevel := useTrailFirst ? low - targetIncreaseStepFirst : basePrice - initialTarget
        else if firstTargetHit
            // Only modify target if trailing is enabled
            if useTrailFirst
                inTargetZone := useTargetZoneFirst and low <= targetLevel + targetZoneThresholdFirst
                if inTargetZone and useTargetZoneFirst
                    targetLevel := targetLevel - targetIncreaseStepFirst
                // Trail stop-loss but never above break-even
                stopLevel := math.min(basePrice, lowestPrice + profitTrailStepFirst)
        else
            // Before first target hit
            targetLevel := basePrice - initialTarget
            stopLevel := basePrice + initialStopLoss

        // Exit on stop hit - this could only be at break-even or better after first target
        if high >= stopLevel
            strategy.close_all("First Entry Stop")
            basePrice := na
            targetLevel := na
            stopLevel := na
            highestPrice := na
            lowestPrice := na
            firstTargetHit := false
            isSecondEntry := false
            inTargetZone := false
            tradeDirection := "none"

// New Position Entry
if strategy.position_size == 0
    if longCondition
        tradeDirection := "long"
        basePrice := close
        targetLevel := basePrice + (firstTargetHit ? secondTarget : initialTarget)
        stopLevel := basePrice - (firstTargetHit ? secondStopLoss : initialStopLoss)
        highestPrice := high
        isSecondEntry := firstTargetHit
        strategy.entry("Long", strategy.long)
    else if shortCondition
        tradeDirection := "short"
        basePrice := close
        targetLevel := basePrice - (firstTargetHit ? secondTarget : initialTarget)
        stopLevel := basePrice + (firstTargetHit ? secondStopLoss : initialStopLoss)
        lowestPrice := low
        isSecondEntry := firstTargetHit
        strategy.entry("Short", strategy.short)

// ———— VISUALIZATION ———— //
// Entry signals
plotshape(longCondition and (strategy.position_size == 0),     title="Buy", style=shape.triangleup, location=location.belowbar, color=color.green, size=size.small)

plotshape(shortCondition and (strategy.position_size == 0),     title="Sell", style=shape.triangledown, location=location.abovebar, color=color.red, size=size.small)

// Target and stop levels with clearer colors
plot(targetLevel, title="Target Level", color=color.orange, linewidth=2)
plot(stopLevel, title="Stop Level", color=color.red, linewidth=2)

// Break-even level - shown prominently after first target hit
plot(strategy.position_size != 0 and firstTargetHit ? basePrice : na,     title="Break-Even Level", color=color.green, linewidth=2, style=plot.style_linebr)

// Debug plots for state tracking
plotchar(firstTargetHit, title="First Target Hit", char="T", location=location.top, color=color.yellow, size=size.tiny)
plotchar(isSecondEntry, title="Second Entry", char="2", location=location.top, color=color.white, size=size.tiny)
plotchar(useTrailFirst and firstTargetHit, title="Trail Active", char="→", location=location.top, color=color.blue, size=size.tiny)
plotchar(inTargetZone, title="Target Zone", char="Z", location=location.top, color=color.fuchsia, size=size.tiny)