
Chiến lược nắm bắt xu hướng đảo ngược khối lượng giao dịch là một phương pháp giao dịch định lượng dựa trên khối lượng giao dịch và hành vi giá bất thường, nhằm mục đích xác định thời điểm quan trọng mà thị trường có thể có sự đảo ngược. Cốt lõi của chiến lược này là tìm kiếm các đường K có khối lượng giao dịch cao hơn đáng kể so với mức trung bình và đưa ra quyết định giao dịch ngược lại theo hướng xu hướng trước đó khi xác nhận khối lượng giao dịch giảm.
Các nguyên tắc cốt lõi của chiến lược này dựa trên hiện tượng đảo ngược xu hướng sau khi khối lượng giao dịch bất thường trên thị trường.
Xác định khối lượng giao dịch bất thườngHệ thống kiểm tra xem một dòng K trước có khối lượng giao dịch cao hơn mức trung bình đáng kể hay không. Trong thời gian giao dịch thông thường ((RTH), khối lượng giao dịch cần vượt quá mức trung bình gần đây gấp 3 lần (có thể điều chỉnh); sau khi đóng cửa hoặc trong thời gian đặc biệt ((ETH), cần vượt quá gấp 5 lần. Tính toán khối lượng giao dịch trung bình sẽ tự động loại trừ thời gian rìa RTH, 4-6 giờ sau khi đóng cửa và thời gian trước khi đóng cửa vào Chủ nhật.
Nhận thấy khối lượng giao dịch giảm: Số lượng giao dịch trên đường K hiện tại phải thấp hơn số lượng giao dịch K bất thường trước đó, cho thấy hoạt động giao dịch lớn đã kết thúc.
Xác định xu hướng: Xác định hướng xu hướng bằng cách so sánh giá đóng cửa trước đường K của khối lượng giao dịch bất thường với mối quan hệ của SMA (trung bình di chuyển đơn giản).
Tín hiệu quay ngược:
Thực hiện nhập cảnh:
Quản lý rủi roTheo đặc tính của các giống khác nhau, hệ thống cung cấp hai cách thiết lập dừng / dừng:
Bộ lọc thời gianChiến lược có thể lọc các tín hiệu giao dịch trong 15 phút đầu và cuối của RTH, và luôn lọc các tín hiệu trong thời gian đóng cửa sau khi mở cửa (khoảng 4-6 giờ chiều) và thời gian trước khi mở cửa vào Chủ nhật.
Ghi lại những bước ngoặt quan trọngChiến lược này tập trung vào việc nắm bắt các điểm biến đổi thị trường xuất hiện cùng với khối lượng giao dịch bất thường, các điểm này thường đại diện cho sự thay đổi đáng kể trong tâm trạng thị trường, cung cấp cơ hội giao dịch có tỷ lệ thắng cao hơn.
Điểm vào chính xác: Bằng cách sử dụng đơn giá giới hạn vào các điểm cao / thấp của dòng K khối lượng giao dịch bất thường, đảm bảo giao dịch ở mức giá quan trọng về mặt kỹ thuật, tăng độ chính xác vào.
Tự thích ứng có thể được nhận biếtChiến lược: Điều chỉnh động số lượng giao dịch bất thường theo các thời điểm giao dịch khác nhau (thời gian giao dịch thông thường so với thời gian sau khi mở cửa / thời gian đặc biệt) để phù hợp hơn với thực tế thị trường.
Quản lý rủi ro linh hoạt: Cung cấp các tùy chọn dừng / dừng dựa trên số điểm cố định và ATR, có thể được cá nhân hóa theo đặc điểm và biến động của các giống khác nhau.
Bộ lọc thời gian thông minh: Tự động nhận diện và lọc các thời điểm giao dịch thiếu thanh khoản và không ổn định, tránh các tín hiệu giả mạo có thể xuất hiện gần thị trường mở và đóng.
Phản hồi trực quan rõ ràngChiến lược: cung cấp các chỉ dẫn trực quan trực quan trên biểu đồ, bao gồm các đường giao dịch bất thường K, đường SMA xu hướng, mức cân bằng Stop Loss Stop Loss, thuận tiện cho người giao dịch giám sát và phân tích.
Tự động thực hiệnMột khi các điều kiện được đáp ứng, hệ thống sẽ tự động thực hiện lệnh giảm giá và thiết lập dừng lỗ, giảm can thiệp của con người và duy trì kỷ luật giao dịch.
Rủi ro đột phá giả: khối lượng giao dịch bất thường có thể dẫn đến giá phá vỡ mức quan trọng trong thời gian ngắn, nhưng sau đó có thể rút lui nhanh chóng, gây ra tín hiệu sai. Để giảm thiểu rủi ro này, bạn có thể xem xét thêm các chỉ số xác nhận, chẳng hạn như xác nhận RSI mua quá mức / bán quá mức hoặc yêu cầu thời gian kéo dài phá vỡ.
Tác động của các sự kiện truyền thôngCác dữ liệu kinh tế quan trọng hoặc thông báo của công ty có thể dẫn đến khối lượng giao dịch bất thường, nhưng các phản ứng này thường kéo dài hơn là đảo ngược ngay lập tức.
Rủi ro thay đổi môi trường thị trường: Trong thị trường xu hướng mạnh, giao dịch ngược có thể đối mặt với xu hướng giá bất lợi liên tục. Bạn có thể xem xét thêm bộ lọc xu hướng dài hạn để tránh hoạt động ngược trong môi trường xu hướng mạnh.
Rủi ro không giao dịch: Nếu giá không chạm mức giá giới hạn được thiết lập trên đường K tiếp theo, tín hiệu giao dịch có thể bị mất hiệu lực. Bạn có thể cân nhắc thiết lập thời hạn hiệu lực tối đa hoặc chuyển sang giá thị trường một lần trong điều kiện cụ thể.
Rủi ro về tính thanh khoản thấp: Mặc dù chiến lược đã có tính năng lọc thời gian, một số giống vẫn có thể gặp vấn đề về thiếu thanh khoản trong một khoảng thời gian nhất định.
Rủi ro tối ưu hóa tham sốCác tham số chiến lược được tối ưu hóa quá mức có thể dẫn đến quá phù hợp với dữ liệu lịch sử và không hoạt động tốt trong tương lai. Các tham số nên được đảm bảo trong phạm vi hợp lý và kiểm tra ngoài mẫu để xác minh tính ổn định của chiến lược.
Xác nhận nhiều chu kỳ: Thêm bộ lọc xu hướng với chu kỳ thời gian cao hơn, đảm bảo tỷ lệ thắng cao hơn trong xu hướng xu hướng lớn hơn. Ví dụ: bạn có thể kiểm tra xu hướng xu hướng đường nắng, chỉ tham gia khi phù hợp với xu hướng đường nắng.
Đánh giá chất lượng giao dịchNgoài kích thước khối lượng ròng, có thể xem xét đánh giá chất lượng của khối lượng giao dịch, chẳng hạn như độ lệch của giá trung bình trọng lượng giao dịch (VWAP), để hiểu rõ hơn về hành vi của thị trường đằng sau khối lượng giao dịch lớn.
Chiến lược dừng lỗ động: thực hiện dừng động dựa trên tỷ lệ biến động, tự động điều chỉnh vị trí dừng lỗ để khóa một phần lợi nhuận khi giao dịch đi theo hướng thuận lợi. Ví dụ: có thể sử dụng dừng theo dõi hoặc di chuyển dừng xuống giá chi phí sau khi phá vỡ mức quan trọng.
Bộ lọc liên quan đa giốngĐối với các loại liên quan (ví dụ như chỉ số chứng khoán tương lai và tiền mặt, vàng và bạc, v.v.), thêm các chỉ số xác nhận của các loại liên quan có thể cải thiện chất lượng tín hiệu. Khi nhiều loại liên quan cùng có khối lượng giao dịch và hành vi giá bất thường, tín hiệu có thể đáng tin cậy hơn.
Tối ưu hóa học máy: Phân tích mô hình khối lượng giao dịch bất thường thành công nhất trong dữ liệu lịch sử thông qua thuật toán học máy, điều chỉnh các điều kiện và tham số nhập cảnh một cách động. Ví dụ: cây quyết định hoặc rừng ngẫu nhiên có thể được sử dụng để dự đoán hành động tốt nhất dưới một đặc điểm khối lượng giao dịch bất thường nhất định.
Điều chỉnh tỷ lệ biến động: Điều chỉnh tiêu chuẩn xác định khối lượng giao dịch bất thường và mức dừng / dừng tùy thuộc vào tình trạng biến động hiện tại của thị trường. Trong môi trường biến động cao, tăng khối lượng bất thường có thể xác định ngưỡng và giảm khoảng cách dừng. Trong môi trường biến động thấp, ngược lại.
Thêm bộ lọc cơ bảnTrong các ngày công bố dữ liệu kinh tế quan trọng hoặc báo cáo tài chính hàng quý, điều chỉnh theo mùa các tham số chiến lược hoặc tạm dừng giao dịch để tránh các tín hiệu sai dẫn do nhiễu sóng tin tức.
Chiến lược nắm bắt xu hướng đảo ngược khối lượng giao dịch là một hệ thống giao dịch định lượng tập trung vào khối lượng giao dịch và hành vi giá, để nắm bắt các điểm đảo ngược tiềm năng bằng cách xác định sự thay đổi tâm trạng thị trường sau khối lượng giao dịch bất thường. Chiến lược này xác định rõ ràng về mặt kỹ thuật các điều kiện nhập cảnh, thoát ra và các quy tắc quản lý rủi ro, và bao gồm cơ chế lọc thời gian thông minh để tránh các giai đoạn chất lượng thấp của thị trường.
Ưu điểm cốt lõi của chiến lược này là nó nắm bắt chính xác “hình dạng ngón tay” của thị trường, thường tạo ra cơ hội đảo ngược ngắn hạn khi nhiều người tham gia thị trường đổ vào và sau đó rút ra. Chiến lược này cung cấp một phương pháp giao dịch có kỷ luật bằng cách xác định chính xác vị trí của giá giới hạn ở mức giá quan trọng và kết hợp với quản lý dừng lỗ hợp lý.
Tuy nhiên, người sử dụng nên chú ý đến rủi ro tiềm ẩn của chiến lược trong thị trường có xu hướng mạnh, cũng như sự nhạy cảm với các sự kiện trên mặt tin. Bằng cách thêm xác nhận nhiều chu kỳ thời gian, điều chỉnh các tham số động và tăng cường cơ chế quản lý rủi ro, chiến lược có thể tối ưu hóa hơn nữa tính ổn định và khả năng thích ứng của nó.
Nhìn chung, chiến lược nắm bắt xu hướng đảo ngược khối lượng giao dịch cung cấp cho các nhà giao dịch một hệ thống giao dịch dựa trên các nguyên tắc hành vi và tâm lý của thị trường, đặc biệt phù hợp với thị trường biến động và tình trạng biến động trong khoảng thời gian. Với thiết lập hợp lý và tối ưu hóa liên tục, chiến lược này có khả năng trở thành một công cụ hiệu quả trong danh mục đầu tư giao dịch.
/*backtest
start: 2024-05-13 00:00:00
end: 2025-05-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=5
// Strategy Title Reflects Latest Logic
strategy(title="Middle Finger Trading Strategy",
shorttitle="Middle_Finger",
overlay=true,
pyramiding=0, // Only one entry at a time
default_qty_type=strategy.percent_of_equity,
default_qty_value=1, // Trade 1% of equity
commission_value=0.04, // Example commission (adjust as needed)
commission_type=strategy.commission.percent,
initial_capital = 10000, // Example starting capital
process_orders_on_close=false // Important for limit orders to potentially fill intra-bar
)
// --- Inputs ---
// Volume Settings Group
grp_vol = "Volume Settings"
float rthHugeVolMultiplier = input.float(3.0, title="1. RTH Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for core RTH (9:45-15:44 ET)")
float ethHugeVolMultiplier = input.float(5.0, title="2. ETH/Excluded Huge Vol. Multiplier (> Avg)", minval=1.1, step=0.1, group=grp_vol, tooltip="Multiplier for ETH and first/last 15min RTH (default 5x)")
int volLookback = input.int(20, title="3. Volume SMA Lookback", minval=1, group=grp_vol, tooltip="Lookback for calculating the filtered average volume (Used ONLY for identifying the HUGE spike)")
// Removed normalVolMultiplier as it's no longer used for entry confirmation
// Trend Settings Group
grp_trend = "Trend Settings"
int trendLookback = input.int(20, title="1. Trend SMA Lookback", minval=2, group=grp_trend, tooltip="Lookback period for the Simple Moving Average used to determine the trend before the spike")
// Risk Management Group
grp_risk = "Risk Management (SL/TP)"
string nqTargetTickerId = input.string("CME:NQ1!", title="1. Target Ticker ID for Fixed NQ Points", group=grp_risk, tooltip="Specify the exact Ticker ID (e.g., CME:NQ1!, TVC:NDX) for fixed SL/TP. Found in Symbol Info.")
float nqFixedStopPoints = input.float(20.0, title="2. Fixed SL Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
float nqFixedTpPoints = input.float(50.0, title="3. Fixed TP Points (for Target Ticker)", group=grp_risk, minval=0.1, step=0.1)
// General SL/TP Settings (used if NOT the target ticker)
bool useAtrStops = input.bool(true, title="4. Use ATR for SL/TP (Other Tickers)?", group=grp_risk)
int atrLookback = input.int(14, title="5. ATR Lookback", group=grp_risk, inline="atr_other")
float atrStopMultiplier = input.float(2.0, title="6. ATR SL Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float atrTpMultiplier = input.float(4.0, title="7. ATR TP Multiplier", group=grp_risk, inline="atr_other", minval=0.1, step=0.1)
float fixedStopPoints = input.float(100.0, title="6. Fixed SL Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
float fixedTpPoints = input.float(200.0, title="7. Fixed TP Points (Other Tickers)", group=grp_risk, inline="fixed_other", minval=1)
// Time Filter Settings Group
grp_time = "Time Filter (ET)"
bool enableEntryFilterRthEdges = input.bool(true, title="1. Filter Entries First/Last 15 Min RTH (ET)?", group=grp_time, tooltip="If checked, ignores entries from 9:30-9:44 ET and 15:45-15:59 ET. Avg Vol calc *always* filters these times, 4-6PM ET, and Sun pre-6PM ET.")
string targetTimezone = "America/New_York" // Specify Eastern Time zone
// --- Time Calculation Function ---
isTimeInSession(t, tz, sessionString) =>
not na(time(timeframe.period, sessionString, tz))
// --- Time Context Functions ---
getTimeContext(t, tz) =>
h = hour(t, tz)
m = minute(t, tz)
d = dayofweek(t, tz)
// Core RTH: 9:45 AM to 15:44 PM ET (Mon-Fri)
bool isCoreRTH = d >= dayofweek.monday and d <= dayofweek.friday and
((h == 9 and m >= 45) or (h >= 10 and h <= 14) or (h == 15 and m <= 44))
// Excluded RTH Edges: 9:30-9:44 ET and 15:45-15:59 ET (Mon-Fri)
bool isExcludedRTH = d >= dayofweek.monday and d <= dayofweek.friday and
((h == 9 and m >= 30 and m <= 44) or (h == 15 and m >= 45))
// After Hours Closed: 4:00 PM to 5:59 PM ET (Mon-Fri)
bool isAfterHoursClosed = d >= dayofweek.monday and d <= dayofweek.friday and
(h >= 16 and h < 18)
// Sunday Pre-Market: Sunday before 6:00 PM ET
bool isSundayPreMarket = d == dayofweek.sunday and h < 18
// Combine ALL periods where activity should be ignored or volume excluded from avg
bool isExcludedPeriod = isExcludedRTH or isAfterHoursClosed or isSundayPreMarket
[isCoreRTH, isExcludedRTH, isAfterHoursClosed, isSundayPreMarket, isExcludedPeriod]
// --- Get Time Context for Current and Previous Bar ---
[isCurrentBarCoreRTH, isCurrentBarExcludedRTH, isCurrentBarAfterHoursClosed, isCurrentBarSundayPreMarket, isCurrentBarExcludedPeriod] = getTimeContext(time, targetTimezone)
[isPreviousBarCoreRTH, isPreviousBarExcludedRTH, isPreviousBarAfterHoursClosed, isPreviousBarSundayPreMarket, isPreviousBarExcludedPeriod] = getTimeContext(time[1], targetTimezone)
// --- Calculations ---
// Volume Averaging: Exclude RTH edges, 4-6 PM ET, and Sunday Pre-6 PM ET ALWAYS
// This average is *only* used to define the huge volume spike threshold
bool excludeCurrentVolFromAvg = isCurrentBarExcludedPeriod
float volumeForAvgCalc = excludeCurrentVolFromAvg ? na : volume
float avgVolume = ta.sma(volumeForAvgCalc, volLookback)
// Dynamic Huge Volume Multiplier: Based on *previous* bar's time (Core RTH or not)
float activeHugeVolMultiplier = isPreviousBarCoreRTH ? rthHugeVolMultiplier : ethHugeVolMultiplier
// Use avgVolume[1] as current avgVolume excludes current bar, and we compare previous volume to avg *before* it
float hugeVolThreshold = nz(avgVolume[1]) * activeHugeVolMultiplier
// --- MODIFIED Volume Conditions ---
// 1. Check if the *previous* bar had huge volume compared to its preceding average
bool isHugeVolumePrevBar = volume[1] > hugeVolThreshold and hugeVolThreshold > 0
// 2. Check if the *current* bar's volume is simply lower than the previous (huge) bar's volume
bool isVolumeLowerThanSpike = volume < volume[1]
// Trend Condition
float priceSma = ta.sma(close, trendLookback)
// Ensure trend condition uses close[2] vs sma[2] (trend state *before* the spike bar)
bool isBullishTrendBeforeSpike = close[2] > nz(priceSma[2])
bool isBearishTrendBeforeSpike = close[2] < nz(priceSma[2])
// --- Entry Time Filtering ---
// Always filter After Hours Closed and Sunday Pre-Market.
// Optionally filter RTH Edges based on input.
bool shouldFilterRthEdges = enableEntryFilterRthEdges and isCurrentBarExcludedRTH
bool isIgnoreEntryTime = shouldFilterRthEdges or isCurrentBarAfterHoursClosed or isCurrentBarSundayPreMarket
// --- MODIFIED Base Conditions ---
// Uses the simplified `isVolumeLowerThanSpike` check
bool baseLongCondition = isBearishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
bool baseShortCondition = isBullishTrendBeforeSpike and isHugeVolumePrevBar and isVolumeLowerThanSpike
// Final Conditions (Apply Time Filter)
bool finalLongCondition = baseLongCondition and not isIgnoreEntryTime
bool finalShortCondition = baseShortCondition and not isIgnoreEntryTime
// --- Stop Loss & Take Profit Calculation (Conditional Logic) ---
// This part remains the same
float atrValue = ta.atr(atrLookback)
float tickValue = syminfo.mintick
int stopLossTicks = 100 // Default fallback SL ticks
int takeProfitTicks = 200 // Default fallback TP ticks
// Check if the current symbol matches the target ticker ID
bool isTargetTicker = str.upper(syminfo.tickerid) == str.upper(nqTargetTickerId) // Case-insensitive comparison
if (isTargetTicker and tickValue > 0)
// --- Target Ticker Logic (e.g., NQ Fixed Points) ---
float ticksPerPoint = 1.0 / tickValue
stopLossTicks := math.max(1, math.round(nqFixedStopPoints * ticksPerPoint))
takeProfitTicks := math.max(1, math.round(nqFixedTpPoints * ticksPerPoint))
else if tickValue > 0 // Use only if tickValue is valid
// --- Standard Logic (Other Tickers: ATR or Fixed) ---
float stopLossDistance = useAtrStops ? atrValue * atrStopMultiplier : fixedStopPoints * tickValue
float takeProfitDistance = useAtrStops ? atrValue * atrTpMultiplier : fixedTpPoints * tickValue
// Calculate ticks, ensuring it's at least 1 tick
stopLossTicks := na(stopLossDistance) ? 100 : math.max(1, math.round(stopLossDistance / tickValue))
takeProfitTicks := na(takeProfitDistance) ? 200 : math.max(1, math.round(takeProfitDistance / tickValue))
// Final check to ensure SL/TP are not na
stopLossTicks := nz(stopLossTicks, 100)
takeProfitTicks := nz(takeProfitTicks, 200)
// --- Strategy Execution ---
// Uses Limit Orders based on previous bar's low/high - Remains the same
float limitEntryPriceLong = low[1] // Target entry at the low of the huge volume bar
float limitEntryPriceShort = high[1] // Target entry at the high of the huge volume bar
if (finalLongCondition and strategy.position_size == 0)
strategy.cancel("S") // Cancel any pending short limit order first
strategy.entry("L", strategy.long, limit = limitEntryPriceLong)
strategy.exit("L SL/TP", from_entry="L", loss=stopLossTicks, profit=takeProfitTicks)
if (finalShortCondition and strategy.position_size == 0)
strategy.cancel("L") // Cancel any pending long limit order first
strategy.entry("S", strategy.short, limit = limitEntryPriceShort)
strategy.exit("S SL/TP", from_entry="S", loss=stopLossTicks, profit=takeProfitTicks)
// --- Plotting & Visuals ---
plot(avgVolume, title="Filtered Avg Volume", color=color.new(color.blue, 60), style=plot.style_line)
// Removed the plot for the normal volume threshold as it's no longer used
// Highlight huge volume bar (previous bar that triggered the signal)
bgcolor(isHugeVolumePrevBar[1] ? color.new(color.yellow, 85) : na, title="Huge Volume Bar [-1]")
// Highlight bars excluded from volume average calculation
bgcolor(excludeCurrentVolFromAvg ? color.new(color.teal, 90) : na, title="Vol Excluded from Avg Calc")
// Highlight bars where entries are ignored due to time filters
bgcolor(isIgnoreEntryTime and (baseLongCondition or baseShortCondition) ? color.new(color.gray, 75) : na, title="Entry Time Filtered Bar")
// --- MODIFIED Highlight base conditions met ---
// Reflects the updated base conditions using isVolumeLowerThanSpike
bgcolor(baseLongCondition and not isIgnoreEntryTime ? color.new(color.green, 90) : na, title="Base Long Condition Met")
bgcolor(baseShortCondition and not isIgnoreEntryTime ? color.new(color.red, 90) : na, title="Base Short Condition Met")
plot(priceSma, title="Trend SMA", color=color.gray)
// Plot SL/TP levels for visualization - Remains the same
var float entryPrice = na
var float slLevel = na
var float tpLevel = na
if (strategy.opentrades > 0 and strategy.opentrades[1] == 0) // Just entered a trade
entryPrice := strategy.opentrades.entry_price(0)
if (strategy.position_size > 0) // Long
slLevel := entryPrice - stopLossTicks * tickValue
tpLevel := entryPrice + takeProfitTicks * tickValue
else // Short
slLevel := entryPrice + stopLossTicks * tickValue
tpLevel := entryPrice - takeProfitTicks * tickValue
else if (strategy.opentrades == 0 and strategy.opentrades[1] > 0) // Position closed
entryPrice := na
slLevel := na
tpLevel := na
else if (strategy.opentrades > 0) // Position still open
entryPrice := strategy.opentrades.entry_price(0)
if (strategy.position_size > 0) // Long
slLevel := entryPrice - stopLossTicks * tickValue
tpLevel := entryPrice + takeProfitTicks * tickValue
else // Short
slLevel := entryPrice + stopLossTicks * tickValue
tpLevel := entryPrice - takeProfitTicks * tickValue
plot(strategy.opentrades > 0 ? slLevel : na, title="Stop Loss Level", color=color.red, style=plot.style_linebr)
plot(strategy.opentrades > 0 ? tpLevel : na, title="Take Profit Level", color=color.green, style=plot.style_linebr)
// Optional Debugging Plots
// plotchar(isHugeVolumePrevBar, "HugeVol[1]", "H", location.bottom, color.yellow, size=size.tiny)
// plotchar(isVolumeLowerThanSpike, "VolLow", "v", location.bottom, color.purple, size=size.tiny) // Changed char
// plotchar(finalLongCondition, "FinalLong", "L", location.top, color.green, size=size.tiny)
// plotchar(finalShortCondition, "FinalShort", "S", location.top, color.red, size=size.tiny)
// plot(finalLongCondition ? limitEntryPriceLong : na, "Long Limit Target", color.lime, style=plot.style_circles, linewidth=2)
// plot(finalShortCondition ? limitEntryPriceShort : na, "Short Limit Target", color.fuchsia, style=plot.style_circles, linewidth=2)