Find below the Revised AutoFibIndicator Script. Attached is a screen shot showing the compiled script (NT8 version: 8.1.6.3 64-bit). Enjoy!
#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.Data;
using NinjaTrader.NinjaScript;
using NinjaTrader.Core.FloatingPoint;
using NinjaTrader.NinjaScript.DrawingTools;
#endregion
namespace NinjaTrader.NinjaScript.Indicators
{
public class AutoFibIndicator : Indicator
{
private MAX maxIndicator;
private MIN minIndicator;
[NinjaScriptProperty]
[Range(1, int.MaxValue)]
[Display(Name="Lookback", Order=1, GroupName="Parameters")]
public int Lookback { get; set; }
#region Color Properties
[XmlIgnore]
[Display(Name="Fib 38.2 Color", Order=2, GroupName="Colors")]
public Brush Fib382Color { get; set; }
[Browsable(false)]
public string Fib382ColorSerializable
{
get { return Serialize.BrushToString(Fib382Color); }
set { Fib382Color = Serialize.StringToBrush(value); }
}
[XmlIgnore]
[Display(Name="Fib 50.0 Color", Order=3, GroupName="Colors")]
public Brush Fib50Color { get; set; }
[Browsable(false)]
public string Fib50ColorSerializable
{
get { return Serialize.BrushToString(Fib50Color); }
set { Fib50Color = Serialize.StringToBrush(value); }
}
[XmlIgnore]
[Display(Name="Fib 61.8 Color", Order=4, GroupName="Colors")]
public Brush Fib618Color { get; set; }
[Browsable(false)]
public string Fib618ColorSerializable
{
get { return Serialize.BrushToString(Fib618Color); }
set { Fib618Color = Serialize.StringToBrush(value); }
}
[XmlIgnore]
[Display(Name="Long Signal Color", Order=5, GroupName="Colors")]
public Brush LongColor { get; set; }
[Browsable(false)]
public string LongColorSerializable
{
get { return Serialize.BrushToString(LongColor); }
set { LongColor = Serialize.StringToBrush(value); }
}
[XmlIgnore]
[Display(Name="Short Signal Color", Order=6, GroupName="Colors")]
public Brush ShortColor { get; set; }
[Browsable(false)]
public string ShortColorSerializable
{
get { return Serialize.BrushToString(ShortColor); }
set { ShortColor = Serialize.StringToBrush(value); }
}
#endregion
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Automatically plots Fibonacci levels based on a lookback period.";
Name = "AutoFibIndicator";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
DisplayInDataBox = true;
DrawOnPricePanel = true;
IsSuspendedWhileInactive = true;
Lookback = 20;
Fib382Color = Brushes.DodgerBlue;
Fib50Color = Brushes.Gray;
Fib618Color = Brushes.Gold;
LongColor = Brushes.Lime;
ShortColor = Brushes.Red;
}
else if (State == State.DataLoaded)
{
maxIndicator = MAX(High, Lookback);
minIndicator = MIN(Low, Lookback);
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < Lookback)
return;
double swingHigh = maxIndicator[0];
double swingLow = minIndicator[0];
double range = swingHigh - swingLow;
if (range <= 0) return;
double fib382 = swingHigh - (range * 0.382);
double fib50 = swingHigh - (range * 0.5);
double fib618 = swingHigh - (range * 0.618);
// Using static tags for lines ensures they "move" with the lookback rather than creating new ones
Draw.Line(this, "Fib382", false, Lookback, fib382, 0, fib382, Fib382Color, DashStyleHelper.Solid, 2);
Draw.Line(this, "Fib50", false, Lookback, fib50, 0, fib50, Fib50Color, DashStyleHelper.Dash, 2);
Draw.Line(this, "Fib618", false, Lookback, fib618, 0, fib618, Fib618Color, DashStyleHelper.Solid, 3);
// Signal Logic
// Long: Close crosses above 61.8%
if (CrossAbove(Close, fib618, 1))
{
Draw.ArrowUp(this, "Long" + CurrentBar, true, 0, Low[0] - (5 * TickSize), LongColor);
}
// Short: Close crosses below 61.8%
if (CrossBelow(Close, fib618, 1))
{
Draw.ArrowDown(this, "Short" + CurrentBar, true, 0, High[0] + (5 * TickSize), ShortColor);
}
}
}
}