#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.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
{
/// <summary>
/// The StochasticFast Oscillator using EMA instead of SMA.
/// </summary>
public class StochasticsColorBar : Indicator
{
private Series<double> den;
private MAX max;
private MIN min;
private Series<double> nom;
private EMA emaK;
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"The StochasticFast Oscillator using EMA instead of SMA.";
Name = "StochasticsColorBar";
IsSuspendedWhileInactive = true;
IsOverlay = true;
IsChartOnly = true;
PaintPriceMarkers = true;
PeriodD = 5;
PeriodK = 55;
UpperLevel = 85;
LowerLevel = 15;
}
else if (State == State.DataLoaded)
{
den = new Series<double>(this);
nom = new Series<double>(this);
min = MIN(Low, PeriodK);
max = MAX(High, PeriodK);
emaK = EMA(K, PeriodD);
}
}
protected override void OnBarUpdate()
{
if(CurrentBar<30)
return;
double min0 = min[0];
nom[0] = Close[0] - min0;
den[0] = max[0] - min0;
if (den[0].ApproxCompare(0) == 0)
K[0] = CurrentBar == 0 ? 50 : K[1];
else
K[0] = Math.Min(100, Math.Max(0, 100 * nom[0] / den[0]));
D[0] = emaK[0];
if (PeriodK>UpperLevel)
BarBrush = Brushes.Green;
else if (PeriodK<LowerLevel)
BarBrush = Brushes.Red;
else
BarBrush = Brushes.White;
}
#region Properties
[Browsable(false)]
[XmlIgnore()]
public Series<double> D
{
get { return Values[0]; }
}
[Browsable(false)]
[XmlIgnore()]
public Series<double> K
{
get { return Values[1]; }
}
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "PeriodD", GroupName = "NinjaScriptParameters", Order = 0)]
public int PeriodD
{ get; set; }
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "PeriodK", GroupName = "NinjaScriptParameters", Order = 1)]
public int PeriodK
{ get; set; }
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "Upper Level", GroupName = "NinjaScriptParameters", Order = 3)]
public int UpperLevel
{ get; set; }
[Range(1, int.MaxValue), NinjaScriptProperty]
[Display(ResourceType = typeof(Custom.Resource), Name = "Lower Level", GroupName = "NinjaScriptParameters", Order = 4)]
public int LowerLevel
{ get; set; }
#endregion
}
}
Comment