
Hệ thống theo dõi mất mát theo chuỗi giao dịch thông minh của Index Moving Average Crossover là một chiến lược giao dịch định lượng dựa trên phân tích kỹ thuật và quản lý tài sản tinh tế. Chiến lược này sử dụng các tín hiệu giao dịch chéo của Index Moving Average (EMA) để nhận diện xu hướng tăng tiềm năng, kết hợp với Dollar Cost Average (DCA) để đặt cược thông minh và bảo vệ lợi nhuận thông qua cơ chế dừng lỗ đôi.
Chiến lược này hoạt động dựa trên một số thành phần quan trọng:
Cơ chế nhận diện xu hướng: Sử dụng chéo của EMA nhanh (thường là 9 chu kỳ) và EMA chậm (thường là 21 chu kỳ) để xác định xu hướng tăng tiềm năng. Khi EMA nhanh đi lên vượt qua EMA chậm, hệ thống sẽ tạo ra tín hiệu mua.
Lệnh cơ bản và lệnh an toànChiến lược sử dụng phương pháp quản lý vốn phân tầng, bắt đầu từ đơn đặt hàng cơ bản (đặc biệt là 1000 đô la) và thêm hai đơn đặt hàng an toàn bổ sung khi giá giảm (đặc biệt là 1250 đô la SO1 và 1750 đô la SO2).
Tính năng tính khoảng cáchGiá kích hoạt của lệnh an toàn có thể được tính theo hai cách:
Hệ thống chống mất mát theo dõi kép:
Điều kiện rút luiChiến lược này được sử dụng trong các trường hợp sau:
Bộ lọc thời gian và ngày: Chiến lược bao gồm thời gian làm mát sau khi đặt hàng cơ bản ((4 giờ mặc định) và bộ lọc ngày tùy chọn để hạn chế đo lường hoặc thực hiện một khoảng thời gian cụ thể.
Một phân tích sâu về mã của chiến lược này, chúng ta có thể tóm tắt những ưu điểm chính sau:
Quản lý tài chính thích ứngChiến lược sử dụng phương pháp chi phí trung bình đô la kết hợp với lệnh an toàn động để tự động điều chỉnh vị trí theo điều kiện thị trường. Phương pháp này đặc biệt hiệu quả trong thị trường biến động, có thể làm giảm giá nhập cảnh trung bình và tăng lợi nhuận tiềm năng.
Điều chỉnh vị trí dựa trên biến độngThông qua ATR tính toán vị trí lệnh an toàn, chiến lược có thể tự động điều chỉnh khoảng thời gian đặt cược theo biến động thị trường hiện tại, linh hoạt hơn so với phương pháp tỷ lệ phần trăm cố định.
Hai lớp bảo vệ lợi nhuậnHệ thống dừng hai lần theo dõi cung cấp quản lý rủi ro sáng tạo, theo dõi dừng tiêu chuẩn bảo vệ phần lớn số tiền, trong khi cơ chế khóa lợi nhuận được kích hoạt sau khi đạt được mục tiêu lợi nhuận cụ thể, bảo vệ lợi nhuận đã đạt được với tỷ lệ phần trăm chặt chẽ hơn.
Hoàn toàn tùy chỉnh: Tất cả các tham số quan trọng (dài EMA, kích thước lệnh, tỷ lệ dừng theo dõi, khoảng cách lệnh an toàn) có thể được điều chỉnh theo sở thích rủi ro của nhà giao dịch và điều kiện thị trường.
Hệ thống cảnh báo sớm tích hợpChiến lược bao gồm các điều kiện cảnh báo được định dạng và có thể tích hợp với nền tảng tự động hóa của bên thứ ba (như 3Commas) để thực hiện giao dịch tự động hóa hoàn toàn.
Thông tin tuyển dụng trong suốt: Bao gồm bảng điều khiển chi tiết, hiển thị các chỉ số và trạng thái giao dịch quan trọng, cho phép giám sát và tối ưu hóa chiến lược trong thời gian thực.
Mặc dù có nhiều lợi thế, chiến lược này vẫn có những rủi ro tiềm ẩn:
Giải pháp: Điều chỉnh tỷ lệ dừng theo dõi và khoảng thời gian đặt hàng an toàn theo các loại giao dịch và khung thời gian cụ thể; xem xét thêm dừng toàn cầu như một lớp bảo vệ bổ sung.
*Giải pháp*Ghi chú: Phản hồi và tối ưu hóa chi tiết cho các loại giao dịch và điều kiện thị trường cụ thể; Thực hiện cơ chế điều chỉnh tham số thích ứng.
*Giải pháp*Xem xét việc thực hiện các cơ chế kích hoạt lệnh an toàn linh hoạt hơn, chẳng hạn như thực thi bắt buộc dựa trên thời gian hoặc điều chỉnh khoảng cách theo điều kiện thị trường cụ thể.
*Giải pháp*Thêm bộ lọc giao dịch, chẳng hạn như xác nhận giá trị biến động hoặc cường độ xu hướng; kéo dài thời gian nguội để giảm tần suất giao dịch.
Giải pháp: Xem xét việc tích hợp các bộ lọc cơ bản hoặc các chỉ số cảm xúc rủi ro; thêm kiểm tra liên quan giữa các thị trường như một tín hiệu xác nhận.
Dựa trên phân tích sâu về mã chiến lược, một số hướng tối ưu hóa có thể là:
Điều chỉnh tham số thích ứng: Thực hiện cơ chế tự động điều chỉnh độ dài EMA và số ATR dựa trên biến động thị trường hoặc khối lượng giao dịch. Ví dụ, sử dụng EMA dài và số ATR lớn trong môi trường biến động cao, sử dụng EMA ngắn và số ATR nhỏ trong môi trường biến động thấp. Điều này sẽ cải thiện khả năng thích ứng của chiến lược trong các điều kiện thị trường khác nhau.
Tín hiệu xác nhận nhiều lần: Thêm các chỉ số xác nhận bổ sung, chẳng hạn như chỉ số tương đối mạnh yếu ((RSI), khối lượng giao dịch hoặc dải Brin để giảm tín hiệu giả. Có thể thực hiện bộ lọc yêu cầu nhiều chỉ số kỹ thuật xác nhận tín hiệu nhập cảnh cùng một lúc, do đó cải thiện chất lượng tín hiệu.
Phân bổ năng động: Điều chỉnh kích thước đơn đặt hàng theo tình trạng thị trường và biến động lịch sử. Ví dụ, tăng kích thước đơn đặt hàng cơ bản trong giai đoạn thị trường có biến động thấp hoặc có nhiều khả năng tăng trong lịch sử, và giảm trong môi trường rủi ro cao.
Chiến lược rút lui thông minh: Thực hiện cơ chế thu lợi nhuận một phần, cho phép rút ra từng bước ở các mức lợi nhuận khác nhau, thay vì một lần bằng phẳng. Điều này có thể được thực hiện bằng cách thiết lập nhiều mục tiêu lợi nhuận và tỷ lệ rút ra tương ứng, tối ưu hóa tỷ lệ lợi nhuận rủi ro.
Chỉ số cảm xúc tích hợpThêm phân tích cảm xúc thị trường, chẳng hạn như chỉ số sợ hãi và tham lam hoặc phân tích khối lượng giao dịch, làm bộ lọc bổ sung cho nhập cảnh và xuất cảnh. Điều này sẽ giúp chiến lược tránh giao dịch không cần thiết trong thời gian cảm xúc thị trường cực đoan.
Quản lý tiếp xúc rủi ro: Thực hiện tính năng tính toán động mức độ rủi ro tối đa (tổng tất cả các lệnh an toàn có thể) và đặt giới hạn rủi ro tối đa chấp nhận được. Điều này sẽ đảm bảo rằng chiến lược không bao giờ phơi bày quá nhiều tiền cho một giao dịch.
Hệ thống theo dõi lỗ theo chuỗi giao dịch định kỳ thông minh của Index Moving Average Crossover là một chiến lược giao dịch định lượng được thiết kế tốt, kết hợp với phát hiện xu hướng, đặt hàng phân tầng và quản lý lỗ hổng tiên tiến. Ưu điểm cốt lõi của nó là khả năng thích ứng với biến động thị trường, quản lý tài sản thông minh và hệ thống bảo vệ lợi nhuận hai tầng.
Chiến lược này có thể được cải thiện hơn nữa về hiệu suất và sự ổn định của nó bằng cách tối ưu hóa tham số thích hợp và tăng cường đề xuất. Đặc biệt, điều chỉnh tham số thích ứng và tín hiệu xác nhận nhiều lần có thể cải thiện đáng kể chất lượng nhập cảnh, trong khi phân bổ tiền năng động và chiến lược thoát thông minh có thể tối ưu hóa tính năng lợi nhuận rủi ro.
Cuối cùng, chiến lược này đại diện cho một phương pháp giao dịch định lượng cân bằng, tập trung vào việc giữ tiền và tính nhất quán, thay vì theo đuổi tối đa hóa lợi nhuận trên mỗi giao dịch. Nó cung cấp cho các nhà giao dịch một khuôn khổ mạnh mẽ, có thể được tùy chỉnh theo sở thích rủi ro cá nhân và điều kiện thị trường, có khả năng mang lại kết quả giao dịch bền vững trong thời gian dài.
/*backtest
start: 2025-04-15 00:00:00
end: 2025-07-13 19:30:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT","balance":200000}]
*/
//@version=5
strategy(
title="DCA + Dual Trailing Strategy",
overlay=true
)
// --- Trend ---
fastMALen = input.int(9, title="Fast EMA Length")
slowMALen = input.int(21, title="Slow EMA Length")
// --- Trailing Stops ---
trailStopPerc = input.float(8.0, title="Standard Trailing Stop (%)", minval=0.1) / 100
lockInThreshold = input.float(2.5, title="Profit Lock-In Trigger (%)", minval=0.1) / 100
lockInTrailPct = input.float(1.5, title="Lock-In Trail (%) after Trigger", minval=0.1) / 100
// --- Safety Orders (SO) ---
useATRSpacing = input.bool(true, title="Use ATR-Based Spacing?")
atrLength = input.int(14, title="ATR Length", minval=1)
atrSo1Multiplier = input.float(1.2, title="ATR SO1 Multiplier", minval=0.1)
atrSo2Multiplier = input.float(2.5, title="ATR SO2 Multiplier", minval=0.1)
// --- Fallback SO Spacing (if not using ATR) ---
fallbackSo1Perc = input.float(4.0, title="Fallback SO1 Drop (%) ", minval=0.1) / 100
fallbackSo2Perc = input.float(8.0, title="Fallback SO2 Drop (%) ", minval=0.1) / 100
// --- Entry Cooldown ---
cooldownBars = input.int(4, "Cooldown Bars After Base Entry", minval=0)
// --- Order Sizes in USD ---
baseUsd = input.float(10000.0, title="Base Order Size (USD)", minval=1.0)
so1Usd = input.float(12500.0, title="Safety Order 1 Size (USD)", minval=1.0)
so2Usd = input.float(17500.0, title="Safety Order 2 Size (USD)", minval=1.0)
// 2) CALCULATIONS
// --- Trend & Reversal Detection ---
fastMA = ta.ema(close, fastMALen)
slowMA = ta.ema(close, slowMALen)
trendUp = ta.crossover(fastMA, slowMA)
trendDown = ta.crossunder(fastMA, slowMA)
// --- ATR Value ---
atrValue = ta.atr(atrLength)
// 3) BASE ENTRY LOGIC
// Base Buy Signal: EMA crossover
baseBuySignal = trendUp
var int lastBuyBar = na // Tracks the bar index of the last base entry
inCooldown = not na(lastBuyBar) and (bar_index - lastBuyBar < cooldownBars)
var float baseEntryPrice = na // Stores the price of the initial base entry for SO calculations
// --- Execute Base Entry ---
if baseBuySignal and strategy.position_size == 0 and not inCooldown
baseQty = baseUsd / close // Calculate quantity based on USD
strategy.order("Base Order", strategy.long, qty=baseQty, comment="Base Entry")
baseEntryPrice := close
lastBuyBar := bar_index
// 4) SAFETY ORDERS LOGIC
// --- Calculate SO Trigger Prices ---
float so1TriggerPrice = na
float so2TriggerPrice = na
if strategy.position_size > 0 // Only calculate if a base order has been placed
so1TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo1Multiplier) :
(baseEntryPrice * (1 - fallbackSo1Perc))
so2TriggerPrice := useATRSpacing ?
(baseEntryPrice - atrValue * atrSo2Multiplier) :
(baseEntryPrice * (1 - fallbackSo2Perc))
// --- Conditions for SO Execution ---
// Added 'inDateRange' check
// Ensure base order exists, price trigger hit, and the specific SO hasn't filled yet
bool so1Condition = strategy.position_size > 0 and close <= so1TriggerPrice and strategy.opentrades == 1
bool so2Condition = strategy.position_size > 0 and close <= so2TriggerPrice and strategy.opentrades == 2
// --- Execute SO1 ---
if so1Condition
so1Qty = so1Usd / close // Calculate quantity based on USD
strategy.order("Safety Order 1", strategy.long, qty=so1Qty, comment="SO1")
// --- Execute SO2 ---
if so2Condition
so2Qty = so2Usd / close // Calculate quantity based on USD
strategy.order("Safety Order 2", strategy.long, qty=so2Qty, comment="SO2")
// 5) AVERAGE ENTRY PRICE
// Use the built-in variable for the average price of the open position
avgEntryPrice = strategy.position_avg_price
// 6) DUAL TRAILING STOP LOGIC
// Variables to track trailing stop levels and states
var float highestSinceEntry = na
var float trailStopPrice = na
var bool stopHitNormal = false
var bool lockInTriggered = false
var float lockInPeak = na
var float lockInStopPrice = na
var bool stopHitLockIn = false
// --- Update Trailing Logic when in a Position ---
if strategy.position_size > 0
// --- Standard Trail ---
highestSinceEntry := na(highestSinceEntry) ? close : math.max(highestSinceEntry, close)
trailStopPrice := highestSinceEntry * (1 - trailStopPerc)
stopHitNormal := close < trailStopPrice
// --- Lock-In Trail ---
if not lockInTriggered and close >= avgEntryPrice * (1 + lockInThreshold)
lockInTriggered := true
lockInPeak := close
if lockInTriggered
lockInPeak := math.max(lockInPeak, close)
lockInStopPrice := lockInPeak * (1 - lockInTrailPct)
stopHitLockIn := close < lockInStopPrice
else
stopHitLockIn := false
lockInStopPrice := na
// --- Reset Variables when Flat ---
else
highestSinceEntry := na
trailStopPrice := na
stopHitNormal := false
lockInTriggered := false
lockInPeak := na
lockInStopPrice := na
stopHitLockIn := false
// lastBuyBar is intentionally NOT reset here, cooldown depends on it
// 7) EXIT CONDITIONS
// Added 'inDateRange' check
// Exit if either trailing stop is hit OR if the trend reverses downward
exitCondition = (stopHitNormal or stopHitLockIn or trendDown) and strategy.position_size > 0
if exitCondition
strategy.close_all(comment="Exit: SL / LockIn / TrendDown")
// 9) PLOTS & DEBUG TABLE
// --- Plot MAs ---
plot(fastMA, color=color.new(color.green, 0), title="Fast EMA", linewidth=2)
plot(slowMA, color=color.new(color.red, 0), title="Slow EMA", linewidth=2)
// --- Plot Trailing Stops ---
plot(strategy.position_size > 0 ? trailStopPrice : na, color=color.new(color.orange, 0), title="Standard Trailing Stop", style=plot.style_linebr, linewidth=2)
plot(lockInTriggered ? lockInStopPrice : na, color=color.new(color.fuchsia, 0), title="Lock-In Trailing Stop", style=plot.style_linebr, linewidth=2)