
Chiến lược mục tiêu đa tầng và dừng chân theo dõi là một hệ thống theo dõi xu hướng dựa trên mô hình biểu đồ Heineken, được thiết kế để nắm bắt động lực thị trường và bảo vệ lợi nhuận. Chiến lược này cho phép nhập cảnh ban đầu và nhập cảnh thứ hai ((thanh số kim tự tháp), với mục tiêu lợi nhuận và dừng chân độc lập cho mỗi lần nhập.
Chiến lược này hoạt động dựa trên một số nguyên tắc quan trọng:
Tín hiệu đồ thị Hynsi: Sử dụng biểu đồ Hyundai Ansi để lọc tiếng ồn thị trường và nhận biết xu hướng. Dấu hiệu đa đầu được kích hoạt khi giá đóng cửa HA hiện tại cao hơn giá mở cửa HA và cao hơn giá đóng cửa HA trước đó; Dấu hiệu đầu trống ngược lại.
Hệ thống nhập cảnh hai tầng:
Bị phá vỡ bảo vệ cân bằng lỗ hổng: Khi mục tiêu đầu tiên đạt được, chiến lược sẽ tự động di chuyển mức dừng lỗ đến mức giá nhập ((điểm cân bằng thua lỗ) để đảm bảo giao dịch không thua lỗ
Khái niệm khu vực mục tiêu: Chiến lược khởi động “khu vực mục tiêu” khi giá gần mức mục tiêu (trong phạm vi giảm giá được xác định trước), tăng mức mục tiêu để nắm bắt nhiều lợi nhuận tiềm năng hơn
Cơ chế dừng thua lỗ:
Theo dõi trạng tháiChiến lược: duy trì nhiều biến để theo dõi hướng giao dịch, giá cực, đạt được mục tiêu đầu tiên và hiện đang ở trong khu vực mục tiêu
Quản lý rủi ro toàn diệnChiến lược này cung cấp quản lý rủi ro đa tầng, bảo vệ vốn khỏi ảnh hưởng của sự sụt giảm mạnh mẽ bằng cách đặt trước lỗ hổng, bảo vệ cân bằng lỗ hổng và dừng lỗ theo dõi.
Cơ hội tăng giá kim tự tháp: Bằng cách cho phép nhập lần thứ hai, chiến lược có thể tăng vị trí trong xu hướng đã xác nhận, tăng tiềm năng lợi nhuận, đồng thời không làm tăng rủi ro tổng thể vì giao dịch đầu tiên đã bị khóa ở điểm cân bằng lỗ hổng.
Tiếp theo, các nhà đầu tư sẽ có thể bắt được lợi nhuận.: Khu vực mục tiêu và chức năng tăng mục tiêu cho phép chiến lược tự động mở rộng mục tiêu lợi nhuận trong thị trường mạnh, thay vì thoát khỏi xu hướng mạnh sớm.
Độ cao tùy chỉnhChiến lược cung cấp các thiết lập tham số rộng rãi, cho phép các nhà giao dịch điều chỉnh tùy theo điều kiện thị trường, đặc điểm của các loại giao dịch và sở thích rủi ro cá nhân.
Tự động thực hiện: Một khi thiết lập tham số được hoàn thành, chiến lược thực hiện tất cả các điều chỉnh vào, ra và dừng lỗ, loại bỏ tác động của giao dịch cảm xúc.
Phản hồi trực quanChiến lược bao gồm các thành phần hiển thị rõ ràng, hiển thị các chỉ số mức mục tiêu, mức dừng và trạng thái hiện tại, cho phép thương nhân dễ dàng theo dõi tiến trình giao dịch.
Độ nhạy tham sốHiệu suất chiến lược phụ thuộc rất nhiều vào thiết lập tham số. Mục tiêu hoặc tham số dừng lỗ không đúng có thể dẫn đến việc thoát khỏi giao dịch tốt sớm hoặc chịu rủi ro giảm quá nhiều.
Rủi ro trượt giáĐặc biệt trong thời gian thực hiện lệnh dừng chân theo dõi, lỗ hổng thị trường hoặc thiếu hụt thanh khoản có thể dẫn đến việc giá thực hiện thực tế khác với mức dừng chân lý tưởng. Việc xem xét tăng độ đệm trượt hoặc sử dụng các tham số theo dõi thận trọng hơn có thể làm giảm rủi ro này.
Thêm giao dịch quá mức: Cho phép nhập cảnh thứ hai có thể dẫn đến giao dịch quá mức trong thị trường bất ổn. Việc áp dụng các điều kiện lọc bổ sung hoặc giới hạn thời gian nhập cảnh thứ hai có thể làm giảm tình trạng này.
Rủi ro chuyển đổi thị trường: Mặc dù chiến lược hoạt động tốt trong thị trường xu hướng, nhưng có thể hoạt động kém trong thị trường chấn động hoặc thị trường chuyển hướng đột ngột. Việc sử dụng chiến lược kết hợp với bộ lọc trạng thái thị trường có thể làm tăng hiệu quả tổng thể.
Tính mật độ tính toán: Chiến lược theo dõi nhiều biến và trạng thái có thể gây ra sự chậm trễ trong thực hiện trên một số nền tảng. Tối ưu hóa mã và đơn giản hóa một số tính toán có thể cải thiện hiệu suất.
Thêm bộ lọc xu hướng: Các chỉ số xu hướng tích hợp (như trung bình di chuyển, ADX hoặc chỉ số cường độ xu hướng) có thể cải thiện chất lượng nhập cảnh, chỉ giao dịch theo hướng xu hướng được xác nhận. Điều này sẽ giảm tín hiệu sai trong thị trường rung động.
Thêm điều kiện lọc thời gian: Thêm một cửa sổ thời gian hoặc thời gian làm mát cho lần nhập lần thứ hai để ngăn chặn giao dịch quá mức trong một khoảng thời gian ngắn hoặc xuất hiện cùng một xu hướng thường xuyên.
Điều chỉnh biến động: Bằng cách điều chỉnh động các tham số mục tiêu và dừng lỗ dựa trên biến động của thị trường (ví dụ như ATR), chiến lược có thể thích ứng với các điều kiện thị trường khác nhau. Điều này sẽ làm cho mức dừng và mục tiêu phù hợp hơn với đặc điểm thị trường hiện tại.
Cải thiện logic Heinz-Ansi: Các phán đoán HA hiện tại tương đối đơn giản, có thể tăng cường chất lượng tín hiệu bằng cách xem xét nhiều hình dạng đồ thị HA hoặc chỉ số động lực HA.
Thêm một phần lợi nhuận khóa: Thực hiện chức năng khóa lợi nhuận theo giai đoạn, cho phép thanh toán một số vị trí khi đạt đến mức lợi nhuận nhất định, trong khi cho phép phần còn lại tiếp tục hoạt động, cân bằng giữa bảo vệ lợi nhuận và tối đa hóa lợi nhuận tiềm năng.
Tối ưu hóa logic khu vực mục tiêu: Khu vực mục tiêu hiện tại sử dụng bước tăng cố định. Các thuật toán điều chỉnh mục tiêu động dựa trên biến động thị trường hoặc biến động giá gần đây có thể được xem xét để thích ứng tốt hơn với các điều kiện thị trường thay đổi.
Chiến lược mục tiêu đa tầng và chiến lược dừng lỗ theo dõi là một hệ thống giao dịch toàn diện kết hợp với nhận dạng xu hướng của Hynesi, quản lý mục tiêu động, cơ hội nhập lần thứ hai và kiểm soát rủi ro đa tầng. Ưu điểm chính của chiến lược này nằm trong cơ chế mở rộng lợi nhuận linh hoạt và khung quản lý rủi ro nghiêm ngặt, làm cho nó phù hợp để nắm bắt chuyển động đáng kể trong thị trường có xu hướng.
Mặc dù chiến lược này cung cấp một khuôn khổ mạnh mẽ, nhưng hiệu quả của nó vẫn phụ thuộc vào điều chỉnh tham số và điều kiện thị trường thích hợp. Chiến lược này có thể được tăng cường thêm về sự ổn định và thích ứng của nó bằng cách thêm các bộ lọc trạng thái thị trường, cơ chế điều chỉnh biến động và logic xác nhận nhập cảnh phức tạp hơn. Cuối cùng, chiến lược này đại diện cho một loại kim cân bằng bảo vệ vốn giao dịch thông qua kiểm soát rủi ro có hệ thống trong khi cố gắng nắm bắt xu hướng tối đa.
/*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)