I have the code below triggering dozens of times every time the conditions are met, instead of just once at the FirstTickOfBar and I would appreciate some help in figuring out why.
The prints look like this:
Neg Div | 16/12/2019 09:10:00 | Current Bar = 949 | j = 2 | b = 7
LastHSwDMI -1 = 0.6667 | LastHSwDMI = 0.6842 | HSwDMI = 0.6250
.....
Neg Div | 16/12/2019 09:10:00 | Current Bar = 949 | j = 2 | b = 7
LastHSwDMI -1 = 0.6667 | LastHSwDMI = 0.6842 | HSwDMI = 0.6250
......
Neg Div | 16/12/2019 09:10:00 | Current Bar = 949 | j = 2 | b = 7
LastHSwDMI -1 = 0.6667 | LastHSwDMI = 0.6842 | HSwDMI = 0.6250
......
About 25 times this print is repeated!?!
public class Divergence5min : Strategy
{
private ObservableCollection <double> HSwDMI, LSwDMI, LastHSwDMI, LastLSwDMI;
.........
protected override void OnStateChange()
{
if (State == State.SetDefaults)
{
Description = @"Enter the description for your new custom Strategy here.";
Name = "Divergence5min";
Calculate = Calculate.OnEachTick;
.......
}
else if (State == State.Configure)
{
LSwDMI = new ObservableCollection <double>(); LastLSwDMI = new ObservableCollection <double>();
HSwDMI = new ObservableCollection <double>(); LastHSwDMI = new ObservableCollection <double>();
}
else if (State == State.DataLoaded)
{
DMI1 = DMI(Closes[0], Convert.ToInt32(DmiPeriod));
T31b0 = T3(Closes[0], 5, 3, 0.7);
T32b0 = T3(Closes[0], 8, 3, 0.7);
DMI1.Plots[0].Brush = Brushes.Lime;
T31b0.Plots[0].Brush = Brushes.Yellow;
T32b0.Plots[0].Brush = Brushes.White;
AddChartIndicator(DMI1);
AddChartIndicator(T31b0);
AddChartIndicator(T32b0);
DMI1.Panel = 1;
}
protected override void OnBarUpdate()
{
if (IsFirstTickOfBar)
{
....
NegativeDivergence();
}
} // OnBarUpdate end
private void NegativeDivergence()
{
HSwDMI.CollectionChanged += (s, e) =>
{
if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add)
{
//Print("Action for NegativeDivergence: {0}" + e.Action);
if (/*!NegDiv &&*/ j > 1 && b > 1 && BarsInProgress == 0 && IsFirstTickOfBar && (highSwBarDiffA <= BarDiff || highSwBarDiffB <= BarDiff))
{
if (!negDiv && ((LastHSwDMI[j-2] - LastHSwDMI[j-1] > 0.001 && LastHSwDMIprice[j-1] - LastHSwDMIprice[j - 2] > TickSize) // ND 1
|| (LastHSwDMI[j-1] - HSwDMI[b-1] > 0.001 && HSwDMIprice[b-1] - LastHSwDMIprice[j - 1] > TickSize))) // ND 2
{
PrintNegDiv();
negDiv = true; // NEG DIV = Reversal
}
else
{
negDiv = false;
}
if (!hidNegDiv && ((LastHSwDMI[j-1] - LastHSwDMI[j-2] > 0.001 && LastHSwDMIprice[j - 2] > LastHSwDMIprice[j - 1] && LastHSwDMIprice[j - 2] - LastHSwDMIprice[j - 1] <= (int) HidDivOffset * TickSize) // HND 1
|| (HSwDMI[b-1] - LastHSwDMI[j-1] > 0.001 && LastHSwDMIprice[j - 1] > HSwDMIprice[b - 1] && LastHSwDMIprice[j - 1] - HSwDMIprice[b - 1] <= (int) HidDivOffset * TickSize))) // HND 2
{
PrintHidNegDiv();
hidNegDiv = true; // HID NEG DIV = Continuation
}
else
{
hidNegDiv = false;
}
}
}
};
}
private void PrintNegDiv()
{
if (PrintDmiSwing)
Print("Neg Div | " + Time[0] + " | Current Bar = " + CurrentBar + " | j = " + j + " | b = " + b + string.Format("\r\nLastHSwDMI -1 = {0:F4} | LastHSwDMI = {1:F4} | HSwDMI = {2:F4}",
LastHSwDMI[j-2], LastHSwDMI[j-1], HSwDMI[b-1]) + "\r\nLastHSwDMIbar -1 = " + LastHSwDMIbar[j - 2] + " | LastHSwDMIbar = " + LastHSwDMIbar[j - 1] + " | HSwDMIbar = " + HSwDMIbar[b - 1] +
"\r\nLast High -1 = " + LastHSwDMIprice[j - 2] + " | Last High = " + LastHSwDMIprice[j - 1] + " | Price DMI High = " + HSwDMIprice[b - 1] +
"\r\nLast High Bar -1 = " + LastHSwDMIpriceBar[j-2] + " | Last High Bar = " + LastHSwDMIpriceBar[j-1] + " | PriceHighBar = " + PriceHighBar[b-1] +
"\r\nND 1 = " + (LastHSwDMI[j - 2] - LastHSwDMI[j - 1] > 0.001 && LastHSwDMIprice[j - 1] - LastHSwDMIprice[j - 2] > TickSize) +
"\r\nND 2 = " + (LastHSwDMI[j - 1] - HSwDMI[b - 1] > 0.001 && HSwDMIprice[b - 1] - LastHSwDMIprice[j - 1] > TickSize) + "\r\n-");
}
private void PrintHidNegDiv()
{
if (PrintDmiSwing)
Print("Hid Neg Div | " + Time[0] + " | Current Bar = " + CurrentBar + " | j = " + j + " | b = " + b + string.Format("\r\nLastHSwDMI -1 = {0:F4} | LastHSwDMI = {1:F4} | HSwDMI = {2:F4}",
LastHSwDMI[j-2], LastHSwDMI[j-1], HSwDMI[b-1]) + "\r\nLastHSwDMIbar -1 = " + LastHSwDMIbar[j-2] + " | LastHSwDMIbar = " + LastHSwDMIbar[j-1] + " | HSwDMIbar = " + HSwDMIbar[b-1] +
"\r\nLast high -1 = " + LastHSwDMIprice[j - 2] + " | Last High = " + LastHSwDMIprice[j - 1] + " | Price DMI High = " + HSwDMIprice[b - 1] +
"\r\nLast High Bar -1 = " + LastHSwDMIpriceBar[j - 2] + " | Last High Bar = " + LastHSwDMIpriceBar[j - 1] + " | PriceHighBar = " + PriceHighBar[b - 1] +
"\r\nHND 1 = " + (LastHSwDMI[j - 1] - LastHSwDMI[j - 2] > 0.001&& LastHSwDMIprice[j - 2] > LastHSwDMIprice[j - 1] && LastHSwDMIprice[j - 2] - LastHSwDMIprice[j - 1] <= (int) HidDivOffset * TickSize) +
"\r\nHND 2 = " + (HSwDMI[b - 1] - LastHSwDMI[j - 1] > 0.001 && LastHSwDMIprice[j - 1] > HSwDMIprice[b - 1] && LastHSwDMIprice[j - 1] - HSwDMIprice[b - 1] <= (int) HidDivOffset * TickSize) + "\r\n-");
}
}

Comment