
Стратегия торговли с нулевой задержкой трендового сигнала многократной временной рамки - это количественная торговая система, основанная на индексе с нулевой задержкой сдвигающейся средней (ZLEMA), предназначенная для уменьшения задержки традиционных движущихся средних и предоставления более быстрых и точных сигналов для идентификации тренда. Стратегия не только сочетает волатильные каналы для идентификации изменений в тренде, но также включает в себя множество гибких механизмов выхода, включая отчет о риске, сравнение выхода с выходом с прибылью, целевой выход, остановки и остановки на основе ATR, динамическое отслеживание остановок убытков и выхода из всех линий.
Основные принципы стратегии основаны на индексе нулевой задержки (ZLEMA), который является техническим показателем для повышения скорости реагирования скользящих средних за счет устранения или уменьшения задержки в ценовых данных. Конкретные шаги по реализации следующие:
С нулевой задержкойСтратегия: сначала ZLEMA рассчитывается по формуле:zlema = ta.ema(src + (src - src[lag]), length)В том числе:lagЭтот метод эффективно уменьшает задержку в традиционных EMA.
Механизм определения тенденций:
zlemaUpTrendиzlemaDownTrendРеализация переменныхРазнообразие условий приема:
Комплексная динамическая система выступлений:
Стратегии торговли с нулевой задержкой трендовых сигналов в многократных временных рамках имеют значительные преимущества:
Снижение опозданияZLEMA уменьшает задержку традиционных движущихся средних, позволяя более своевременно идентифицировать тренды и запечатлеть их начало раньше.
Комплексная система управления рискамиИнтеграция многоуровневых механизмов контроля риска, от фиксированного стопа, динамического стопа ATR, отслеживания стопа до стопа прибыли и убытков, обеспечивающих защиту от различных рыночных условий.
Гибкий выбор направления торговли: может быть настроен как только многостратегическая или двусторонняя торговая стратегия, чтобы адаптироваться к различным рыночным предпочтениям и регулирующей среде.
Механизм восстановления: с помощью функции ZLEMA нулевой линии возобновления входа, которая позволяет возобновлять вход после кратковременного отклонения в сильных тенденциях, чтобы максимизировать прибыль от тренда.
Стратегия диверсификационного выхода: предлагает различные варианты выхода в зависимости от рыночных условий, как с помощью целевых прибылей, так и с помощью отслеживания стоп-лосса.
Визуальная помощьИнтуитивное отображение торговых сигналов и позиций управления рисками с помощью визуальных элементов, таких как тень тренда, линия стоп-лосса, линия стоп-броска и индикатор тренда.
Подробные статистические данныеИнтегрированные таблицы с статистикой сделок, показывающие ключевые показатели, такие как коэффициент выигрыша, чистая прибыль и максимальное снятие, для удобства оценки и оптимизации стратегии.
Несмотря на разумную конструкцию, существуют некоторые потенциальные риски, о которых следует помнить:
Параметр ЧувствительностьКлючевые параметры, такие как длина ZLEMA и кратность ATR, оказывают значительное влияние на эффективность стратегии. Неправильная настройка может привести к избыточному или недостаточному количеству сигналов.
Ложные сигналы рынкаНапример, в случае, когда рынок находится в состоянии колебаний, при отсутствии четкой тенденции, могут возникать часто ложные сигналы, которые приводят к непрерывным убыткам.
Риск изменения трендаХотя в стратегии разработаны различные механизмы выхода, в случае резкого переворота тенденции, возможно, что вы не успеете выйти и понесете большие убытки.
Риск переизмеримостиКомбинация нескольких параметров может привести к чрезмерному сопоставлению исторических данных, которые будут плохо работать в будущих рыночных условиях.
Сигналы длительного цикла редкиПри использовании более длинных длин ZLEMA стратегия может создавать меньше торговых сигналов, что влияет на эффективность использования средств.
Задача сдерживания шириныПрекращение, основанное на ATR, может быть слишком широким в высоко волатильных рынках, что приводит к слишком большим потерям в одиночку; а в низко волатильных рынках может быть слишком узким, что приводит к частому срабатыванию.
Методы смягчения этих рисков включают в себя: строгий отсчет параметров и предварительную проверку, избегание торговли на волатильных рынках в сочетании с индикаторами состояния рынка, применение строгих правил управления капиталом, регулярная оптимизация параметров стратегии в соответствии с изменениями рынка.
В этой стратегии есть много возможностей для оптимизации и дальнейшего повышения производительности:
Динамические параметры самостоятельно адаптируютсяРазработка механизмов адаптации, автоматически корректирующих длину ZLEMA и кратность ATR в зависимости от волатильности рынка, повышая адаптивность стратегии в различных рыночных условиях.
Фильтр состояния рынкаВнедрение индикаторов состояния рынка (например, ADX, индикатор волатильности), торговля только в благоприятных рыночных условиях, избегание частого трейдинга в неэффективных волатильных рынках.
Подтверждение многократных временных рамокУспешный выбор: присоединиться к тренду в более высоких временных рамках, присоединиться к тренду в больших временных рамках, чтобы повысить успех.
Подтверждение объема сделкиИнтеграция показателей объема торгов в качестве вспомогательного подтверждения, например, признание сигналов изменения тренда только при увеличении объема торгов.
Оптимизация машинного обучения: использование алгоритмов машинного обучения для поиска оптимальных комбинаций параметров и времени входа в игру, особенно для обучения моделей прогнозировать, какие сигналы более вероятны для успеха.
Сезонные и временные фильтрыДобавить фильтры для торговых периодов и календаря, чтобы избежать неэффективных или рискованных периодов.
Анализ взаимосвязи активовВведение анализа корреляции соответствующих активов для повышения надежности сигналов при подтверждении многоактивных симметрий.
Эти направления оптимизации могут не только повысить стабильность и рентабельность стратегии, но и снизить риск, чтобы сделать ее более подходящей для различных рыночных условий и личных предпочтений в отношении риска.
Стратегия торговли сигналом тренда с нулевой задержкой в многократных временных рамках - это всеобъемлющая и гибкая количественная система торговли, обеспечивающая быстрое и точное определение тренда с помощью индекса с нулевой задержкой (ZLEMA) и технологий волатильности, а также защищающая финансовую безопасность в сочетании с многоуровневым динамическим механизмом управления рисками. Эта стратегия может как захватить входные возможности в начале тренда, так и максимизировать доходы в процессе развития тренда с помощью механизма повторного входа, предоставляя при этом несколько стратегий выхода, адаптированных к различным рыночным условиям.
Основные преимущества стратегии заключаются в уменьшении задержки сигналов, предоставлении полной системы управления рисками и гибких вариантов конфигурации торгов. Однако пользователям необходимо обращать внимание на потенциальные риски, такие как чувствительность к параметрам, ложные сигналы на рынке во время колебаний и чрезмерное соответствие.
Будучи количественной торговой системой, основанной на технических показателях, эта стратегия особенно подходит для торговли среднесрочными и долгосрочными тенденциями и применяется на различных финансовых рынках. Однако любая стратегия требует индивидуальной настройки в соответствии с индивидуальными торговыми целями, рисковой толерантностью и рыночными предпочтениями и применяется в практической торговле в сочетании со строгими принципами управления капиталом.
//@version=6
// Quant Trading Pro www.quanttradingpro.com
// #1 Strategy Optimizer on the chrome extension store Quant Trading Strategy Optimizer
strategy(title="Quant Trading Zero Lag Trend Signals (MTF) Strategy", shorttitle="QT0️⃣Zero Lag Signals Strategy", overlay=true,
commission_type=strategy.commission.percent,
commission_value=0.1,
slippage=3,
default_qty_type=strategy.percent_of_equity,
default_qty_value=100,
initial_capital=1000,
margin_long=0,
margin_short=0)
// === INPUT PARAMETERS ===
// 📌 1️⃣ Main Calculations
length = input.int(70, title="Length", minval=70, maxval=7000)
mult = input.float(1.2, "Band Multiplier", group="Main Calculations")
// === 📊 Trade Data Toggles ===
showFloatingTable = input.bool(true, "Show Floating Stats Table?", group="Trade Data")
showTradeLog = input.bool(false, "Show Trade Log Labels on Chart?", group="Trade Data")
enableCSVExport = input.bool(false, "Enable CSV Export", group="Trade Data")
// 📌 ZLEMA Trend Confirmation for Entries
useZlemaTrendConfirm = input.bool(false, "Use ZLEMA Trend Confirmation for entry?", group="Entry Conditions")
reEnterOnLongTrend = input.bool(false, "Re-Enter on Long Trend continuation", group="Entry Conditions")
// 📌 2️⃣ Short Trades
allowShortTrades = input.bool(false, "Allow Short Trades?", group="Short Trades")
// 📌 Performance Settings
useProfitTarget = input.bool(false, "Use Profit Target?", group="Performance Settings")
profitTargetRR = input.float(2.0, "Profit Target (Risk-Reward Ratio)", group="Performance Settings")
// 📌 4️⃣ Dynamic TP/SL (Each Setting with Its Parameters Directly Below)
useATRStopTP = input.bool(false, "Use ATR-Based Stop-Loss & Take-Profit?", group="Dynamic TP/SL")
atrLength = input.int(14, "ATR Length", group="Dynamic TP/SL")
atrMultiplier = input.float(1.5, "Stop-Loss ATR Multiplier", group="Dynamic TP/SL")
profitATRMultiplier = input.float(2.5, "Profit Target ATR Multiplier", group="Dynamic TP/SL")
useTrailingStop = input.bool(false, "Use ATR Trailing Stop?", group="Dynamic TP/SL")
trailStopMultiplier = input.float(1.5, "Trailing Stop ATR Multiplier", group="Dynamic TP/SL")
useBreakEven = input.bool(false, "Use Break-Even Stop-Loss?", group="Dynamic TP/SL")
breakEvenRR = input.float(1.5, "Move SL to Break-Even After RR", group="Dynamic TP/SL")
useTrendExit = input.bool(false, "Use Trend-Based Take Profit (EMA Exit)?", group="Dynamic TP/SL")
emaExitLength = input.int(9, "EMA Exit Length", group="Dynamic TP/SL")
// 📌 Debug Options
showZlemaDebug = input.bool(false, "Show ZLEMA Trend Debug?", group="Debug")
// ============================================================
// === 1️⃣ CALCULATIONS (Indicators, Trend, ATR, Stop/TP) ===
// ============================================================
src = close
lag = math.floor((length - 1) / 2)
zlema = ta.ema(src + (src - src[lag]), length)
volatility = ta.highest(ta.atr(length), length * 3) * mult
var trend = 0
if ta.crossover(close, zlema + volatility)
trend := 1
if ta.crossunder(close, zlema - volatility)
trend := -1
atrValue = ta.atr(atrLength)
emaExit = ta.ema(close, emaExitLength)
var float stopLossLongLevel = na
var float profitTargetLongLevel = na
var float stopLossShortLevel = na
var float profitTargetShortLevel = na
var int lastEntryBarIndex = na
var float lastEntryPrice = na
// ✅ Corrected ZLEMA DownTrend Logic: Ensure ZLEMA has decreased for 5 consecutive bars
// ✅ ZLEMA Increasing for 5 Bars → Bullish Trend (Green Triangle Up at the Bottom)
zlemaUpTrend = zlema > zlema[1] and zlema[1] > zlema[2] and zlema[2] > zlema[3] and zlema[3] > zlema[4]
// ✅ ZLEMA Decreasing for 5 Bars → Bearish Trend (Red Triangle Down at the Top)
zlemaDownTrend = zlema < zlema[1] and zlema[1] < zlema[2] and zlema[2] < zlema[3] and zlema[3] < zlema[4]
if ta.crossover(trend, 0) // Long Entry
stopLossLongLevel := useATRStopTP ? close - (atrValue * atrMultiplier) : zlema - volatility
profitTargetLongLevel := useProfitTarget ? (close + ((close - stopLossLongLevel) * profitTargetRR)) : na
if ta.crossunder(trend, 0) // Short Entry
stopLossShortLevel := useATRStopTP ? close + (atrValue * atrMultiplier) : zlema + volatility
profitTargetShortLevel := useProfitTarget ? (close - ((stopLossShortLevel - close) * profitTargetRR)) : na
// ATR-Based Stop-Loss Levels for Trade Exits
var float atrStopLossLong = na
var float atrStopLossShort = na
if useATRStopTP
if strategy.position_size > 0 // Long Position
atrStopLossLong := na(atrStopLossLong) or strategy.position_size[1] == 0 ? close - (atrValue * atrMultiplier) : math.max(nz(atrStopLossLong[1]), close - (atrValue * atrMultiplier)) // Prevents SL from decreasing
if strategy.position_size < 0 // Short Position
atrStopLossShort := na(atrStopLossShort) or strategy.position_size[1] == 0 ? close + (atrValue * atrMultiplier) : math.min(nz(atrStopLossShort[1]), close + (atrValue * atrMultiplier)) // Prevents SL from increasing
// ATR-Based Take-Profit Levels
var float atrTakeProfitLong = na
var float atrTakeProfitShort = na
if useATRStopTP
if strategy.position_size > 0 // Long Position
atrTakeProfitLong := strategy.position_avg_price + (atrValue * profitATRMultiplier) // Dynamic TP Based on ATR
if strategy.position_size < 0 // Short Position
atrTakeProfitShort := strategy.position_avg_price - (atrValue * profitATRMultiplier) // Dynamic TP Based on ATR
// ATR Trailing Stop Levels for Trade Exits and Visualization
var float trailStopLongLine = na
var float trailStopShortLine = na
if useTrailingStop
if strategy.position_size > 0 // Long Position
trailStopLongLine := na(trailStopLongLine) or strategy.position_size[1] == 0 ? close - (atrValue * trailStopMultiplier) :
math.max(nz(trailStopLongLine[1]), close - (atrValue * trailStopMultiplier))
if strategy.position_size < 0 // Short Position
trailStopShortLine := na(trailStopShortLine) or strategy.position_size[1] == 0 ? close + (atrValue * trailStopMultiplier) :
math.min(nz(trailStopShortLine[1]), close + (atrValue * trailStopMultiplier))
// ============================================================
// === 2️⃣ ENTRY & EXIT LOGIC (Conditions for Trading) ===
// ============================================================
// ✅ Entry Conditions for Long Trades
longCondition = ta.crossover(trend, 0) and close > zlema + volatility
canEnterLong = strategy.position_size == 0 or strategy.position_size[1] < 0 // Allows long entry right after short exit
if useZlemaTrendConfirm
longCondition := longCondition and zlemaUpTrend // Ensure ZLEMA Uptrend is true for long entries
// 🔥 Enforce that `longCondition` CANNOT be true if `zlemaUpTrend` is false
if useZlemaTrendConfirm and not zlemaUpTrend
longCondition := false
// ✅ Entry Conditions for Short Trades
shortCondition = allowShortTrades and ta.crossunder(trend, 0) and close < zlema - volatility
canEnterShort = strategy.position_size == 0 or strategy.position_size[1] > 0 // Allows short entry right after long exit
if useZlemaTrendConfirm
shortCondition := shortCondition and zlemaDownTrend // Ensure ZLEMA Downtrend is true for short entries
// ✅ Long Re-Entry Condition: ZLEMA is green, position is flat, price closed below and now above ZLEMA
reEntryLongCondition = reEnterOnLongTrend and
trend == 1 and
trend[1] == 1 and // ✅ Previous bar must also be in bullish trend (prevents triggering on trend change)
strategy.position_size == 0 and
close[1] < zlema[1] and
close > zlema
// ✅ Debugging: Display `longCondition` and `zlemaUpTrend` values only if the checkbox is checked
if showZlemaDebug and ta.crossover(trend, 0)
label.new(x=bar_index, y=low,
text="LongCondition: " + str.tostring(longCondition) +
"\nZLEMA UpTrend: " + str.tostring(zlemaUpTrend),
color=color.white, textcolor=color.black, size=size.small, style=label.style_label_down)
// ============================================================
// === 3️⃣ TRADE EXECUTIONS (Entries, ATR SL/TP, Trailing Stop, Trend Exit) ===
// ============================================================
// 📌 Entry Conditions
if (canEnterLong and longCondition) or reEntryLongCondition
lastEntryBarIndex := bar_index
lastEntryPrice := close
// 🛠️ Reset all SL/TP levels on Long Entry or Re-Entry
if reEntryLongCondition
// Trend-Based SL/TP
stopLossLongLevel := useATRStopTP ? na : zlema - volatility
profitTargetLongLevel := useProfitTarget and not useATRStopTP ? (close + ((close - stopLossLongLevel) * profitTargetRR)) : na
// ATR-Based SL/TP
atrStopLossLong := useATRStopTP ? close - (atrValue * atrMultiplier) : na
atrTakeProfitLong := useATRStopTP ? close + (atrValue * profitATRMultiplier) : na
// Trailing Stop
trailStopLongLine := useTrailingStop ? close - (atrValue * trailStopMultiplier) : na
strategy.entry(id="Long", direction=strategy.long, comment=reEntryLongCondition ? "Re-Entry Long" : "Bullish Trend Change")
if canEnterShort and shortCondition
lastEntryBarIndex := bar_index
lastEntryPrice := close
strategy.entry(id="Short", direction=strategy.short, comment="Bearish Trend Change")
// 📌 ATR-Based Stop-Loss Exits (Ensures SL Always Triggers Correctly)
if useATRStopTP and strategy.position_size > 0
if low <= atrStopLossLong
strategy.close("Long", comment="ATR SL Hit - Long")
if useATRStopTP and strategy.position_size < 0
if high >= atrStopLossShort
strategy.close("Short", comment="ATR SL Hit - Short")
// 📌 ATR-Based Stop-Loss & Take-Profit Exits (Ensures TP Always Executes)
if useATRStopTP and strategy.position_size > 0 and high >= atrTakeProfitLong
strategy.close("Long", comment="ATR TP Hit - Long")
if useATRStopTP and strategy.position_size < 0 and low <= atrTakeProfitShort
strategy.close("Short", comment="ATR TP Hit - Short")
// 📌 Profit Target Exits (Ensures TP Always Executes Independently)
if useProfitTarget and strategy.position_size > 0 and high >= profitTargetLongLevel
strategy.close("Long", comment="Profit Target Hit - Long")
if useProfitTarget and strategy.position_size < 0 and low <= profitTargetShortLevel
strategy.close("Short", comment="Profit Target Hit - Short")
// 📌 Stop-Loss for Profit Target Trades (Ensures Stop-Loss Works with TP)
if useProfitTarget and strategy.position_size > 0 and low <= stopLossLongLevel
strategy.close("Long", comment="Stop-Loss Hit - Long")
if useProfitTarget and strategy.position_size < 0 and high >= stopLossShortLevel
strategy.close("Short", comment="Stop-Loss Hit - Short")
// 📌 ATR Trailing Stop Loss (Ensures It Works Alongside Other Exits)
if useTrailingStop and strategy.position_size > 0 and low <= trailStopLongLine
strategy.close("Long", comment="Trailing Stop Hit - Long")
if useTrailingStop and strategy.position_size < 0 and high >= trailStopShortLine
strategy.close("Short", comment="Trailing Stop Hit - Short")
// 📌 Trend-Based Exit (Closes Position When Trend Reverses)
if strategy.position_size > 0 and ta.crossunder(trend, 0)
strategy.close("Long", comment="Trend Change to Bearish")
if strategy.position_size < 0 and ta.crossover(trend, 0)
strategy.close("Short", comment="Trend Change to Bullish")
// 📌 Break-Even Stop-Loss (Adjusts Stop to Entry Price at Set Risk-Reward Ratio)
if useBreakEven and strategy.position_size > 0 and high >= strategy.position_avg_price + (strategy.position_avg_price - atrStopLossLong) * breakEvenRR
atrStopLossLong := strategy.position_avg_price
if useBreakEven and strategy.position_size < 0 and low <= strategy.position_avg_price - (atrStopLossShort - strategy.position_avg_price) * breakEvenRR
atrStopLossShort := strategy.position_avg_price
// 📌 EMA Exit (Closes Position if Price Crosses EMA)
if useTrendExit and strategy.position_size > 0 and low < emaExit
strategy.close("Long", comment="Exit on EMA")
if useTrendExit and strategy.position_size < 0 and high > emaExit
strategy.close("Short", comment="Exit on EMA")
// ============================================================
// === 4️⃣ VISUALIZATIONS (Trend Shading, Stop-Loss, TP, ATR TS) ===
// ============================================================
// 🟢🔴 Restore Bullish/Bearish Trend Shading
zlemaColor = trend == 1 ? color.new(#00ffbb, 70) : color.new(#ff1100, 70)
m = plot(series=zlema, title="Zero Lag Basis", linewidth=2, color=zlemaColor)
upper = plot(zlema + volatility, style=plot.style_linebr, color=color.new(#ff1100, 90), title="Upper Deviation Band")
lower = plot(zlema - volatility, style=plot.style_linebr, color=color.new(#00ffbb, 90), title="Lower Deviation Band")
fill(plot1=m, plot2=upper, color=(trend == -1 ? color.new(#ff1100, 80) : na), title="Bearish Fill")
fill(plot1=m, plot2=lower, color=(trend == 1 ? color.new(#00ffbb, 80) : na), title="Bullish Fill")
// ✅ Plot a lime green TriangleUp at the bottom when ZLEMA has been going UP for 5 bars
plotshape(series=zlemaUpTrend ? low - ta.atr(5) * 0.5 : na,
location=location.bottom, style=shape.triangleup,
color=color.lime, title="ZLEMA Uptrend Detected")
// ✅ Plot a red TriangleDown at the top when ZLEMA has been going DOWN for 5 bars
plotshape(series=zlemaDownTrend ? high + ta.atr(5) * 0.5 : na,
location=location.top, style=shape.triangledown,
color=color.red, title="ZLEMA Downtrend Detected")
// 🔴 Default Stop-Loss Lines (Red) - Only Show If ATR SL/TP Is Not Used
plot(series=(not useATRStopTP and strategy.position_size > 0) ? stopLossLongLevel : na,
style=plot.style_linebr, color=color.red, linewidth=2, title="Trend Stop-Loss - Long")
plot(series=(not useATRStopTP and strategy.position_size < 0) ? stopLossShortLevel : na,
style=plot.style_linebr, color=color.red, linewidth=2, title="Trend Stop-Loss - Short")
// 🟠 ATR Trailing Stop Loss Line (Thin Orange Line) - Only Draw When Checkbox is Checked
plot(series=(useTrailingStop and strategy.position_size > 0) ? trailStopLongLine : na,
style=plot.style_linebr, color=color.new(color.orange, 70), linewidth=1, title="ATR Trailing Stop - Long")
plot(series=(useTrailingStop and strategy.position_size < 0) ? trailStopShortLine : na,
style=plot.style_linebr, color=color.new(color.orange, 70), linewidth=1, title="ATR Trailing Stop - Short")
// ✅ ATR-Based Stop-Loss Visualization (Ensures Line Stays Until Trade Closes)
plot(series=(useATRStopTP and strategy.position_size > 0) ? atrStopLossLong : na,
style=plot.style_linebr, color=color.new(color.red, 50), linewidth=2, title="ATR-Based Stop-Loss - Long")
plot(series=(useATRStopTP and strategy.position_size < 0) ? atrStopLossShort : na,
style=plot.style_linebr, color=color.new(color.red, 50), linewidth=2, title="ATR-Based Stop-Loss - Short")
// ✅ ATR-Based Take-Profit Visualization (Ensures Line Stays Until Trade Closes)
plot(series=(useATRStopTP and strategy.position_size > 0) ? atrTakeProfitLong : na,
style=plot.style_linebr, color=color.new(color.green, 50), linewidth=2, title="ATR-Based Take-Profit - Long")
plot(series=(useATRStopTP and strategy.position_size < 0) ? atrTakeProfitShort : na,
style=plot.style_linebr, color=color.new(color.green, 50), linewidth=2, title="ATR-Based Take-Profit - Short")
// ✅ Standard Profit Target Visualization (Only Active if ATR SL/TP is NOT Used)
plot(series=(useProfitTarget and not useATRStopTP and strategy.position_size > 0) ? profitTargetLongLevel : na,
style=plot.style_linebr, color=color.green, linewidth=2, title="Profit Target - Long")
plot(series=(useProfitTarget and not useATRStopTP and strategy.position_size < 0) ? profitTargetShortLevel : na,
style=plot.style_linebr, color=color.green, linewidth=2, title="Profit Target - Short")
// === 📋 FLOATING TABLE: STRATEGY PERFORMANCE & SETTINGS ===
// === Track first and last trade times ===
var int firstTradeTime = na
var int lastTradeTime = na
if strategy.opentrades > 0 and na(firstTradeTime)
firstTradeTime := time
if strategy.closedtrades > 0
lastTradeTime := time
// === Format trade date strings safely ===
firstDateStr = "N/A"
lastDateStr = "N/A"
if not na(firstTradeTime)
firstDateStr := str.tostring(month(firstTradeTime)) + "/" + str.tostring(dayofmonth(firstTradeTime)) + "/" + str.tostring(year(firstTradeTime) % 100)
if not na(lastTradeTime)
lastDateStr := str.tostring(month(lastTradeTime)) + "/" + str.tostring(dayofmonth(lastTradeTime)) + "/" + str.tostring(year(lastTradeTime) % 100)