Chiến lược giao dịch định lượng đột phá động lực đa giai đoạn, đa chỉ báo, tần suất cao

EMA SMA RSI ATR 突破策略 时间过滤 追踪止损 动态风险管理
Ngày tạo: 2025-08-04 11:57:30 sửa đổi lần cuối: 2025-08-04 11:57:30
sao chép: 0 Số nhấp chuột: 241
2
tập trung vào
319
Người theo dõi

Chiến lược giao dịch định lượng đột phá động lực đa giai đoạn, đa chỉ báo, tần suất cao Chiến lược giao dịch định lượng đột phá động lực đa giai đoạn, đa chỉ báo, tần suất cao

Tổng quan

Chiến lược giao dịch định lượng đột phá động cao tần số đa thời gian là một hệ thống giao dịch hiệu suất cao được thiết kế cho giao dịch đường ngắn tần số cao ((Scalping)). Chiến lược này được phát triển dựa trên Pine Script 5, kết hợp nhiều chỉ số kỹ thuật và chức năng lọc thời gian để nhận ra tín hiệu đột phá thị trường và thực hiện giao dịch tốc độ cao. Nguyên tắc cốt lõi là xác minh bằng nhiều chỉ số như EMA, SMA, RSI, kết hợp với phát hiện đột phá giá và quản lý rủi ro động ATR, để nắm bắt cơ hội đường ngắn trong một giai đoạn giao dịch cụ thể.

Nguyên tắc chiến lược

Lý luận cốt lõi của chiến lược này dựa trên hệ thống phá vỡ giá được xác nhận bởi nhiều điều kiện, cơ chế thực hiện cụ thể như sau:

  1. Bảng chỉ số kỹ thuật

    • Sử dụng EMA nhanh ((34 chu kỳ) và EMA chậm ((63 chu kỳ) để xác định hướng xu hướng
    • Sử dụng SMA ((34 chu kỳ) làm bộ lọc giá
    • Ứng dụng RSI ((thời kỳ 14) để xác định vùng quá mua quá bán
    • Sử dụng ATR ((14 chu kỳ) để tính toán mức dừng động và mức lợi nhuận
  2. Phân tích logic đột phá

    • Xác định giá trị cao nhất trong chu kỳ N (bằng mặc định 1) làm điểm kháng cự
    • Xác định mức giá thấp nhất trong chu kỳ N (bằng mặc định 1) như là mức giá hỗ trợ
    • Đánh dấu nhiều khi giá vượt qua ngưỡng kháng cự và đáp ứng các điều kiện khác
    • Kích hoạt tín hiệu lỗ hổng khi giá vượt ngưỡng hỗ trợ và đáp ứng các điều kiện khác
  3. Xác nhận đa điều kiện

    • Làm nhiều điều kiện: Giá vượt ngưỡng kháng cự + EMA nhanh trên đường chậm + RSI không vượt mức mua + Giá trên SMA
    • Điều kiện tháo lỗ: Giá giảm dưới mức hỗ trợ + EMA nhanh dưới đường chậm + RSI không bán quá mức + Giá dưới SMA
  4. Hệ thống lọc thời gian

    • Có 4 thời gian giao dịch tùy chỉnh, có thể thiết lập cửa sổ giao dịch linh hoạt
    • Thuật toán tính thời gian tối ưu hóa, chuyển đổi thời gian thành số phút tích lũy để cải thiện hiệu quả xử lý
  5. Quản lý rủi ro động

    • Hạn chế động dựa trên ATR, gấp 3 lần ATR mặc định
    • Mục tiêu lợi nhuận động dựa trên ATR, mặc định là 3 lần ATR
    • Tính năng theo dõi dừng lỗ tùy chọn, tự động điều chỉnh vị trí dừng lỗ theo biến động của thị trường
  6. Thiết kế tối ưu hóa hiệu suất

    • Tính thường tính trước giảm tính toán lặp lại
    • Tốc độ xử lý kết quả tính toán chỉ số lưu trữ
    • Thiết lập bộ lọc thời gian lưu trữ mảng để xử lý hiệu quả

Lợi thế chiến lược

Chiến lược này có những lợi thế đáng kể sau:

  1. Khả năng thực hiện nhanh: Với calc_on_every_tick=true thiết lập, có thể phản ứng ngay lập tức với mỗi sự thay đổi giá, đặc biệt phù hợp với môi trường giao dịch tần số cao. Sử dụng công nghệ tính toán trước thường xuyên và bộ nhớ đệm chỉ số trong mã, tăng thêm tốc độ thực hiện.

  2. Cơ chế xác nhận đa dạngKết hợp với nhiều tín hiệu giao dịch xác nhận chỉ số như EMA, SMA, RSI, giảm đáng kể nguy cơ phá vỡ giả. Hệ thống xác nhận này đảm bảo chỉ mở vị trí khi nhiều điều kiện được đáp ứng cùng một lúc, nâng cao chất lượng giao dịch.

  3. Bộ lọc thời gian linh hoạt: Bằng cách sử dụng bốn giai đoạn giao dịch có thể tùy chỉnh, cho phép các nhà giao dịch tập trung vào các giai đoạn thị trường có tính thanh khoản cao và biến động cao, tránh các giai đoạn thị trường ít hoạt động và không ổn định.

  4. Quản lý rủi ro độngĐộng thái dừng lỗ và mục tiêu thu lợi nhuận dựa trên ATR cho phép chiến lược tự động điều chỉnh các tham số rủi ro theo biến động của thị trường để thích ứng với các điều kiện thị trường khác nhau

  5. Hỗ trợ tự động hóa đầy đủ: Thông qua PineConnector và tích hợp với MT5, thực hiện giao dịch hoàn toàn tự động, giảm sự can thiệp của con người và ảnh hưởng về cảm xúc. Mã bao gồm một hệ thống cảnh báo hoàn chỉnh, hỗ trợ chế độ thực hiện nhanh chóng.

  6. Tối ưu hóa sử dụng tài nguyên: Bằng cách tính toán trước các kết quả của các chỉ số hằng số và bộ nhớ cache, việc tiêu thụ tài nguyên tính toán được giảm hiệu quả, đảm bảo hoạt động hiệu quả trong môi trường giao dịch thời gian thực.

  7. Hỗ trợ quyết định bằng hình ảnhChiến lược có bảng hiển thị chỉ số hiệu suất và đánh dấu vị trí, cung cấp trạng thái giao dịch trực quan và hình ảnh tín hiệu, hỗ trợ giám sát và ra quyết định bằng tay.

Rủi ro chiến lược

Mặc dù có nhiều ưu điểm, chiến lược này vẫn có những rủi ro và thách thức:

  1. Giao dịch tần số cao có nhiều rủi roTrong môi trường giao dịch tần số cao, điểm trượt, chậm trễ và chi phí giao dịch có thể ảnh hưởng đáng kể đến kết quả giao dịch thực tế. Mặc dù có chế độ thực hiện nhanh trong mã, nhưng trong môi trường giao dịch thực tế có thể vẫn bị giới hạn bởi tốc độ thực hiện của nền tảng giao dịch và nhà môi giới.

  2. Bẫy phá vỡ giảMặc dù sử dụng cơ chế xác nhận nhiều lần, nhưng trong thị trường biến động cao, tín hiệu phá vỡ giả vẫn có thể được kích hoạt, dẫn đến tổn thất giao dịch không cần thiết. Rủi ro này đặc biệt rõ rệt khi các tham số được đặt không đúng hoặc điều kiện thị trường thay đổi đột ngột.

  3. Rủi ro quá ưu đãiChiến lược liên quan đến nhiều tham số (các thiết lập chu kỳ như EMA, SMA, RSI) và có nguy cơ tối ưu hóa quá mức (các điều kiện phù hợp với đường cong) có thể dẫn đến chiến lược không hoạt động tốt trong thực tế.

  4. Hạn chế lọc thời gianMặc dù lọc thời gian có thể tránh được các phiên giao dịch kém hiệu quả, nhưng cũng có thể bỏ lỡ các cơ hội giao dịch có lợi ngoài các phiên nhất định, đặc biệt là khi có sự kiện thị trường quan trọng hoặc thông báo.

  5. Hạn chế trong kiểm soát rủi ro cơ bản của ATRTrong điều kiện thị trường cực đoan, các mục tiêu dừng lỗ và lợi nhuận dựa trên ATR có thể không đủ để đối phó với những biến động lớn đột ngột, dẫn đến hiệu quả dừng lỗ hoặc kết thúc lợi nhuận sớm.

Các biện pháp giảm thiểu rủi ro

  • Khuyến nghị thực hiện kiểm tra lại đầy đủ và xác minh giao dịch mô phỏng trước khi thực hiện giao dịch
  • Điều chỉnh các thiết lập tham số cho các điều kiện thị trường khác nhau, đặc biệt là ATR và chu kỳ chỉ số
  • Xem xét thêm các bộ lọc trạng thái thị trường bổ sung, chẳng hạn như chỉ số biến động hoặc điều kiện khối lượng giao dịch
  • Thực hiện các quy tắc quản lý tiền để hạn chế rủi ro giao dịch đơn lẻ
  • Theo dõi và đánh giá hoạt động của chiến lược thường xuyên, điều chỉnh kịp thời theo sự thay đổi của thị trường

Hướng tối ưu hóa chiến lược

Dựa trên phân tích mã, đây là những hướng mà chiến lược này có thể được tối ưu hóa hơn nữa:

  1. Các tham số động tự điều chỉnh

    • Thực hiện điều chỉnh động các tham số chỉ số như EMA, SMA, RSI, tự động tối ưu hóa tham số theo tình trạng thị trường
    • Có thể xem xét việc giới thiệu thuật toán học máy để thực hiện tự thích ứng tham số, cải thiện khả năng thích ứng chiến lược
  2. Phân loại tình trạng thị trường

    • Thêm mô-đun nhận dạng trạng thái thị trường, phân biệt thị trường xu hướng và thị trường chấn động
    • Ứng dụng logic giao dịch và tham số rủi ro khác nhau tùy theo tình trạng thị trường khác nhau
  3. Cải thiện hệ thống lọc

    • Tiếp tục đưa ra chỉ số khối lượng giao dịch như một điều kiện lọc bổ sung để tránh đột phá giả mạo trong môi trường thiếu thanh khoản
    • Thêm bộ lọc biến động, tạm dừng giao dịch trong điều kiện thị trường quá biến động hoặc không đủ biến động
  4. Tối ưu hóa chiến lược dừng lỗ

    • Thực hiện các chiến lược dừng lỗ phức tạp hơn, chẳng hạn như dừng lỗ thông minh dựa trên điểm hỗ trợ / kháng cự
    • Thêm chức năng thu lợi nhuận một phần, cho phép thanh toán hàng loạt để khóa một phần lợi nhuận
  5. Đánh giá tín hiệu

    • Phát triển hệ thống đánh giá cường độ tín hiệu, đánh giá chất lượng tín hiệu dựa trên nhiều yếu tố
    • Đổi kích thước vị trí động dựa trên cường độ tín hiệu, cho phép quản lý tiền tinh tế hơn
  6. Quay lại kiểm soát

    • Thêm cơ chế kiểm soát rút tối đa, tạm dừng giao dịch khi thua lỗ liên tục đạt mức giảm giá
    • Thực hiện các cơ chế bảo vệ lợi nhuận để đảm bảo không bị tụt giảm từ lợi nhuận sang thua lỗ
  7. Tối ưu hóa hiệu quả tính toán

    • Tối ưu hóa hơn nữa các hoạt động tích cực tính toán, chẳng hạn như sử dụng bảng tìm kiếm thay cho tính toán lặp lại
    • Để thực hiện các thuật toán lọc thời gian hiệu quả hơn, giảm gánh nặng tính toán cho mỗi biểu đồ cột

Những hướng tối ưu hóa này không chỉ giúp cải thiện hiệu suất và tính ổn định của chiến lược, mà còn tăng cường khả năng thích ứng với các điều kiện thị trường khác nhau, mang lại lợi nhuận lâu dài bền vững hơn.

Tóm tắt

Chiến lược giao dịch số lượng đột phá động cao tần số đa chỉ số đa thời gian là một hệ thống giao dịch tần số cao toàn diện được thiết kế cho các nhà giao dịch ngắn. Chiến lược này xây dựng một khung giao dịch hoàn chỉnh bằng cách kết hợp nhiều chỉ số kỹ thuật, nhận diện đột phá giá, lọc thời gian và quản lý rủi ro động. Ưu điểm cốt lõi của nó là khả năng thực hiện nhanh, cơ chế xác nhận nhiều lần và hỗ trợ tự động linh hoạt, đặc biệt phù hợp cho ứng dụng trên khung thời gian ngắn của tài sản biến động.

Các đặc điểm kỹ thuật chính của chiến lược bao gồm xu hướng phán đoán chéo EMA, SMA làm bộ lọc giá, RSI tránh giao dịch khu vực quá mua quá bán, và quản lý rủi ro động ATR. Việc tích hợp hệ thống lọc thời gian và PineConnector làm tăng thêm tính thiết thực và linh hoạt của chiến lược.

Mặc dù chiến lược này phải đối mặt với những thách thức như rủi ro đặc trưng của giao dịch tần số cao và bẫy đột phá giả, nhưng những rủi ro này có thể được kiểm soát hiệu quả thông qua quản lý rủi ro và tối ưu hóa tham số hợp lý. Các hướng tối ưu hóa trong tương lai bao gồm tùy biến tham số, phân loại trạng thái thị trường, tăng cường hệ thống lọc và chiến lược dừng lỗ thông minh, những cải tiến này sẽ tiếp tục nâng cao sự ổn định và khả năng sinh lợi của chiến lược.

Đối với các nhà giao dịch tìm kiếm lợi thế trong giao dịch ngắn hạn, chiến lược này cung cấp một giải pháp giao dịch số lượng cao về mặt kỹ thuật và logic, đặc biệt phù hợp với những người dùng quan tâm đến giao dịch tốc độ cao và muốn tăng hiệu quả giao dịch thông qua công nghệ tự động hóa.

Mã nguồn chiến lược
/*backtest
start: 2024-08-04 00:00:00
end: 2025-08-02 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"DOGE_USDT"}]
*/

//@version=5
strategy("Scalper TURBO", overlay=true, initial_capital=1000, 
         default_qty_type=strategy.percent_of_equity, default_qty_value=50,
         calc_on_every_tick=true, process_orders_on_close=false)

// ==================== PERFORMANCE OPTIMIZATIONS ====================
// Pre-calculate constants to avoid repeated calculations
const int MINUTES_PER_HOUR = 60

// ==================== INPUT PARAMETERS ====================
// Technical Parameters
emaFastLen    = input.int(34, "EMA Rápida", minval=1)
emaSlowLen    = input.int(63, "EMA Lenta", minval=1)
smaLen        = input.int(34, "SMA Filtro", minval=1)
rsiLen        = input.int(14, "Periodo RSI", minval=1)
rsiOverbought = input.int(70, "RSI Sobrecompra", minval=1, maxval=100)
rsiOversold   = input.int(30, "RSI Sobreventa", minval=1, maxval=100)
breakoutPeriod = input.int(1, "Periodos para Breakout", minval=1)
atrLen        = input.int(14, "Periodo ATR", minval=1)
atrMultSL     = input.float(3, "Multiplicador ATR Stop-Loss", step=0.1)
atrMultTrail  = input.float(3, "Multiplicador ATR Trailing Stop", step=0.1)

// ==================== TIME FILTER SETTINGS ====================
var g_timefilters = "Time Filters"

// Time Filter Arrays for faster processing
useTimeFilter = array.new_bool(4)
startHour = array.new_int(4)
startMin = array.new_int(4)
endHour = array.new_int(4)
endMin = array.new_int(4)

// Time Filter 1
array.set(useTimeFilter, 0, input.bool(false, "Enable Time Filter 1", group=g_timefilters))
array.set(startHour, 0, input.int(9, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1start"))
array.set(startMin, 0, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1start"))
array.set(endHour, 0, input.int(11, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf1end"))
array.set(endMin, 0, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf1end"))

// Time Filter 2
array.set(useTimeFilter, 1, input.bool(false, "Enable Time Filter 2", group=g_timefilters))
array.set(startHour, 1, input.int(13, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2start"))
array.set(startMin, 1, input.int(30, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2start"))
array.set(endHour, 1, input.int(15, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf2end"))
array.set(endMin, 1, input.int(0, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf2end"))

// Time Filter 3
array.set(useTimeFilter, 2, input.bool(false, "Enable Time Filter 3", group=g_timefilters))
array.set(startHour, 2, input.int(16, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3start"))
array.set(startMin, 2, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3start"))
array.set(endHour, 2, input.int(18, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf3end"))
array.set(endMin, 2, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf3end"))

// Time Filter 4
array.set(useTimeFilter, 3, input.bool(false, "Enable Time Filter 4", group=g_timefilters))
array.set(startHour, 3, input.int(20, "Start Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4start"))
array.set(startMin, 3, input.int(0, "Start Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4start"))
array.set(endHour, 3, input.int(22, "End Hour", minval=0, maxval=23, group=g_timefilters, inline="tf4end"))
array.set(endMin, 3, input.int(30, "End Minute", minval=0, maxval=59, group=g_timefilters, inline="tf4end"))

// ==================== PINECONNECTOR SETTINGS ====================
var g_connector = "PineConnector Settings"
pcID = input.string(" ", "Pine Connector ID", group=g_connector)
symbolName = input.string("XAUUSD", "Symbol Name", tooltip="Symbol exactly as it appears in your MT5", group=g_connector)
lotSize = input.float(0.01, "Lot Size", step=0.01, group=g_connector)
enableRealTrading = input.bool(true, "Enable Real Trading", group=g_connector)
useFastExecution = input.bool(true, "Use Fast Execution Mode", group=g_connector)
showLabels = input.bool(true, "Show Info Labels", group=g_connector)

// Risk Management
useStopLoss = input.bool(true, "Use Stop Loss", group=g_connector)
useTakeProfit = input.bool(true, "Use Take Profit", group=g_connector)
useTrailingStop = input.bool(false, "Use Trailing Stop", group=g_connector)
stopLossATRMult = input.float(3, "Stop Loss ATR Multiple", step=0.1, group=g_connector)
takeProfitATRMult = input.float(3, "Take Profit ATR Multiple", step=0.1, group=g_connector)
trailingStopATRMult = input.float(3, "Trailing Stop ATR Multiple", step=0.1, group=g_connector)

// ==================== OPTIMIZED TIME FILTER FUNCTION ====================
// Cache current time components
currentHour = hour(time)
currentMin = minute(time)
currentTimeMinutes = currentHour * MINUTES_PER_HOUR + currentMin

// Optimized time check function
isTimeAllowed() =>
    anyEnabled = false
    timeOK = false
    
    for i = 0 to 3
        if array.get(useTimeFilter, i)
            anyEnabled := true
            startTimeMin = array.get(startHour, i) * MINUTES_PER_HOUR + array.get(startMin, i)
            endTimeMin = array.get(endHour, i) * MINUTES_PER_HOUR + array.get(endMin, i)
            
            inRange = startTimeMin <= endTimeMin ? 
                     (currentTimeMinutes >= startTimeMin and currentTimeMinutes <= endTimeMin) :
                     (currentTimeMinutes >= startTimeMin or currentTimeMinutes <= endTimeMin)
            
            if inRange
                timeOK := true
                break
    
    not anyEnabled or timeOK

// ==================== CACHED INDICATOR CALCULATIONS ====================
// Calculate indicators only once per bar
emaFast = ta.ema(close, emaFastLen)
emaSlow = ta.ema(close, emaSlowLen)
sma34   = ta.sma(close, smaLen)
rsi     = ta.rsi(close, rsiLen)
atr     = ta.atr(atrLen)

// Support/Resistance with caching
var float resistenciaReciente = na
var float soporteReciente = na
if barstate.isconfirmed
    resistenciaReciente := ta.highest(high, breakoutPeriod)[1]
    soporteReciente := ta.lowest(low, breakoutPeriod)[1]

// ==================== SIGNAL CONDITIONS ====================
// Pre-calculate all conditions
tendenciaAlcista = emaFast > emaSlow
tendenciaBajista = emaFast < emaSlow
rsiNotOverbought = rsi < rsiOverbought
rsiNotOversold = rsi > rsiOversold
priceAboveSMA = close > sma34
priceBelowSMA = close < sma34
timeAllowed = isTimeAllowed()

// Breakout conditions
breakoutUp = close > resistenciaReciente
breakoutDown = close < soporteReciente

// Final entry conditions - simplified logic
longSignal = breakoutUp and tendenciaAlcista and rsiNotOverbought and priceAboveSMA and timeAllowed
shortSignal = breakoutDown and tendenciaBajista and rsiNotOversold and priceBelowSMA and timeAllowed

// ==================== POSITION MANAGEMENT ====================
// Efficient position tracking
var int currentPosition = 0  // 1 = long, -1 = short, 0 = flat
var bool positionChanged = false
var string pendingAlert = ""

// Detect position changes
newLong = longSignal and currentPosition <= 0
newShort = shortSignal and currentPosition >= 0

// ==================== OPTIMIZED ALERT SYSTEM ====================
// Pre-build alert components for faster execution
stopPips = useStopLoss ? str.tostring(math.round(atr * stopLossATRMult * 100)) : ""
tpPips = useTakeProfit ? str.tostring(math.round(atr * takeProfitATRMult * 100)) : ""
trailPips = useTrailingStop ? str.tostring(math.round(atr * trailingStopATRMult * 100)) : ""

// Build risk management string once
riskParams = useStopLoss ? ",sl=" + stopPips : ""
riskParams += useTakeProfit ? ",tp=" + tpPips : ""
riskParams += useTrailingStop ? ",trailingstop=" + trailPips : ""

// ==================== FAST EXECUTION MODE ====================
if enableRealTrading
    // LONG ENTRY
    if newLong
        // Close short first if needed
        if currentPosition < 0
            alert(pcID + ",closeshort," + symbolName, alert.freq_once_per_bar)
        
        // Enter long
        strategy.entry("Long", strategy.long)
        longAlert = pcID + ",buy," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
        alert(longAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
        currentPosition := 1
    
    // SHORT ENTRY
    else if newShort
        // Close long first if needed
        if currentPosition > 0
            alert(pcID + ",closelong," + symbolName, alert.freq_once_per_bar)
        
        // Enter short
        strategy.entry("Short", strategy.short)
        shortAlert = pcID + ",sell," + symbolName + ",risk=" + str.tostring(lotSize) + riskParams
        alert(shortAlert, useFastExecution ? alert.freq_once_per_bar : alert.freq_once_per_bar_close)
        currentPosition := -1
else
    // Backtest mode
    if newLong
        strategy.entry("Long", strategy.long)
        currentPosition := 1
    else if newShort
        strategy.entry("Short", strategy.short)
        currentPosition := -1

// ==================== STOP LOSS MANAGEMENT ====================
// Calculate stops only when in position
if currentPosition != 0
    if currentPosition > 0
        stopLong = strategy.position_avg_price - atr * atrMultSL
        strategy.exit("Exit Long", "Long", stop=stopLong, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)
    else
        stopShort = strategy.position_avg_price + atr * atrMultSL
        strategy.exit("Exit Short", "Short", stop=stopShort, trail_points=atr * atrMultTrail, trail_offset=atr * atrMultTrail)

// Detect exits
if strategy.position_size == 0 and currentPosition != 0
    if enableRealTrading
        exitAlert = currentPosition > 0 ? pcID + ",closelong," + symbolName : pcID + ",closeshort," + symbolName
        alert(exitAlert, alert.freq_once_per_bar)
    currentPosition := 0