box.Child = host;
Grid.SetRow(box, row); Grid.SetColumn(box, col); Grid.SetRowSpan(box, rowSpan);
parent.Children.Add(box);
}
private void SafeRefreshUi()
{
try
{
if (State == State.Terminated) return;
if (ChartControl == null || root == null || panel == null || mainGrid == null) return;
RefreshUi();
}
catch (Exception ex)
{
try
{
if (statusTxt != null)
{
statusTxt.Text = "UI ERROR";
statusTxt.Foreground = Brushes.Red;
}
if (wallRows != null)
{
wallRows.Children.Clear();
AddLine(wallRows, "Runtime UI error caught safely.", Brushes.Red, 12, true);
AddLine(wallRows, ex.Message, Brushes.White, 10, false);
}
}
catch { }
}
}
private void RefreshUi()
{
if (domRows == null) return;
// keep user-stretched height; do not force reset during timer refresh
List<KeyValuePair<double, long>> bidList, askList;
List<TapeRow> tapeCopy;
Dictionary<double, int> tpoCopy;
lock (sync)
{
double centerRef = lastPrice > 0 ? RoundToTick(lastPrice) : 0;
if (centerRef > 0)
{
// Critical DOM safety: bids must stay below market, asks must stay above market.
bidList = bids.Where(x => x.Key < centerRef).OrderByDescending(x => x.Key).Take(Math.Max(maxDepthRows, DomRowsVisible)).ToList();
askList = asks.Where(x => x.Key > centerRef).OrderBy(x => x.Key).Take(Math.Max(maxDepthRows, DomRowsVisible)).ToList();
}
else
{
bidList = bids.Reverse().Take(Math.Max(maxDepthRows, DomRowsVisible)).ToList();
askList = asks.Take(Math.Max(maxDepthRows, DomRowsVisible)).ToList();
}
tapeCopy = tape.Take(16).ToList();
tpoCopy = new Dictionary<double, int>(tpo);
}
long bidTotal = bidList.Sum(x => x.Value);
long askTotal = askList.Sum(x => x.Value);
if (bidTxt != null) bidTxt.Text = "BID\n" + bidTotal.ToString("N0");
if (askTxt != null) askTxt.Text = "ASK\n" + askTotal.ToString("N0");
if (lastTxt != null) lastTxt.Text = "LAST\n" + (lastPrice > 0 ? lastPrice.ToString("0.00") : "--");
if (deltaTxt != null)
{
deltaTxt.Text = "DELTA\n" + cumDelta.ToString("N0");
deltaTxt.Foreground = cumDelta >= 0 ? Brushes.Lime : Brushes.Red;
}
if (statusTxt != null)
{
statusTxt.Text = "LIVE";
statusTxt.Foreground = Brushes.Lime;
}
if (domRows != null) RenderDom(bidList, askList);
if (wallRows != null) RenderWallsAndStacking(bidList, askList);
if (tapeRows != null) RenderTape(tapeCopy);
if (tpoTxt != null) RenderTpo(tpoCopy);
if (mostTpoRows != null) RenderMostTpoArea(tpoCopy);
if (gaugeText != null) RenderBidAskGauge(bidTotal, askTotal);
}
private void RenderDom(List<KeyValuePair<double, long>> bidList, List<KeyValuePair<double, long>> askList)
{
if (domRows == null) return;
double center = lastPrice > 0 ? RoundToTick(lastPrice) : 0;
if (center <= 0)
{
if (!domRowsBuilt)
{
domRows.Children.Clear();
domRows.Children.Add(MakeText("Waiting for live Level II depth...", 12, Brushes.Yellow, FontWeights.Bold, 0, 0));
}
return;
}
int halfRows = Math.Max(10, DomRowsVisible / 2);
int neededRows = halfRows * 2 + 1;
// Build visual controls once. Do not clear/recreate every timer tick.
if (!domRowsBuilt || domRowsBuiltCount != neededRows)
BuildDomVisualRows(neededRows);
long max = Math.Max(1, Math.Max(bidList.Count > 0 ? bidList.Max(x => x.Value) : 1, askList.Count > 0 ? askList.Max(x => x.Value) : 1));
Dictionary<double, long> bidMap = bidList.GroupBy(x => RoundToTick(x.Key)).ToDictionary(g => g.Key, g => g.Last().Value);
Dictionary<double, long> askMap = askList.GroupBy(x => RoundToTick(x.Key)).ToDictionary(g => g.Key, g => g.Last().Value);
int rowIndex = 0;
for (int i = halfRows; i >= -halfRows && rowIndex < domVisualRows.Count; i--, rowIndex++)
{
double price = RoundToTick(center + i * tickSizeLocal);
long bv = 0;
long av = 0;
// Hard location lock: never show bid size above/at market and never show ask size below/at market.
if (price < center)
bidMap.TryGetValue(price, out bv);
if (price > center)
askMap.TryGetValue(price, out av);
DomVisualRow row = domVisualRows[rowIndex];
row.PriceText.Text = price.ToString("0.00");
row.BidText.Text = bv > 0 ? bv.ToString("N0") : "";
row.AskText.Text = av > 0 ? av.ToString("N0") : "";
long d = bv - av;
row.DeltaText.Text = d == 0 ? "" : d.ToString("+0;-0");
row.DeltaText.Foreground = d >= 0 ? Brushes.Lime : Brushes.Red;
row.RowGrid.Background = Math.Abs(price - center) < tickSizeLocal / 2.0
? new SolidColorBrush(Color.FromArgb(90, 230, 170, 0))
: Brushes.Transparent;
UpdateDepthBar(row.BidBar, bv, max, true);
UpdateDepthBar(row.AskBar, av, max, false);
}
}
private void BuildDomVisualRows(int visualRowCount)
{
domRows.Children.Clear();
domVisualRows.Clear();
Grid header = new Grid();
for (int i = 0; i < 4; i++) header.ColumnDefinitions.Add(new ColumnDefinition());
header.Children.Add(MakeText("BID", 11, Brushes.Lime, FontWeights.Bold, 0, 0));
header.Children.Add(MakeText("PRICE", 11, Brushes.White, FontWeights.Bold, 0, 1));
header.Children.Add(MakeText("ASK", 11, Brushes.Red, FontWeights.Bold, 0, 2));
header.Children.Add(MakeText("Δ", 11, Brushes.White, FontWeights.Bold, 0, 3));
domRows.Children.Add(header);
for (int i = 0; i < visualRowCount; i++)
{
Grid r = new Grid { Height = 15, Background = Brushes.Transparent };
for (int c = 0; c < 4; c++) r.ColumnDefinitions.Add(new ColumnDefinition());
DomVisualRow row = new DomVisualRow();
row.RowGrid = r;
row.BidText = new TextBlock { Foreground = Brushes.Lime, FontSize = 11, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
row.PriceText = new TextBlock { Foreground = Brushes.White, FontSize = 11, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
row.AskText = new TextBlock { Foreground = Brushes.Red, FontSize = 11, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
row.DeltaText = new TextBlock { Foreground = Brushes.White, FontSize = 11, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
row.BidBar = new Border { HorizontalAlignment = HorizontalAlignment.Right, Background = new SolidColorBrush(Color.FromArgb(90, 0, 220, 70)), Width = 0 };
row.AskBar = new Border { HorizontalAlignment = HorizontalAlignment.Left, Background = new SolidColorBrush(Color.FromArgb(100, 230, 0, 20)), Width = 0 };
AddDomCell(r, row.BidBar, row.BidText, 0);
AddDomCell(r, null, row.PriceText, 1);
AddDomCell(r, row.AskBar, row.AskText, 2);
AddDomCell(r, null, row.DeltaText, 3);
domRows.Children.Add(r);
domVisualRows.Add(row);
}
domRowsBuilt = true;
domRowsBuiltCount = visualRowCount;
}
private void AddDomCell(Grid rowGrid, Border bar, TextBlock text, int col)
{
Grid cell = new Grid();
if (bar != null) cell.Children.Add(bar);
cell.Children.Add(text);
Grid.SetColumn(cell, col);
rowGrid.Children.Add(cell);
}
private void UpdateDepthBar(Border bar, long val, long max, bool bidSide)
{
if (bar == null) return;
if (val <= 0)
{
bar.Width = 0;
return;
}
bar.Width = Math.Max(4, 48.0 * val / Math.Max(1, max));
bar.HorizontalAlignment = bidSide ? HorizontalAlignment.Right : HorizontalAlignment.Left;
}
private void AddCell(Grid r, string txt, Brush fg, int col, long val, long max, bool bidSide)
{
Grid cell = new Grid();
if (val > 0)
{
Border bar = new Border
{
Width = Math.Max(4, 48.0 * val / max),
HorizontalAlignment = bidSide ? HorizontalAlignment.Right : HorizontalAlignment.Left,
Background = bidSide ? new SolidColorBrush(Color.FromArgb(90, 0, 220, 70)) : new SolidColorBrush(Color.FromArgb(100, 230, 0, 20))
};
cell.Children.Add(bar);
}
TextBlock t = new TextBlock { Text = txt, Foreground = fg, FontSize = 11, FontWeight = FontWeights.Bold, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
cell.Children.Add(t);
Grid.SetColumn(cell, col); r.Children.Add(cell);
}
private void RenderWallsAndStacking(List<KeyValuePair<double, long>> bidList, List<KeyValuePair<double, long>> askList)
{
if (wallRows == null) return;
wallRows.Children.Clear();
if (bidList.Count == 0 && askList.Count == 0)
{
AddLine(wallRows, "Waiting for live Level II depth...", Brushes.Yellow, 12, true);
AddLine(wallRows, "Use live data or Playback with market depth recorded.", Brushes.White, 11, false);
return;
}
var topBids = bidList.OrderByDescending(x => x.Value).Take(4).ToList();
var topAsks = askList.OrderByDescending(x => x.Value).Take(4).ToList();
AddLine(wallRows, "BID WALLS", Brushes.Lime, 12, true);
foreach (var b in topBids)
AddLine(wallRows, b.Key.ToString("0.00") + " " + b.Value.ToString("N0") + " contracts", Brushes.White, 11, true);
AddLine(wallRows, "", Brushes.White, 4, false);
AddLine(wallRows, "ASK WALLS", Brushes.Red, 12, true);
foreach (var a in topAsks)
AddLine(wallRows, a.Key.ToString("0.00") + " " + a.Value.ToString("N0") + " contracts", Brushes.White, 11, true);
int bidStack = 0, askStack = 0;
List<string> bidStackPrices = new List<string>();
List<string> askStackPrices = new List<string>();
foreach (var b in bidList.Take(25))
{
long old;
prevBids.TryGetValue(b.Key, out old);
if (old > 0 && b.Value > old) { bidStack++; if (bidStackPrices.Count < 5) bidStackPrices.Add(b.Key.ToString("0.00")); }
prevBids[b.Key] = b.Value;
}
foreach (var a in askList.Take(25))
{
long old;
prevAsks.TryGetValue(a.Key, out old);
if (old > 0 && a.Value > old) { askStack++; if (askStackPrices.Count < 5) askStackPrices.Add(a.Key.ToString("0.00")); }
prevAsks[a.Key] = a.Value;
}
AddLine(wallRows, "", Brushes.White, 4, false);
AddLine(wallRows, "BID STACKING: " + bidStack + " levels", Brushes.Lime, 12, true);
if (bidStackPrices.Count > 0) AddLine(wallRows, string.Join(" ", bidStackPrices), Brushes.Lime, 11, false);
AddLine(wallRows, "ASK STACKING: " + askStack + " levels", Brushes.Red, 12, true);
if (askStackPrices.Count > 0) AddLine(wallRows, string.Join(" ", askStackPrices), Brushes.Red, 11, false);
AddLine(wallRows, "", Brushes.White, 4, false);
AddLine(wallRows, "CUM DELTA: " + cumDelta.ToString("N0"), cumDelta >= 0 ? Brushes.Lime : Brushes.Red, 12, true);
AddLine(wallRows, "LAST TRADE VOL: " + lastTradeVol.ToString("N0"), Brushes.White, 11, false);
}
private void RenderBidAskGauge(long bidTotal, long askTotal)
{
if (gaugeText == null || gaugeBidFill == null || gaugeAskFill == null) return;
double total = Math.Max(1.0, bidTotal + askTotal);
double bidPct = bidTotal / total;
double askPct = askTotal / total;
double half = 150;
try
{
if (gaugeBar != null && !double.IsNaN(gaugeBar.ActualWidth) && gaugeBar.ActualWidth > 80)
half = Math.Max(40, gaugeBar.ActualWidth / 2.0);
}
catch { }
gaugeBidFill.Width = Math.Max(2, half * bidPct);
gaugeAskFill.Width = Math.Max(2, half * askPct);
gaugeText.Text = "BID " + (bidPct * 100.0).ToString("0") + "% | ASK " + (askPct * 100.0).ToString("0") + "%";
gaugeText.Foreground = bidPct >= askPct ? Brushes.White : Brushes.White;
}
private void RenderMostTpoArea(Dictionary<double, int> map)
{
if (mostTpoRows == null) return;
mostTpoRows.Children.Clear();
if (map == null || map.Count == 0)
{
AddLine(mostTpoRows, "Waiting for TPO data...", Brushes.Yellow, 12, true);
return;
}
var top = map.OrderByDescending(x => x.Value).Take(12).ToList();
int max = Math.Max(1, top.Max(x => x.Value));
double poc = top[0].Key;
AddLine(mostTpoRows, "POC / MOST ACCEPTED: " + poc.ToString("0.00") + " " + top[0].Value + " TPO", Brushes.Yellow, 12, true);
AddLine(mostTpoRows, "", Brushes.White, 3, false);
foreach (var x in top)
{
Grid r = new Grid { Height = 18 };
r.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(76) });
r.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(1, GridUnitType.Star) });
AddGridText(r, x.Key.ToString("0.00"), x.Key == poc ? Brushes.Yellow : Brushes.Cyan, 0, 11, true);
Grid barHost = new Grid();
Border bar = new Border
{
Width = Math.Max(8, 190.0 * x.Value / max),
HorizontalAlignment = HorizontalAlignment.Left,
Background = x.Key == poc ? new SolidColorBrush(Color.FromArgb(170, 240, 190, 0)) : new SolidColorBrush(Color.FromArgb(150, 0, 170, 220)),
CornerRadius = new CornerRadius(2)
};
barHost.Children.Add(bar);
TextBlock t = new TextBlock { Text = x.Value.ToString(), Foreground = Brushes.White, FontSize = 10, FontWeight = FontWeights.Bold, Margin = new Thickness(4, 0, 0, 0), VerticalAlignment = VerticalAlignment.Center };
barHost.Children.Add(t);
Grid.SetColumn(barHost, 1); r.Children.Add(barHost);
mostTpoRows.Children.Add(r);
}
}
private void RenderTape(List<TapeRow> rows)
{
if (tapeRows == null) return;
tapeRows.Children.Clear();
if (rows.Count == 0)
{
AddLine(tapeRows, "Waiting for live tape...", Brushes.Yellow, 12, true);
return;
}
Grid header = new Grid { Height = 18 };
header.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(70) });
header.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80) });
header.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(55) });
header.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(55) });
AddGridText(header, "TIME", Brushes.White, 0, 11, true);
AddGridText(header, "PRICE", Brushes.White, 1, 11, true);
AddGridText(header, "SIDE", Brushes.White, 2, 11, true);
AddGridText(header, "SIZE", Brushes.White, 3, 11, true);
tapeRows.Children.Add(header);
foreach (var x in rows.Take(22))
{
Brush sideBrush = x.Side == "BUY" ? Brushes.Lime : (x.Side == "SELL" ? Brushes.Red : Brushes.White);
Grid r = new Grid { Height = 18 };
r.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(70) });
r.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(80) });
r.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(55) });
r.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(55) });
if (x.Side == "BUY") r.Background = new SolidColorBrush(Color.FromArgb(32, 0, 180, 50));
else if (x.Side == "SELL") r.Background = new SolidColorBrush(Color.FromArgb(36, 200, 0, 0));
AddGridText(r, x.Time.ToString("HH:mm:ss"), sideBrush, 0, 11, false);
AddGridText(r, x.Price.ToString("0.00"), sideBrush, 1, 11, true);
AddGridText(r, x.Side, sideBrush, 2, 11, true);
AddGridText(r, x.Volume.ToString("N0"), sideBrush, 3, 11, true);
tapeRows.Children.Add(r);
}
}
private void RenderTpo(Dictionary<double, int> map)
{
if (tpoTxt == null) return;
if (map == null || map.Count == 0) { tpoTxt.Text = "Waiting for bars..."; return; }
tpoTxt.FontSize = TpoFontSize;
int rows = TpoMaxRows <= 0 ? map.Count : Math.Max(10, TpoMaxRows);
int letters = TpoMaxLetters <= 0 ? 5000 : Math.Max(1, TpoMaxLetters);
var ordered = map.OrderByDescending(x => x.Key).Take(rows);
var lines = ordered.Select(x => x.Key.ToString("0.00") + " " + new string('A', Math.Max(1, Math.Min(letters, x.Value))));
tpoTxt.Text = string.Join("\n", lines);
if (tpoTxt.Parent is StackPanel sp && sp.Parent is ScrollViewer sv)
{
sv.HorizontalScrollBarVisibility = ScrollBarVisibility.Auto;
sv.VerticalScrollBarVisibility = ScrollBarVisibility.Auto;
}
}
private void AddLine(StackPanel parent, string text, Brush color, double fontSize, bool bold)
{
parent.Children.Add(new TextBlock
{
Text = text,
Foreground = color,
FontSize = fontSize,
FontWeight = bold ? FontWeights.Bold : FontWeights.Normal,
FontFamily = new FontFamily("Consolas"),
TextWrapping = TextWrapping.Wrap
});
}
private void AddGridText(Grid g, string text, Brush color, int col, double fontSize, bool bold)
{
TextBlock t = new TextBlock
{
Text = text,
Foreground = color,
FontSize = fontSize,
FontWeight = bold ? FontWeights.Bold : FontWeights.Normal,
FontFamily = new FontFamily("Consolas"),
VerticalAlignment = VerticalAlignment.Center,
TextAlignment = TextAlignment.Center
};
Grid.SetColumn(t, col);
g.Children.Add(t);
}
private double GetPanelHeight()
{
try
{
double h = ChartControl != null ? ChartControl.ActualHeight - 34 : 720;
if (double.IsNaN(h) || h < 620) h = 720;
return h;
}
catch { return 720; }
}
private void AddBox(StackPanel parent, string title, out StackPanel content, double height)
{
Border box = MakeBox(height);
StackPanel sp = new StackPanel();
sp.Children.Add(new TextBlock { Text = title, Foreground = Brushes.White, FontWeight = FontWeights.Bold, FontSize = 12, Margin = new Thickness(0, 0, 0, 6) });
content = new StackPanel();
sp.Children.Add(content);
box.Child = sp;
parent.Children.Add(box);
}
private void AddTextBox(StackPanel parent, string title, out TextBlock text, double height)
{
Border box = MakeBox(height);
StackPanel sp = new StackPanel();
sp.Children.Add(new TextBlock { Text = title, Foreground = Brushes.White, FontWeight = FontWeights.Bold, FontSize = 12, Margin = new Thickness(0, 0, 0, 6) });
text = new TextBlock { Foreground = Brushes.Cyan, FontSize = 11, FontFamily = new FontFamily("Consolas"), TextWrapping = TextWrapping.Wrap };
sp.Children.Add(text);
box.Child = sp;
parent.Children.Add(box);
}
private Border MakeBox(double height)
{
return new Border
{
Height = height,
Margin = new Thickness(0, 0, 8, 8),
Padding = new Thickness(8),
Background = new SolidColorBrush(Color.FromArgb(160, 5, 14, 24)),
BorderBrush = new SolidColorBrush(Color.FromRgb(35, 70, 95)),
BorderThickness = new Thickness(1),
CornerRadius = new CornerRadius(4)
};
}
private TextBlock MakeText(string text, double size, Brush fg, FontWeight fw, int row, int col)
{
TextBlock t = new TextBlock { Text = text, Foreground = fg, FontSize = size, FontWeight = fw, TextAlignment = TextAlignment.Center, VerticalAlignment = VerticalAlignment.Center };
Grid.SetRow(t, row); Grid.SetColumn(t, col); return t;
}
private double GetBestBid() { lock (sync) return bids.Count > 0 ? bids.Keys.Max() : 0; }
private double GetBestAsk() { lock (sync) return asks.Count > 0 ? asks.Keys.Min() : 0; }
private double RoundToTick(double p) { return tickSizeLocal <= 0 ? p : Math.Round(p / tickSizeLocal) * tickSizeLocal; }
private void RemoveUi()
{
if (uiTimer != null) { uiTimer.Stop(); uiTimer = null; }
if (root != null && chartGrid != null && chartGrid.Children.Contains(root)) chartGrid.Children.Remove(root);
root = null; panel = null; collapsedTab = null; mainGrid = null; chartGrid = null;
}
private Grid FindParentGrid(DependencyObject start)
{
DependencyObject current = start ?? ChartControl;
while (current != null)
{
Grid g = current as Grid;
if (g != null) return g;
try { current = VisualTreeHelper.GetParent(current); }
catch { break; }
}
try
{
return ChartControl != null ? VisualTreeHelper.GetParent(ChartControl) as Grid : null;
}
catch { return null; }
}
private class DomVisualRow
{
public Grid RowGrid;
public TextBlock BidText;
public TextBlock PriceText;
public TextBlock AskText;
public TextBlock DeltaText;
public Border BidBar;
public Border AskBar;
}
private class TapeRow
{
public DateTime Time;
public double Price;
public long Volume;
public string Side;
public double Delta;
}
}
}
#region NinjaScript generated code. Neither change nor remove.
namespace NinjaTrader.NinjaScript.Indicators
{
public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
{
private WT_MarketDepthDOMPanel cacheWT_MarketDepthDOMPanel;
public WT_MarketDepthDOMPanel WT_MarketDepthDOMPanel()
{
return WT_MarketDepthDOMPanel(Input);
}
public WT_MarketDepthDOMPanel WT_MarketDepthDOMPanel(ISeries<double> input)
{
if (cacheWT_MarketDepthDOMPanel != null)
for (int idx = 0; idx < cacheWT_MarketDepthDOMPanel.Length; idx++)
if (cacheWT_MarketDepthDOMPanel[idx] != null && cacheWT_MarketDepthDOMPanel[idx].EqualsInput(input))
return cacheWT_MarketDepthDOMPanel[idx];
return CacheIndicator<WT_MarketDepthDOMPanel>(new WT_MarketDepthDOMPanel(), input, ref cacheWT_MarketDepthDOMPanel);
}
}
}
namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
{
public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
{
public Indicators.WT_MarketDepthDOMPanel WT_MarketDepthDOMPanel()
{
return indicator.WT_MarketDepthDOMPanel(Input);
}
public Indicators.WT_MarketDepthDOMPanel WT_MarketDepthDOMPanel(ISeries<double> input)
{
return indicator.WT_MarketDepthDOMPanel(input);
}
}
}
namespace NinjaTrader.NinjaScript.Strategies
{
public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
{
public Indicators.WT_MarketDepthDOMPanel WT_MarketDepthDOMPanel()
{
return indicator.WT_MarketDepthDOMPanel(Input);
}
public Indicators.WT_MarketDepthDOMPanel WT_MarketDepthDOMPanel(ISeries<double> input)
{
return indicator.WT_MarketDepthDOMPanel(input);
}
}
}
#endregion