#region Using declarations
using System;
using System.Windows.Media;
using NinjaTrader.NinjaScript;
using NinjaTrader.NinjaScript.Indicators;
using NinjaTrader.NinjaScript.DrawingTools;
using NinjaTrader.Data;
using NinjaTrader.Cbi;
#endregion
namespace NinjaTrader.NinjaScript.Indicators
{
public class AutoFibIndicator : Indicator
{
private int lookback = 20;
private double swingHigh;
private double swingLow;
private MAX maxIndicator;
private MIN minIndicator;
// Farben frei wählbar
[NinjaScriptProperty]
public Brush Fib382Color { get; set; }
[NinjaScriptProperty]
public Brush Fib50Color { get; set; }
[NinjaScriptProperty]
public Brush Fib618Color { get; set; }
[NinjaScriptProperty]
public Brush LongColor { get; set; }
[NinjaScriptProperty]
public Brush ShortColor { get; set; }
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Name = "AutoFibIndicator";
Calculate = Calculate.OnBarClose;
IsOverlay = true;
IsSuspendedWhileInactive = true;
Fib382Color = Brushes.DodgerBlue;
Fib50Color = Brushes.Gray;
Fib618Color = Brushes.Gold;
LongColor = Brushes.Lime;
ShortColor = Brushes.Red;
}
else if (State == State.Configure)
{
// Hier können Konfigurationen vorgenommen werden
}
else if (State == State.DataLoaded)
{
// MAX und MIN Indikatoren initialisieren
maxIndicator = MAX(High, lookback);
minIndicator = MIN(Low, lookback);
}
}
protected override void OnBarUpdate()
{
if (CurrentBar < lookback)
return;
if (maxIndicator == null || minIndicator == null)
return;
// Aktuelle Swing High und Low abrufen
swingHigh = maxIndicator[0];
swingLow = minIndicator[0];
double range = swingHigh - swingLow;
double fib382 = swingHigh - range * 0.382;
double fib50 = swingHigh - range * 0.5;
double fib618 = swingHigh - range * 0.618;
int startBar = CurrentBar - lookback;
// Bestehende Linien löschen, um Überlappungen zu vermeiden
string fib382Tag = "Fib382";
string fib50Tag = "Fib50";
string fib618Tag = "Fib618";
RemoveDrawObject(fib382Tag);
RemoveDrawObject(fib50Tag);
RemoveDrawObject(fib618Tag);
// === FIB LINIEN ===
Draw.Line(this, fib382Tag, false,
startBar, fib382,
CurrentBar, fib382,
Fib382Color, DashStyleHelper.Solid, 2);
Draw.Line(this, fib50Tag, false,
startBar, fib50,
CurrentBar, fib50,
Fib50Color, DashStyleHelper.Dash, 2);
Draw.Line(this, fib618Tag, false,
startBar, fib618,
CurrentBar, fib618,
Fib618Color, DashStyleHelper.Solid, 3);
// === SIGNAL LOGIK ===
string longTag = "Long" + CurrentBar;
string shortTag = "Short" + CurrentBar;
// LONG (Bounce über 61.8)
if (Close[0] > fib618 && Close[1] <= fib618)
{
Draw.ArrowUp(this, longTag, false,
0, Low[0] - (2 * TickSize), LongColor);
}
// SHORT (Reject unter 61.8)
if (Close[0] < fib618 && Close[1] >= fib618)
{
Draw.ArrowDown(this, shortTag, false,
0, High[0] + (2 * TickSize), ShortColor);
}
}
protected override void OnRender(ChartControl chartControl, ChartScale chartScale)
{
// Optional: Hier kann zusätzliches Rendering durchgeführt werden
base.OnRender(chartControl, chartScale);
}
}
}