
Chiến lược nhập cảnh động với rủi ro có thể điều chỉnh theo xu hướng được thiết kế cho các nhà giao dịch xoay chuyển muốn thiết lập nhiều vị trí trong sự điều chỉnh sau khi xu hướng chuyển sang ngắn hạn, đồng thời đi ngay trên không khi điều kiện thị trường thuận lợi cho xu hướng đi xuống. Chiến lược này kết hợp xu hướng xác nhận chéo SMA, phần trăm cố định để điều chỉnh điểm vào, và các tham số quản lý rủi ro có thể điều chỉnh, để thực hiện giao dịch tối ưu.
Cốt lõi của chiến lược này là sử dụng đường trung bình di chuyển đơn giản (SMA) 10 chu kỳ và 25 chu kỳ để xác nhận hướng xu hướng và kết hợp với đường trung bình di chuyển 150 chu kỳ (EMA) như một điều kiện lọc bổ sung cho giao dịch không có giá. Các giao dịch đa đầu không đi vào ngay sau khi giao dịch SMA, nhưng chờ đợi giá quay trở lại tỷ lệ phần trăm được chỉ định để đi vào, phương pháp này tối ưu hóa giá vào và tăng tỷ lệ lợi nhuận rủi ro.
Chiến lược này có thể được chia thành một vài phần quan trọng:
Cơ chế xác nhận xu hướng:
Cơ chế quay trở lại nhiều đầu:
Quy tắc nhập cảnh không đầu:
Quản lý rủi ro và chiến lược rút lui:
Chiến lược sử dụng các biến số bền để theo dõi tín hiệu quay trở lại, đảm bảo vào đúng thời điểm. Khi không có vị trí, hệ thống sẽ đặt lại tất cả các biểu tượng và mức độ để chuẩn bị cho tín hiệu giao dịch tiếp theo.
Sau khi phân tích sâu về mã, chiến lược này cho thấy những ưu điểm đáng chú ý sau:
Thời gian nhập học tối ưu hóa:
Quản lý rủi ro toàn diện:
Trình lọc theo xu hướng:
Phản hồi trực quan:
Khả năng thích nghi cao:
Mặc dù chiến lược này có nhiều ưu điểm, nhưng vẫn có những rủi ro cần lưu ý:
Rủi ro thị trường nhanh:
Sự biến động của thị trường:
Hạn chế trong quản lý rủi ro điểm cố định:
Sự phụ thuộc quá nhiều vào các chỉ số kỹ thuật:
Rủi ro tối ưu hóa tham số:
Dựa trên phân tích mã, đây là một số hướng chính mà chiến lược này có thể được tối ưu hóa:
Quản lý rủi ro động:
stopDistance = input.float(2.0) * ta.atr(14)Cách tính toánTrình lọc cường độ xu hướng:
Phân tích nhiều khung thời gian:
Nhận dạng hồi âm thông minh:
Giao dịch xác nhận:
Các tham số thích ứng:
Chiến lược nhập cảnh động là một hệ thống giao dịch được thiết kế cẩn thận, kết hợp với nhận diện xu hướng, tối ưu hóa nhập cảnh và quản lý rủi ro toàn diện. Bằng cách chờ đợi giá quay trở lại, chiến lược có được giá nhập cảnh và lợi nhuận rủi ro tốt hơn so với hệ thống giao dịch chéo SMA đơn giản.
Ưu điểm cốt lõi của chiến lược này là tính linh hoạt và khả năng điều chỉnh, cho phép các nhà giao dịch điều chỉnh các tham số theo sở thích rủi ro cá nhân và điều kiện thị trường. Trong khi đó, các chức năng quản lý rủi ro tích hợp (bao gồm dừng lỗ, dừng và điểm bảo hiểm) cung cấp sự bảo vệ tài chính toàn diện.
Tuy nhiên, chiến lược này cũng có một số hạn chế, bao gồm cả việc quản lý rủi ro trong thị trường biến động và quản lý rủi ro số điểm cố định. Bằng cách thực hiện tối ưu hóa các đề xuất, chẳng hạn như quản lý rủi ro động, lọc cường độ xu hướng và xác nhận khối lượng giao dịch, bạn có thể cải thiện đáng kể sự ổn định và hiệu suất tổng thể của chiến lược.
Đối với các nhà giao dịch swing, đây là một chiến lược cơ bản lý tưởng, có thể được tùy chỉnh thêm theo phong cách giao dịch và mục tiêu cá nhân. Với thiết lập tham số hợp lý và điều chỉnh theo dõi liên tục, chiến lược này có tiềm năng cung cấp kết quả giao dịch ổn định trong nhiều môi trường thị trường.
/*backtest
start: 2024-08-01 00:00:00
end: 2025-03-25 00:00:00
period: 2h
basePeriod: 2h
exchanges: [{"eid":"Futures_Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("BTCUSD with adjustable sl,tp",
overlay=true,
initial_capital=10000,
default_qty_type=strategy.percent_of_equity,
default_qty_value=10,
calc_on_every_tick=true)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ USER INPUTS
// ─────────────────────────────────────────────────────────────────────────────
longSignalStyle = input.string("Label Up", title="Long Signal Style", options=["Label Up", "Arrow Up", "Cross"])
shortSignalStyle = input.string("Label Down", title="Short Signal Style", options=["Label Down", "Arrow Down", "Cross"])
// Adjustable exit parameters (in points)
tpDistance = input.int(1000, "Take Profit Distance (points)", minval=1)
slDistance = input.int(250, "Stop Loss Distance (points)", minval=1)
beTrigger = input.int(500, "Break-Even Trigger Distance (points)", minval=1)
// Adjustable retracement percentage for long pullback entry (e.g. 0.01 = 1%)
retracementPct = input.float(0.01, "Retracement Percentage (e.g. 0.01 for 1%)", step=0.001)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ INDICATORS: SMA & EMA
// ─────────────────────────────────────────────────────────────────────────────
sma10 = ta.sma(close, 10)
sma25 = ta.sma(close, 25)
ema150 = ta.ema(close, 150)
plot(sma10, color=color.blue, title="SMA 10")
plot(sma25, color=color.red, title="SMA 25")
plot(ema150, color=color.orange, title="EMA 150")
// ─────────────────────────────────────────────────────────────────────────────
// ▌ ENTRY CONDITIONS
// ─────────────────────────────────────────────────────────────────────────────
longCondition = ta.crossover(sma10, sma25)
shortCondition = ta.crossunder(sma10, sma25)
shortValid = close < ema150 // Only take shorts if price is below EMA150
// Plot immediate entry signals (for visual reference)
plotshape(longCondition and (strategy.position_size == 0), title="Long Signal",
style=(longSignalStyle == "Label Up" ? shape.labelup : (longSignalStyle == "Arrow Up" ? shape.triangleup : shape.cross)),
location=location.belowbar, color=color.green, text="Long", size=size.small)
plotshape(shortCondition and shortValid and (strategy.position_size == 0), title="Short Signal",
style=(shortSignalStyle == "Label Down" ? shape.labeldown : (shortSignalStyle == "Arrow Down" ? shape.triangledown : shape.cross)),
location=location.abovebar, color=color.red, text="Short", size=size.small)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ LONG PULLBACK ENTRY USING FIXED PERCENTAGE RETRACEMENT
// ─────────────────────────────────────────────────────────────────────────────
// We use persistent variables to track the pullback signal.
var bool longSignalActive = false
var float pullHigh = na // highest high since long signal activation
var float retraceLevel = na // level = pullHigh * (1 - retracementPct)
// Only consider new entries when no position is open.
if strategy.position_size == 0
// When a long crossover occurs, activate the signal and initialize pullHigh.
if longCondition
longSignalActive := true
pullHigh := high
// If signal active, update pullHigh and compute retracement level.
if longSignalActive
pullHigh := math.max(pullHigh, high)
retraceLevel := pullHigh * (1 - retracementPct)
// When price bounces upward and crosses above the retracement level, enter long
if ta.crossover(close, retraceLevel)
strategy.entry("Long", strategy.long)
longSignalActive := false
// Short entries: enter immediately if conditions are met
if shortCondition and shortValid
strategy.entry("Short", strategy.short)
// ─────────────────────────────────────────────────────────────────────────────
// ▌ EXIT CONDITIONS WITH ADJUSTABLE TP, SL & BE
// ─────────────────────────────────────────────────────────────────────────────
var bool beLong = false
var bool beShort = false
// LONG EXIT LOGIC
if strategy.position_size > 0 and strategy.position_avg_price > 0
longEntry = strategy.position_avg_price
// Additional exit: if SMA(10) crosses below SMA(25) while price < EMA150, exit long
if ta.crossunder(sma10, sma25) and close < ema150
label.new(bar_index, low, "SMA Exit", style=label.style_label_down, color=color.red, textcolor=color.white)
strategy.close("Long", comment="SMA Cross Exit")
// Break-even trigger if price moves in favor by beTrigger points
if close >= longEntry + beTrigger
beLong := true
effectiveLongStop = beLong ? longEntry : (longEntry - slDistance)
if close <= effectiveLongStop
label.new(bar_index, low, (beLong ? "BE Hit" : "SL Hit"), style=label.style_label_down, color=color.red, textcolor=color.white)
strategy.close("Long", comment=(beLong ? "BE Hit" : "SL Hit"))
if close >= longEntry + tpDistance
label.new(bar_index, high, "TP Hit", style=label.style_label_up, color=color.green, textcolor=color.white)
strategy.close("Long", comment="TP Hit")
// SHORT EXIT LOGIC
if strategy.position_size < 0 and strategy.position_avg_price > 0
shortEntry = strategy.position_avg_price
// Basic stop logic
if close >= shortEntry + slDistance
label.new(bar_index, high, (beShort ? "BE Hit" : "SL Hit"), style=label.style_label_up, color=color.red, textcolor=color.white)
strategy.close("Short", comment=(beShort ? "BE Hit" : "SL Hit"))
// Take profit logic
if close <= shortEntry - tpDistance
label.new(bar_index, low, "TP Hit", style=label.style_label_down, color=color.green, textcolor=color.white)
strategy.close("Short", comment="TP Hit")
// Break-even trigger
if close <= shortEntry - beTrigger
beShort := true
effectiveShortStop = beShort ? shortEntry : (shortEntry + slDistance)
if close >= effectiveShortStop
label.new(bar_index, high, (beShort ? "BE Hit" : "SL Hit"), style=label.style_label_up, color=color.red, textcolor=color.white)
strategy.close("Short", comment=(beShort ? "BE Hit" : "SL Hit"))
// Reset BE flags when no position is open
if strategy.position_size == 0
beLong := false
beShort := false
// Reset the pullback signal
if not longSignalActive
pullHigh := na
retraceLevel := na