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