#region Using declarations using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using System.Windows.Input; using System.Windows.Media; using System.Xml.Serialization; using NinjaTrader.Cbi; using NinjaTrader.Gui; using NinjaTrader.Gui.Chart; using NinjaTrader.Gui.SuperDom; using NinjaTrader.Gui.Tools; using NinjaTrader.Data; using NinjaTrader.NinjaScript; using NinjaTrader.Core.FloatingPoint; using NinjaTrader.NinjaScript.DrawingTools; #endregion //This namespace holds Indicators in this folder and is required. Do not change it. namespace NinjaTrader.NinjaScript.Indicators { [CategoryOrder("Rate of Change", 1)] [CategoryOrder("Moving Average", 2)] [CategoryOrder("Weight", 3)] [CategoryOrder("Visual", 4)] public class KnowSureThing : Indicator { public static int DefaultRoC1 = 10; public static int DefaultRoC2 = 15; public static int DefaultRoC3 = 20; public static int DefaultRoC4 = 30; public static int DefaultMA1 = 10; public static int DefaultMA2 = 10; public static int DefaultMA3 = 10; public static int DefaultMA4 = 15; public static int DefaultEMAPeriod = 9; public static int DefaultW1 = 1; public static int DefaultW2 = 2; public static int DefaultW3 = 3; public static int DefaultW4 = 4; public static Brush DefaultPositiveValue = Brushes.LimeGreen; public static Brush DefaultNegativeValue = Brushes.Red; protected override void OnStateChange() { if (State == State.SetDefaults) { Description = @"Know Sure Thing (KST) oscillator"; Name = "Know Sure Thing"; Calculate = Calculate.OnPriceChange; IsOverlay = false; DisplayInDataBox = true; DrawOnPricePanel = true; PaintPriceMarkers = true; ScaleJustification = ScaleJustification.Right; IsSuspendedWhileInactive = true; RoC1 = DefaultRoC1; RoC2 = DefaultRoC2; RoC3 = DefaultRoC3; RoC4 = DefaultRoC4; MA1 = DefaultMA1; MA2 = DefaultMA2; MA3 = DefaultMA3; MA4 = DefaultMA4; EMAPeriod = DefaultEMAPeriod; W1 = DefaultW1; W2 = DefaultW2; W3 = DefaultW3; W4 = DefaultW4; PositiveValue = DefaultPositiveValue; NegativeValue = DefaultNegativeValue; AddPlot(new Stroke(Brushes.LimeGreen, 3), PlotStyle.Line, "KST"); AddPlot(new Stroke(Brushes.Yellow, 2), PlotStyle.Line, "EMA"); } } protected override void OnBarUpdate() { double rateOfChange1 = SMA(ROC(Close, RoC1), MA1)[0]; double rateOfChange2 = SMA(ROC(Close, RoC2), MA2)[0]; double rateOfChange3 = SMA(ROC(Close, RoC3), MA3)[0]; double rateOfChange4 = SMA(ROC(Close, RoC4), MA4)[0]; double kstValue = (rateOfChange1 * W1) + (rateOfChange2 * W2) + (rateOfChange3 * W3) + (rateOfChange4 * W4); KST[0] = kstValue; MovingAverage[0] = EMA(KST, EMAPeriod)[0]; if (KST[0] > MovingAverage[0]) PlotBrushes[0][0] = PositiveValue; else PlotBrushes[0][0] = NegativeValue; } public override string DisplayName { get { return Name; } } #region Properties [Browsable(false)] [XmlIgnore] public Series KST { get { return Values[0]; } } [Browsable(false)] [XmlIgnore] public Series MovingAverage { get { return Values[1]; } } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 1", Description = "Period used in first ROC calculation", Order = 1, GroupName = "Rate of Change")] public int RoC1 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 2", Description = "Period used in second ROC calculation", Order = 2, GroupName = "Rate of Change")] public int RoC2 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 3", Description = "Period used in third ROC calculation", Order = 3, GroupName = "Rate of Change")] public int RoC3 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 4", Description = "Period used in fourth ROC calculation", Order = 4, GroupName = "Rate of Change")] public int RoC4 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 1", Description = "Period used in first MA calculation", Order = 1, GroupName = "Moving Average")] public int MA1 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 2", Description = "Period used in second MA calculation", Order = 2, GroupName = "Moving Average")] public int MA2 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 3", Description = "Period used in third MA calculation", Order = 3, GroupName = "Moving Average")] public int MA3 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Period 4", Description = "Period used in fourth MA calculation", Order = 4, GroupName = "Moving Average")] public int MA4 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Signal Period", Description = "Period used in moving average signal calculation", Order = 5, GroupName = "Moving Average")] public int EMAPeriod { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Weight 1", Description = "First weight used in KST calculation", Order = 1, GroupName = "Weight")] public int W1 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Weight 2", Description = "Second weight used in KST calculation", Order = 2, GroupName = "Weight")] public int W2 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Weight 3", Description = "Third weight used in KST calculation", Order = 3, GroupName = "Weight")] public int W3 { get; set; } [NinjaScriptProperty] [Range(1, int.MaxValue)] [Display(Name = "Weight 4", Description = "Fourth weight used in KST calculation", Order = 4, GroupName = "Weight")] public int W4 { get; set; } [XmlIgnore] [Display(Name = "Positive Value", Description = "Color of positive values", Order = 1, GroupName = "Visual")] public Brush PositiveValue { get; set; } [XmlIgnore] [Display(Name = "Negative Value", Description = "Color of negative values", Order = 2, GroupName = "Visual")] public Brush NegativeValue { get; set; } #endregion } } // Helper constructor for strategies. namespace NinjaTrader.NinjaScript.Strategies { public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase { public Indicators.KnowSureThing KnowSureThing() { return indicator.KnowSureThing( Indicators.KnowSureThing.DefaultRoC1, Indicators.KnowSureThing.DefaultRoC2, Indicators.KnowSureThing.DefaultRoC3, Indicators.KnowSureThing.DefaultRoC4, Indicators.KnowSureThing.DefaultMA1, Indicators.KnowSureThing.DefaultMA2, Indicators.KnowSureThing.DefaultMA3, Indicators.KnowSureThing.DefaultMA4, Indicators.KnowSureThing.DefaultEMAPeriod, Indicators.KnowSureThing.DefaultW1, Indicators.KnowSureThing.DefaultW2, Indicators.KnowSureThing.DefaultW3, Indicators.KnowSureThing.DefaultW4 ); } } } #region NinjaScript generated code. Neither change nor remove. namespace NinjaTrader.NinjaScript.Indicators { public partial class Indicator : NinjaTrader.Gui.NinjaScript.IndicatorRenderBase { private KnowSureThing[] cacheKnowSureThing; public KnowSureThing KnowSureThing(int roC1, int roC2, int roC3, int roC4, int mA1, int mA2, int mA3, int mA4, int eMAPeriod, int w1, int w2, int w3, int w4) { return KnowSureThing(Input, roC1, roC2, roC3, roC4, mA1, mA2, mA3, mA4, eMAPeriod, w1, w2, w3, w4); } public KnowSureThing KnowSureThing(ISeries input, int roC1, int roC2, int roC3, int roC4, int mA1, int mA2, int mA3, int mA4, int eMAPeriod, int w1, int w2, int w3, int w4) { if (cacheKnowSureThing != null) for (int idx = 0; idx < cacheKnowSureThing.Length; idx++) if (cacheKnowSureThing[idx] != null && cacheKnowSureThing[idx].RoC1 == roC1 && cacheKnowSureThing[idx].RoC2 == roC2 && cacheKnowSureThing[idx].RoC3 == roC3 && cacheKnowSureThing[idx].RoC4 == roC4 && cacheKnowSureThing[idx].MA1 == mA1 && cacheKnowSureThing[idx].MA2 == mA2 && cacheKnowSureThing[idx].MA3 == mA3 && cacheKnowSureThing[idx].MA4 == mA4 && cacheKnowSureThing[idx].EMAPeriod == eMAPeriod && cacheKnowSureThing[idx].W1 == w1 && cacheKnowSureThing[idx].W2 == w2 && cacheKnowSureThing[idx].W3 == w3 && cacheKnowSureThing[idx].W4 == w4 && cacheKnowSureThing[idx].EqualsInput(input)) return cacheKnowSureThing[idx]; return CacheIndicator(new KnowSureThing(){ RoC1 = roC1, RoC2 = roC2, RoC3 = roC3, RoC4 = roC4, MA1 = mA1, MA2 = mA2, MA3 = mA3, MA4 = mA4, EMAPeriod = eMAPeriod, W1 = w1, W2 = w2, W3 = w3, W4 = w4 }, input, ref cacheKnowSureThing); } } } namespace NinjaTrader.NinjaScript.MarketAnalyzerColumns { public partial class MarketAnalyzerColumn : MarketAnalyzerColumnBase { public Indicators.KnowSureThing KnowSureThing(int roC1, int roC2, int roC3, int roC4, int mA1, int mA2, int mA3, int mA4, int eMAPeriod, int w1, int w2, int w3, int w4) { return indicator.KnowSureThing(Input, roC1, roC2, roC3, roC4, mA1, mA2, mA3, mA4, eMAPeriod, w1, w2, w3, w4); } public Indicators.KnowSureThing KnowSureThing(ISeries input , int roC1, int roC2, int roC3, int roC4, int mA1, int mA2, int mA3, int mA4, int eMAPeriod, int w1, int w2, int w3, int w4) { return indicator.KnowSureThing(input, roC1, roC2, roC3, roC4, mA1, mA2, mA3, mA4, eMAPeriod, w1, w2, w3, w4); } } } namespace NinjaTrader.NinjaScript.Strategies { public partial class Strategy : NinjaTrader.Gui.NinjaScript.StrategyRenderBase { public Indicators.KnowSureThing KnowSureThing(int roC1, int roC2, int roC3, int roC4, int mA1, int mA2, int mA3, int mA4, int eMAPeriod, int w1, int w2, int w3, int w4) { return indicator.KnowSureThing(Input, roC1, roC2, roC3, roC4, mA1, mA2, mA3, mA4, eMAPeriod, w1, w2, w3, w4); } public Indicators.KnowSureThing KnowSureThing(ISeries input , int roC1, int roC2, int roC3, int roC4, int mA1, int mA2, int mA3, int mA4, int eMAPeriod, int w1, int w2, int w3, int w4) { return indicator.KnowSureThing(input, roC1, roC2, roC3, roC4, mA1, mA2, mA3, mA4, eMAPeriod, w1, w2, w3, w4); } } } #endregion