can u explain please what is the value of size? & where is this var initialize
for(j = size - 1
why does my code cause a memory leak. I coded it such that it will run the indicator on all the bars and then stop accepting future ticks.
can u explain please what is the value of size? & where is this var initialize
size is initialized as an external int for the size of a string. strings of size n has characters at positions 0 through n-1.
extern int size = 3;//This is above init()
Why do you think it has a leak? It created several large arrays, filled them up, then started ignoring ticks. It's still running and using the arrays.
I think there is a leak because it freezes my mt4 and when I use ctrl alt delete and look at my terminal process, the CPU usage increases to 100%.
I am technically collecting data so my intentions is not to make it like a real indicator to keep waiting for ticks. I just want to collect data for all the bars on the chart except the current.
it works if I set i = 20; sometime i = 1000; and freezes on numbers greater.
thanks for your assistance
why does my code cause a memory leak. I coded it such that it will run the indicator on all the bars and then stop accepting future ticks.
The first two lines show an obvious problem ...
i = Bars; Print("Year: "+TimeYear(Time[i])+" Month: "+TimeMonth(Time[i])+" Day: "+TimeDay(Time[i])+"Hour: "+TimeMonth(Time[i]));
The are
i=Bars
bars on the chart. You are only allowed to index arrays up to Bars-1 because the first bar is Time[0] for example.
You are over-running the length of the arrays and this can crash the program.
The first two lines show an obvious problem ...
The are
i=Bars
bars on the chart. You are only allowed to index arrays up to Bars-1 because the first bar is Time[0] for example.
You are over-running the length of the arrays and this can crash the program.
Here is the rest of the code from the while loop on down. If I comment the while loop there is no freezing so I assume the problem lies within the while loop.
i = Bars-1; Print("Year: "+TimeYear(Time[i])+" Month: "+TimeMonth(Time[i])+" Day: "+TimeDay(Time[i])+"Hour: "+TimeMonth(Time[i])); while(i > 0) { string match = List[0]; m = 0; for(j = size - 1; j >= 0; j--) { if( (Close[i+j+1] - Open[i+j+1]) > 0)match = StringSetChar(match, m,'u'); else match = StringSetChar(match, m,'d'); //Print("Time of Hour "+TimeHour(Time[i+j]));for debugging m++; } // Print("pattern found is "+match+" at hour " +TimeHour(Time[i]) );//for debugging for(j = 0; j < ArraySize(List); j++) { if(List[j] == match) { // Print("The minute and hour of this Hourly is "+TimeMinute(Time[i])+" and "+TimeHour(Time[i]) ); // Print("The minute and hour of this Minute is "+TimeMinute(iTime(Symbol(),PERIOD_M1,i*60+TimeMinute(iTime(Symbol(),PERIOD_M1,i*60))))+" and "+TimeHour(iTime(Symbol(),PERIOD_M1,i*60+TimeMinute(iTime(Symbol(),PERIOD_M1,i*60)))) ); m = (i+1)*60+TimeMinute(iTime(Symbol(),PERIOD_M1,(i+1)*60)); // Print("Time of m is hour: "+TimeHour(iTime(Symbol(),PERIOD_M1,m+1))+" min: "+TimeMinute(iTime(Symbol(),PERIOD_M1,m+1))); // Print("closing price is "+iClose(Symbol(),PERIOD_M1,m+1)); k=m+1; while(m>0) { if(iClose(Symbol(),PERIOD_M1,m) <= iOpen(Symbol(),PERIOD_M1,m) ) { if((iHigh(Symbol(),PERIOD_M1,m)>= (iClose(Symbol(),PERIOD_M1,k) + UsePoint*3))&&(iLow(Symbol(),PERIOD_M1,m)> (iClose(Symbol(),PERIOD_M1,k) - UsePoint*3))) { //Print("broke up at "+iHigh(Symbol(),PERIOD_M1,m)); Frequency[j]++; ListData[j][1]++; break; } else if((iLow(Symbol(),PERIOD_M1,m) <= (iClose(Symbol(),PERIOD_M1,k) - UsePoint*3))&&(iHigh(Symbol(),PERIOD_M1,m)< (iClose(Symbol(),PERIOD_M1,k) + UsePoint*3))) { //Print("broke dn at "+iLow(Symbol(),PERIOD_M1,m)); Frequency[j]++; ListData[j][0]++; break; } } else if(iClose(Symbol(),PERIOD_M1,m) >= iOpen(Symbol(),PERIOD_M1,m)) { if((iLow(Symbol(),PERIOD_M1,m) <= (iClose(Symbol(),PERIOD_M1,k) - UsePoint*3))&&(iHigh(Symbol(),PERIOD_M1,m)< (iClose(Symbol(),PERIOD_M1,k) + UsePoint*3))) { //Print("broke dn at "+iLow(Symbol(),PERIOD_M1,m)); Frequency[j]++; ListData[j][0]++; break; } else if((iHigh(Symbol(),PERIOD_M1,m)>= (iClose(Symbol(),PERIOD_M1,k) + UsePoint*3))&&(iLow(Symbol(),PERIOD_M1,m)> (iClose(Symbol(),PERIOD_M1,k) - UsePoint*3))) { //Print("broke up at "+iHigh(Symbol(),PERIOD_M1,m)); Frequency[j]++; ListData[j][1]++; break; } } m--; } } } i--; Print("i is: "+i); } /* for(j = 0; j<ArraySize(List); j++) { if(Frequency[j] > 0) { Print("Pattern "+List[j]+" happened "+Frequency[j]+"times and bup "+ListData[j][1]+" a bdn "+ListData[j][0]); } } Print("Frequency list"); for(i = 0; i < ArraySize(Frequency); i++) { Print("the string / Frequency / bup / bdn: "+List[i]+" and "+Frequency[i]+" / "+ListData[i][1]+" / "+ListData[i][0]); } */ for(i = 0; i < ArraySize(Frequency); i++) { double currentMax = Frequency[i]; string currentString = List[i]; int currentBDN = ListData[i][0]; int currentBUP = ListData[i][1]; int currentMaxIndex = i; for(j = i +1; j < ArraySize(Frequency); j++)//Find Max or next max in the list { if(currentMax < Frequency[j]) { currentMaxIndex = j; currentMax = Frequency[j]; currentString = List[j]; currentBDN = ListData[j][0]; currentBUP = ListData[j][1]; } } if(currentMaxIndex != i) { Frequency[currentMaxIndex] = Frequency[i]; Frequency[i] = currentMax; List[currentMaxIndex] = List[i]; List[i] = currentString; ListData[currentMaxIndex][0] = ListData[i][0]; ListData[currentMaxIndex][1] = ListData[i][1]; ListData[i][0] = currentBDN; ListData[i][1] = currentBUP; } } /* Print("descending sorted Frequency list"); for(i = 0; i < ArraySize(Frequency); i++) { Print("the string / Frequency / bup / bdn: "+List[i]+" and "+Frequency[i]+" / "+ListData[i][1]+" / "+ListData[i][0]); } */ /* Print("pattern Frequency Prob_up Prob_dn"); for(i = 0; i <ArraySize(Frequency); i++) { if(Frequency[i] != 0) { double bldu = ListData[i][1]; double bldd = ListData[i][0]; double f = Frequency[i]; double bup = (bldu/f); double bdn = (bldd/f); Print("Frequency: "+Frequency[i]+" ListData[i][1]: "+ListData[i][1]+" ListData[i][0]"+ListData[i][1]); Print(""+List[i]+" "+Frequency[i]+" "+bup+" "+bdn); } }*/ // int counted_bars = IndicatorCounted(); // i=Bars; // Print("Bars: "+Bars+" IndicatorCounted(): "+counted_bars); // if(counted_bars>i) i=Bars-counted_bars-1; LogInfo(); finished = true; //---- return(0);
Here is the rest of the code from the while loop on down. If I comment the while loop there is no freezing so I assume the problem lies within the while loop.
Let's say that the value of Bars is something like 60,000. The inner loop "while (m > 0)" is going to get executed lots of times, because the statement "m = (i+1)*60+TimeMinute(iTime(Symbol(),PERIOD_M1,(i+1)*60))" is going to assign a value around 3,600,000 to m if Bars is 60,000. On the next i loop, when i is decremented to 59,999, then the m loop is going to get executed another few million times. Therefore, if there is a five-figure number of bars on the chart, then the contents of the "while (m > 0)" loop are going to be executed billions of times in total.
Have you ruled out the fact that it just simply seems to be performing a very large number of calculations?
Let's say that the value of Bars is something like 60,000. The inner loop "while (m > 0)" is going to get executed lots of times, because the statement "m = (i+1)*60+TimeMinute(iTime(Symbol(),PERIOD_M1,(i+1)*60))" is going to assign a value around 3,600,000 to m if Bars is 60,000. On the next i loop, when i is decremented to 59,999, then the m loop is going to get executed another few million times. Therefore, if there is a five-figure number of bars on the chart, then the contents of the "while (m > 0)" loop are going to be executed billions of times in total.
Honestly I did not think that would be a problem because that big number is actually the index of the exact time for that particular hour. For instance if I am evaluating 10:00 on my server time, I want to see how far price moves by the minute so I find 10:00 for that particular date in the minute timeframe. what is max. It actually did work for i = 30000 but now it does not work for i = 9000.
Honestly I did not think that would be a problem because that big number is actually the index of the exact time for that particular hour. For instance if I am evaluating 10:00 on my server time, I want to see how far price moves by the minute so I find 10:00 for that particular date in the minute timeframe. what is max. It actually did work for i = 30000 but now it does not work for i = 9000.
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
You agree to website policy and terms of use
why does my code cause a memory leak. I coded it such that it will run the indicator on all the bars and then stop accepting future ticks.