
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.
Strategi ini beroperasi berdasarkan beberapa prinsip utama:
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.
Sistem kemasukan dua tingkat:
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
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
Mekanisme Hentikan Kerosakan:
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
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.
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.
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.
Ketinggian disesuaikanStrategi menawarkan pelbagai parameter yang membolehkan peniaga menyesuaikan diri dengan keadaan pasaran, ciri-ciri jenis perdagangan dan pilihan risiko peribadi.
Pelaksanaan automatik: Apabila parameter telah ditetapkan, strategi melakukan semua kemasukan, keluar dan penyesuaian hentian kerugian, menghilangkan kesan perdagangan emosi.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
/*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)