Advertisement
Guest User

zigzag ninjatrader

a guest
Aug 3rd, 2024
265
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 17.58 KB | None | 0 0
  1. //
  2. // Copyright (C) 2022, NinjaTrader LLC <www.ninjatrader.com>.
  3. // NinjaTrader reserves the right to modify or overwrite this NinjaScript component with each release.
  4. //
  5. #region Using declarations
  6. using System;
  7. using System.Collections.Generic;
  8. using System.ComponentModel;
  9. using System.ComponentModel.DataAnnotations;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Windows;
  14. using System.Windows.Input;
  15. using System.Windows.Media;
  16. using System.Xml.Serialization;
  17. using NinjaTrader.Cbi;
  18. using NinjaTrader.Gui;
  19. using NinjaTrader.Gui.Chart;
  20. using NinjaTrader.Gui.SuperDom;
  21. using NinjaTrader.Data;
  22. using NinjaTrader.NinjaScript;
  23. using NinjaTrader.Core.FloatingPoint;
  24. using NinjaTrader.NinjaScript.DrawingTools;
  25. #endregion
  26.  
  27. //This namespace holds indicators in this folder and is required. Do not change it.
  28. namespace NinjaTrader.NinjaScript.Indicators
  29. {
  30.     /// <summary>
  31.     /// The ZigZag indicator shows trend lines filtering out changes below a defined level.
  32.     /// </summary>
  33.     public class ZigZag : Indicator
  34.     {
  35.         private Series<double>      zigZagHighZigZags;
  36.         private Series<double>      zigZagLowZigZags;
  37.         private Series<double>      zigZagHighSeries;
  38.         private Series<double>      zigZagLowSeries;
  39.  
  40.         private double              currentZigZagHigh;
  41.         private double              currentZigZagLow;
  42.         private int                 lastSwingIdx;
  43.         private double              lastSwingPrice;
  44.         private int                 startIndex;
  45.         private int                 trendDir;
  46.        
  47.         protected override void OnStateChange()
  48.         {
  49.             if (State == State.SetDefaults)
  50.             {
  51.                 Description                 = NinjaTrader.Custom.Resource.NinjaScriptIndicatorDescriptionZigZag;
  52.                 Name                        = NinjaTrader.Custom.Resource.NinjaScriptIndicatorNameZigZag;
  53.                 DeviationType               = DeviationType.Points;
  54.                 DeviationValue              = 0.5;
  55.                 DisplayInDataBox            = false;
  56.                 DrawOnPricePanel            = false;
  57.                 IsSuspendedWhileInactive    = true;
  58.                 IsOverlay                   = true;
  59.                 PaintPriceMarkers           = false;
  60.                 UseHighLow                  = false;
  61.  
  62.                 AddPlot(Brushes.DodgerBlue, NinjaTrader.Custom.Resource.NinjaScriptIndicatorNameZigZag);
  63.  
  64.                 DisplayInDataBox            = false;
  65.                 PaintPriceMarkers           = false;
  66.             }
  67.             else if (State == State.Configure)
  68.             {
  69.                 currentZigZagHigh   = 0;
  70.                 currentZigZagLow    = 0;
  71.                 lastSwingIdx        = -1;
  72.                 lastSwingPrice      = 0.0;
  73.                 trendDir            = 0; // 1 = trend up, -1 = trend down, init = 0
  74.                 startIndex          = int.MinValue;
  75.             }
  76.             else if (State == State.DataLoaded)
  77.             {
  78.                 zigZagHighZigZags   = new Series<double>(this, MaximumBarsLookBack.Infinite);
  79.                 zigZagLowZigZags    = new Series<double>(this, MaximumBarsLookBack.Infinite);
  80.                 zigZagHighSeries    = new Series<double>(this, MaximumBarsLookBack.Infinite);
  81.                 zigZagLowSeries     = new Series<double>(this, MaximumBarsLookBack.Infinite);
  82.             }
  83.         }
  84.  
  85.         // Returns the number of bars ago a zig zag low occurred. Returns a value of -1 if a zig zag low is not found within the look back period.
  86.         public int LowBar(int barsAgo, int instance, int lookBackPeriod)
  87.         {
  88.             if (instance < 1)
  89.                 throw new Exception(string.Format(NinjaTrader.Custom.Resource.ZigZagLowBarInstanceGreaterEqual, GetType().Name, instance));
  90.             if (barsAgo < 0)
  91.                 throw new Exception(string.Format(NinjaTrader.Custom.Resource.ZigZigLowBarBarsAgoGreaterEqual, GetType().Name, barsAgo));
  92.             if (barsAgo >= Count)
  93.                 throw new Exception(string.Format(NinjaTrader.Custom.Resource.ZigZagLowBarBarsAgoOutOfRange, GetType().Name, (Count - 1), barsAgo));
  94.  
  95.             Update();
  96.             for (int idx = CurrentBar - barsAgo - 1; idx >= CurrentBar - barsAgo - 1 - lookBackPeriod; idx--)
  97.             {
  98.                 if (idx < 0)
  99.                     return -1;
  100.                 if (idx >= zigZagLowZigZags.Count)
  101.                     continue;
  102.  
  103.                 if (!zigZagLowZigZags.IsValidDataPointAt(idx))
  104.                     continue;
  105.  
  106.                 if (instance == 1) // 1-based, < to be save
  107.                     return CurrentBar - idx;
  108.  
  109.                 instance--;
  110.             }
  111.  
  112.             return -1;
  113.         }
  114.  
  115.         // Returns the number of bars ago a zig zag high occurred. Returns a value of -1 if a zig zag high is not found within the look back period.
  116.         public int HighBar(int barsAgo, int instance, int lookBackPeriod)
  117.         {
  118.             if (instance < 1)
  119.                 throw new Exception(string.Format(NinjaTrader.Custom.Resource.ZigZagHighBarInstanceGreaterEqual, GetType().Name, instance));
  120.             if (barsAgo < 0)
  121.                 throw new Exception(string.Format(NinjaTrader.Custom.Resource.ZigZigHighBarBarsAgoGreaterEqual, GetType().Name, barsAgo));
  122.             if (barsAgo >= Count)
  123.                 throw new Exception(string.Format(NinjaTrader.Custom.Resource.ZigZagHighBarBarsAgoOutOfRange, GetType().Name, (Count - 1), barsAgo));
  124.  
  125.             Update();
  126.             for (int idx = CurrentBar - barsAgo - 1; idx >= CurrentBar - barsAgo - 1 - lookBackPeriod; idx--)
  127.             {
  128.                 if (idx < 0)
  129.                     return -1;
  130.                 if (idx >= zigZagHighZigZags.Count)
  131.                     continue;
  132.  
  133.                 if (!zigZagHighZigZags.IsValidDataPointAt(idx))
  134.                     continue;
  135.  
  136.                 if (instance <= 1) // 1-based, < to be save
  137.                     return CurrentBar - idx;
  138.  
  139.                 instance--;
  140.             }
  141.  
  142.             return -1;
  143.         }
  144.  
  145.         protected override void OnBarUpdate()
  146.         {
  147.             if (CurrentBar < 2) // Need at least 3 bars to calculate Low/High
  148.             {
  149.                 zigZagHighSeries[0]     = 0;
  150.                 zigZagLowSeries[0]      = 0;
  151.                 return;
  152.             }
  153.  
  154.             // Initialization
  155.             if (lastSwingPrice == 0.0)
  156.                 lastSwingPrice = Input[0];
  157.  
  158.             ISeries<double> highSeries  = High;
  159.             ISeries<double> lowSeries   = Low;
  160.  
  161.             if (!UseHighLow)
  162.             {
  163.                 highSeries  = Input;
  164.                 lowSeries   = Input;
  165.             }
  166.  
  167.             // Calculation always for 1-bar ago !
  168.             bool isSwingHigh            = highSeries[1].ApproxCompare(highSeries[0]) >= 0
  169.                                             && highSeries[1].ApproxCompare(highSeries[2]) >= 0;
  170.             bool isSwingLow             = lowSeries[1].ApproxCompare(lowSeries[0]) <= 0
  171.                                             && lowSeries[1].ApproxCompare(lowSeries[2]) <= 0;
  172.             bool isOverHighDeviation    = (DeviationType == DeviationType.Percent && IsPriceGreater(highSeries[1], (lastSwingPrice * (1.0 + DeviationValue / 100.0))))
  173.                                             || (DeviationType == DeviationType.Points && IsPriceGreater(highSeries[1], lastSwingPrice + DeviationValue));
  174.             bool isOverLowDeviation     = (DeviationType == DeviationType.Percent && IsPriceGreater(lastSwingPrice * (1.0 - DeviationValue / 100.0), lowSeries[1]))
  175.                                             || (DeviationType == DeviationType.Points && IsPriceGreater(lastSwingPrice - DeviationValue, lowSeries[1]));
  176.  
  177.             double  saveValue   = 0.0;
  178.             bool    addHigh     = false;
  179.             bool    addLow      = false;
  180.             bool    updateHigh  = false;
  181.             bool    updateLow   = false;
  182.  
  183.             if (!isSwingHigh && !isSwingLow)
  184.             {
  185.                 zigZagHighSeries[0] = currentZigZagHigh;
  186.                 zigZagLowSeries[0]  = currentZigZagLow;
  187.                 return;
  188.             }
  189.  
  190.             if (trendDir <= 0 && isSwingHigh && isOverHighDeviation)
  191.             {
  192.                 saveValue   = highSeries[1];
  193.                 addHigh     = true;
  194.                 trendDir    = 1;
  195.             }
  196.             else if (trendDir >= 0 && isSwingLow && isOverLowDeviation)
  197.             {
  198.                 saveValue   = lowSeries[1];
  199.                 addLow      = true;
  200.                 trendDir    = -1;
  201.             }
  202.             else if (trendDir == 1 && isSwingHigh && IsPriceGreater(highSeries[1], lastSwingPrice))
  203.             {
  204.                 saveValue   = highSeries[1];
  205.                 updateHigh  = true;
  206.             }
  207.             else if (trendDir == -1 && isSwingLow && IsPriceGreater(lastSwingPrice, lowSeries[1]))
  208.             {
  209.                 saveValue   = lowSeries[1];
  210.                 updateLow   = true;
  211.             }
  212.  
  213.             if (addHigh || addLow || updateHigh || updateLow)
  214.             {
  215.                 if (updateHigh && lastSwingIdx >= 0)
  216.                 {
  217.                     zigZagHighZigZags.Reset(CurrentBar - lastSwingIdx);
  218.                     Value.Reset(CurrentBar - lastSwingIdx);
  219.                 }
  220.                 else if (updateLow && lastSwingIdx >= 0)
  221.                 {
  222.                     zigZagLowZigZags.Reset(CurrentBar - lastSwingIdx);
  223.                     Value.Reset(CurrentBar - lastSwingIdx);
  224.                 }
  225.  
  226.                 if (addHigh || updateHigh)
  227.                 {
  228.                     zigZagHighZigZags[1]    = saveValue;
  229.                     currentZigZagHigh       = saveValue;
  230.                     zigZagHighSeries[1]     = currentZigZagHigh;
  231.                     Value[1]                = currentZigZagHigh;
  232.                 }
  233.                 else if (addLow || updateLow)
  234.                 {
  235.                     zigZagLowZigZags[1] = saveValue;
  236.                     currentZigZagLow    = saveValue;
  237.                     zigZagLowSeries[1]  = currentZigZagLow;
  238.                     Value[1]            = currentZigZagLow;
  239.                 }
  240.  
  241.                 lastSwingIdx    = CurrentBar - 1;
  242.                 lastSwingPrice  = saveValue;
  243.             }
  244.  
  245.             zigZagHighSeries[0] = currentZigZagHigh;
  246.             zigZagLowSeries[0]  = currentZigZagLow;
  247.            
  248.             if (startIndex == int.MinValue && (zigZagHighZigZags.IsValidDataPoint(1) && zigZagHighZigZags[1] != zigZagHighZigZags[2] || zigZagLowZigZags.IsValidDataPoint(1) && zigZagLowZigZags[1] != zigZagLowZigZags[2]))
  249.                 startIndex = CurrentBar - (Calculate == Calculate.OnBarClose ? 2 : 1);
  250.         }
  251.  
  252.         #region Properties
  253.         /// <summary>
  254.         /// Gets the ZigZag high points.
  255.         /// </summary>
  256.         [NinjaScriptProperty]
  257.         [Display(ResourceType = typeof(Custom.Resource), Name = "DeviationType", GroupName = "NinjaScriptParameters", Order = 0)]
  258.         public DeviationType DeviationType
  259.         { get; set; }
  260.  
  261.         [Range(0, int.MaxValue), NinjaScriptProperty]
  262.         [Display(ResourceType = typeof(Custom.Resource), Name = "DeviationValue", GroupName = "NinjaScriptParameters", Order = 1)]
  263.         public double DeviationValue
  264.         { get; set; }
  265.  
  266.         [NinjaScriptProperty]
  267.         [Display(ResourceType = typeof(Custom.Resource), Name = "UseHighLow", GroupName = "NinjaScriptParameters", Order = 2)]
  268.         public bool UseHighLow
  269.         { get; set; }
  270.  
  271.         [Browsable(false)]
  272.         [XmlIgnore()]
  273.         public Series<double> ZigZagHigh
  274.         {
  275.             get
  276.             {
  277.                 Update();
  278.                 return zigZagHighSeries;
  279.             }
  280.         }
  281.  
  282.         /// <summary>
  283.         /// Gets the ZigZag low points.
  284.         /// </summary>
  285.         [Browsable(false)]
  286.         [XmlIgnore()]
  287.         public Series<double> ZigZagLow
  288.         {
  289.             get
  290.             {
  291.                 Update();
  292.                 return zigZagLowSeries;
  293.             }
  294.         }
  295.         #endregion
  296.  
  297.         #region Miscellaneous
  298.         private bool IsPriceGreater(double a, double b)
  299.         {
  300.             return a.ApproxCompare(b) > 0;
  301.         }
  302.  
  303.         public override void OnCalculateMinMax()
  304.         {
  305.             MinValue = double.MaxValue;
  306.             MaxValue = double.MinValue;
  307.            
  308.             if (BarsArray[0] == null || ChartBars == null || startIndex == int.MinValue)
  309.                 return;
  310.  
  311.             for (int seriesCount = 0; seriesCount < Values.Length; seriesCount++)
  312.             {
  313.                 for (int idx = ChartBars.FromIndex - Displacement; idx <= ChartBars.ToIndex + Displacement; idx++)
  314.                 {
  315.                     if (idx < 0 || idx > Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0))
  316.                         continue;
  317.                    
  318.                     if (zigZagHighZigZags.IsValidDataPointAt(idx))
  319.                         MaxValue = Math.Max(MaxValue, zigZagHighZigZags.GetValueAt(idx));
  320.                    
  321.                     if (zigZagLowZigZags.IsValidDataPointAt(idx))
  322.                         MinValue = Math.Min(MinValue, zigZagLowZigZags.GetValueAt(idx));
  323.                 }
  324.             }
  325.         }
  326.  
  327.         protected override Point[] OnGetSelectionPoints(ChartControl chartControl, ChartScale chartScale)
  328.         {
  329.             if (!IsSelected || Count == 0 || Plots[0].Brush.IsTransparent() || startIndex == int.MinValue)
  330.                 return new System.Windows.Point[0];
  331.  
  332.             List<System.Windows.Point> points = new List<System.Windows.Point>();
  333.  
  334.             int lastIndex   = Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? ChartBars.ToIndex - 1 : ChartBars.ToIndex - 2;
  335.  
  336.             for (int i = Math.Max(0, ChartBars.FromIndex - Displacement); i <= Math.Max(lastIndex, Math.Min(Bars.Count - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 2 : 1), lastIndex - Displacement)); i++)
  337.             {
  338.                 int x = (chartControl.BarSpacingType == BarSpacingType.TimeBased || chartControl.BarSpacingType == BarSpacingType.EquidistantMulti && i + Displacement >= ChartBars.Count
  339.                     ? chartControl.GetXByTime(ChartBars.GetTimeByBarIdx(chartControl, i + Displacement))
  340.                     : chartControl.GetXByBarIndex(ChartBars, i + Displacement));
  341.  
  342.                 if (Value.IsValidDataPointAt(i))
  343.                     points.Add(new System.Windows.Point(x, chartScale.GetYByValue(Value.GetValueAt(i))));
  344.             }
  345.             return points.ToArray();
  346.         }
  347.  
  348.         protected override void OnRender(Gui.Chart.ChartControl chartControl, Gui.Chart.ChartScale chartScale)
  349.         {
  350.             if (Bars == null || chartControl == null || startIndex == int.MinValue)
  351.                 return;
  352.  
  353.             IsValidDataPointAt(Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0)); // Make sure indicator is calculated until last (existing) bar
  354.             int preDiff = 1;
  355.             for (int i = ChartBars.FromIndex - 1; i >= 0; i--)
  356.             {
  357.                 if (i - Displacement < startIndex || i - Displacement > Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0))
  358.                     break;
  359.  
  360.                 bool isHigh = zigZagHighZigZags.IsValidDataPointAt(i - Displacement);
  361.                 bool isLow  = zigZagLowZigZags.IsValidDataPointAt(i - Displacement);
  362.  
  363.                 if (isHigh || isLow)
  364.                     break;
  365.  
  366.                 preDiff++;
  367.             }
  368.  
  369.             preDiff -= (Displacement < 0 ? Displacement : 0 - Displacement);
  370.  
  371.             int postDiff = 0;
  372.             for (int i = ChartBars.ToIndex; i <= zigZagHighZigZags.Count; i++)
  373.             {
  374.                 if (i - Displacement < startIndex || i - Displacement > Bars.Count - 1 - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 1 : 0))
  375.                     break;
  376.  
  377.                 bool isHigh = zigZagHighZigZags.IsValidDataPointAt(i - Displacement);
  378.                 bool isLow  = zigZagLowZigZags.IsValidDataPointAt(i - Displacement);
  379.  
  380.                 if (isHigh || isLow)
  381.                     break;
  382.  
  383.                 postDiff++;
  384.             }
  385.  
  386.             postDiff += (Displacement < 0 ? 0 - Displacement : Displacement);
  387.  
  388.             int     lastIdx     = -1;
  389.             double  lastValue   = -1;
  390.             SharpDX.Direct2D1.PathGeometry  g       = null;
  391.             SharpDX.Direct2D1.GeometrySink  sink    = null;
  392.  
  393.             for (int idx = ChartBars.FromIndex - preDiff; idx <= ChartBars.ToIndex + postDiff; idx++)
  394.             {
  395.                 if (idx < startIndex || idx > Bars.Count - (Calculate == NinjaTrader.NinjaScript.Calculate.OnBarClose ? 2 : 1) || idx < Math.Max(BarsRequiredToPlot - Displacement, Displacement))
  396.                     continue;
  397.  
  398.                 bool isHigh = zigZagHighZigZags.IsValidDataPointAt(idx);
  399.                 bool isLow  = zigZagLowZigZags.IsValidDataPointAt(idx);
  400.  
  401.                 if (!isHigh && !isLow)
  402.                     continue;
  403.                
  404.                 double value = isHigh ? zigZagHighZigZags.GetValueAt(idx) : zigZagLowZigZags.GetValueAt(idx);
  405.                
  406.                 if (lastIdx >= startIndex)
  407.                 {
  408.                     float x1    = (chartControl.BarSpacingType == BarSpacingType.TimeBased || chartControl.BarSpacingType == BarSpacingType.EquidistantMulti && idx + Displacement >= ChartBars.Count
  409.                         ? chartControl.GetXByTime(ChartBars.GetTimeByBarIdx(chartControl, idx + Displacement))
  410.                         : chartControl.GetXByBarIndex(ChartBars, idx + Displacement));
  411.                     float y1    = chartScale.GetYByValue(value);
  412.  
  413.                     if (sink == null)
  414.                     {
  415.                         float x0    = (chartControl.BarSpacingType == BarSpacingType.TimeBased || chartControl.BarSpacingType == BarSpacingType.EquidistantMulti && lastIdx + Displacement >= ChartBars.Count
  416.                         ? chartControl.GetXByTime(ChartBars.GetTimeByBarIdx(chartControl, lastIdx + Displacement))
  417.                         : chartControl.GetXByBarIndex(ChartBars, lastIdx + Displacement));
  418.                         float y0    = chartScale.GetYByValue(lastValue);
  419.                         g           = new SharpDX.Direct2D1.PathGeometry(Core.Globals.D2DFactory);
  420.                         sink        = g.Open();
  421.                         sink.BeginFigure(new SharpDX.Vector2(x0, y0), SharpDX.Direct2D1.FigureBegin.Hollow);
  422.                     }
  423.                     sink.AddLine(new SharpDX.Vector2(x1, y1));
  424.                 }
  425.  
  426.                 // Save as previous point
  427.                 lastIdx     = idx;
  428.                 lastValue   = value;
  429.             }
  430.  
  431.             if (sink != null)
  432.             {
  433.                 sink.EndFigure(SharpDX.Direct2D1.FigureEnd.Open);
  434.                 sink.Close();
  435.             }
  436.  
  437.             if (g != null)
  438.             {
  439.                 var oldAntiAliasMode = RenderTarget.AntialiasMode;
  440.                 RenderTarget.AntialiasMode = SharpDX.Direct2D1.AntialiasMode.PerPrimitive;
  441.                 RenderTarget.DrawGeometry(g, Plots[0].BrushDX, Plots[0].Width, Plots[0].StrokeStyle);
  442.                 RenderTarget.AntialiasMode = oldAntiAliasMode;
  443.                 g.Dispose();
  444.                 RemoveDrawObject("NinjaScriptInfo");
  445.             }
  446.             else
  447.                 Draw.TextFixed(this, "NinjaScriptInfo", NinjaTrader.Custom.Resource.ZigZagDeviationValueError, TextPosition.BottomRight);
  448.         }
  449.         #endregion
  450.     }
  451. }
  452.  
  453. public enum DeviationType
  454. {
  455.     Percent,
  456.     Points
  457. }
  458.  
  459. #region NinjaScript generated code. Neither change nor remove.
  460.  
  461. namespace NinjaTrader.NinjaScript.Indicators
  462. {
  463.     public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase
  464.     {
  465.         private ZigZag[] cacheZigZag;
  466.         public ZigZag ZigZag(DeviationType deviationType, double deviationValue, bool useHighLow)
  467.         {
  468.             return ZigZag(Input, deviationType, deviationValue, useHighLow);
  469.         }
  470.  
  471.         public ZigZag ZigZag(ISeries<double> input, DeviationType deviationType, double deviationValue, bool useHighLow)
  472.         {
  473.             if (cacheZigZag != null)
  474.                 for (int idx = 0; idx < cacheZigZag.Length; idx++)
  475.                     if (cacheZigZag[idx] != null && cacheZigZag[idx].DeviationType == deviationType && cacheZigZag[idx].DeviationValue == deviationValue && cacheZigZag[idx].UseHighLow == useHighLow && cacheZigZag[idx].EqualsInput(input))
  476.                         return cacheZigZag[idx];
  477.             return CacheIndicator<ZigZag>(new ZigZag(){ DeviationType = deviationType, DeviationValue = deviationValue, UseHighLow = useHighLow }, input, ref cacheZigZag);
  478.         }
  479.     }
  480. }
  481.  
  482. namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns
  483. {
  484.     public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase
  485.     {
  486.         public Indicators.ZigZag ZigZag(DeviationType deviationType, double deviationValue, bool useHighLow)
  487.         {
  488.             return indicator.ZigZag(Input, deviationType, deviationValue, useHighLow);
  489.         }
  490.  
  491.         public Indicators.ZigZag ZigZag(ISeries<double> input , DeviationType deviationType, double deviationValue, bool useHighLow)
  492.         {
  493.             return indicator.ZigZag(input, deviationType, deviationValue, useHighLow);
  494.         }
  495.     }
  496. }
  497.  
  498. namespace NinjaTrader.NinjaScript.Strategies
  499. {
  500.     public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase
  501.     {
  502.         public Indicators.ZigZag ZigZag(DeviationType deviationType, double deviationValue, bool useHighLow)
  503.         {
  504.             return indicator.ZigZag(Input, deviationType, deviationValue, useHighLow);
  505.         }
  506.  
  507.         public Indicators.ZigZag ZigZag(ISeries<double> input , DeviationType deviationType, double deviationValue, bool useHighLow)
  508.         {
  509.             return indicator.ZigZag(input, deviationType, deviationValue, useHighLow);
  510.         }
  511.     }
  512. }
  513.  
  514. #endregion
  515.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement