Booker, Your crossover example would be a future leak only if you made use of the fact at bar X that a crossover did or did not happen at some later point, say bar X + Y.
It's not so much an issue of having used a loop to gather the information. But rather, that the information gathered is being used at a point prior to when the information would otherwise have been available. It's just as bad to call LastValue(...) and then use that value earlier than the last bar. Mike --- In [email protected], "booker_1324" <booker_1...@...> wrote: > > Mike, > > First I want to thank you for your detailed answer and all the help you have > given me. > > I think that I understand what you are saying but I will have to ponder it > some more. I gather that the loop is the culprit by allowing the highs and > lows to gather information. > > So am I correct in saying that even a simple moving average crossover would > not have a future leak, but if I included the crossover in a loop and > identified all the crossovers it would then be considered a leak and > backtesting should be forbidden? > > Again thank you very much for your help and I look forward to reading more of > your informative posts. > > Sorry to drag this thread out, but it was well worth it to me. :) > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > Booker, > > > > Sounds like the code is fine for your intended usage (i.e. dynamically > > changing chart for reference during live trading, with the understanding > > that the labels will jump around as new data comes in). > > > > AmiBroker's check for future leaks is limited. It cannot possibly analyze > > all your logic to see how values are being used. > > > > The reason that it's a future leak, and thus cannot be backtested in its > > current form, is that you have looked all the way to the last bar and > > produced some statistics (i.e. number of highs, lows) based on the > > information found in those bars. > > > > You then proceed to use those statistics at earlier bars (i.e. starting > > loop over again) where the computed statistics could not possibly have been > > known had it not been for the fact that you were able to look ahead. > > > > Bar indexes in AmiBroker start at 0. The index of each subsequent bar is > > increased by one. A bar's index never changes. Bar 5 will always be bar 5, > > then, now and in the future. > > > > With that in mind, and using your example; 495 trading days ago, when the > > current bar was then 5, you would not have been able to count forward to > > bar 500 (it didn't exist yet). Thus, today, at bar 500, you must not use > > bar 500 info when backtesting bar 5. > > > > Your code has a value for highs and for lows. Any reference to these > > values, in the context of any bar before the last bar, is a future leak. > > > > Backtesting implies entry/exit rules. So, for example, if your code had a > > Buy rule at HH3. You would have two problems: > > > > 1. The code would never backtest the same way twice since new bars would > > cause changing location of HH3. > > 2. HH3 can only be determined by looking forward to see where HH1 and HH2 > > are, which can not be done in real life. > > > > In summary; For any given bar, you must not use any values that were > > calculated from bars that came after the given bar. To do so is to > > introduce a future leak. Future leaks are fine for charting. They are > > dangerous for backtesting. > > > > Mike > > > > --- In [email protected], "booker_1324" <booker_1324@> wrote: > > > > > > What I am trying to do is use the last 3 or 4 of the highs and lows along > > > with BarsSince of the last low to produce a pattern for trading, and yes > > > I need for the highs and lows to change accordingly as price and time > > > changes. > > > > > > I fail to see the relevance of bar 5 if today's bar is 500 to determine a > > > future leak as I am only using the last 3 or 4 of the highs and lows for > > > a pattern. > > > > > > The code that I have now does not report a future leak in Code Check so I > > > will proceed with using Scan and Expore to aid in RT as the pattern > > > develops. > > > > > > I had not planned on backtesting but since you brought it up; I would > > > like to know why using a limited number of bars to fit a pattern of highs > > > and lows can be a future leak. I thought I knew what a future leak is but > > > I am not so sure anymore. If this pattern showed up on bar 5, it would > > > have to be back in time and was probably bar 500 at that time. As time > > > progressed and it became bar 5 then I would be looking at bar 500 now and > > > it would not be relevant to the pattern. So I would be grateful if > > > someone would take the time to explain it to me. > > > > > > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > > > "Using the value of highs" for what? > > > > > > > > If all you want to do is chart, then go for it. The chart will look > > > > fine. It just won't look the same! It will constantly update as new > > > > bars come in. > > > > > > > > If you want to use it for discretionary trading *with the > > > > understanding* that the signals you're trading will get revised as more > > > > data comes in. Fine. > > > > > > > > But, if you want to run a backtest, you cannot use the values. Full > > > > stop. No way around it. > > > > > > > > If at any bar you find yourself making use of information based upon > > > > later bars, then you've got a future leak and your implementation is > > > > only good for charting. It cannot be traded, and any backtest would be > > > > meaningless. > > > > > > > > For example; At bar 5 you *cannot* be allowed to know that the last > > > > swing high takes place on bar 500. So, yes, I see something wrong with > > > > using the values after the loop. > > > > > > > > Finally, using BarsSince is fine. Just so long as you don't reference > > > > any of its values beyond the current bar. > > > > > > > > Mike > > > > > > > > --- In [email protected], "booker_1324" <booker_1324@> wrote: > > > > > > > > > > Hi Mike, > > > > > > > > > > Using your code > > > > > > > > > > ... > > > > > if (bigHigh[bar]) { > > > > > lookingForHigh = false; // now looking for low > > > > > PlotText("HH" + highs, bar, High[bar], colorGreen); > > > > > highs++; > > > > > } > > > > > ... > > > > > > > > > > Do you see anything wrong with using the value of highs after the loop > > > > > as the last swing high and (highs -1) as the second to last swing > > > > > high and > > > > > (highs -2) as the third last swing high and doing the same with lows? > > > > > > > > > > Also, is it feasible to use BarsSince(low)? > > > > > > > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > > > > > > > Sure, just initialize a variable to track the number of highs then > > > > > > use PlotText to write out the count. Do the same for lows. > > > > > > > > > > > > e.g. (untested) > > > > > > > > > > > > highs = 1; > > > > > > > > > > > > ... > > > > > > if (bigHigh[bar]) { > > > > > > lookingForHigh = false; // now looking for low > > > > > > PlotText("HH" + highs, bar, High[bar], colorGreen); > > > > > > highs++; > > > > > > } > > > > > > ... > > > > > > > > > > > > Mike > > > > > > > > > > > > --- In [email protected], "booker_1324" <booker_1324@> > > > > > > wrote: > > > > > > > > > > > > > > Nice code Mike, to take this a step farther, is it posible to > > > > > > > attach a label to each HHV and LLV such as HH1, HH2, HH3, LL1, > > > > > > > LL2, and LL3 without referencing future quotes? > > > > > > > > > > > > > > --- In [email protected], "Mike" <sfclimbers@> wrote: > > > > > > > > > > > > > > > > What makes you think that you are changing the step size? From > > > > > > > > what I see, you're still advancing a single bar at a time. > > > > > > > > > > > > > > > > bigHigh = high >Ref (hhv(high,50),-1); > > > > > > > > smallLow = low < Ref (llv(low,50),-1); > > > > > > > > lookingForHigh = true; > > > > > > > > > > > > > > > > for (bar = 0; bar < BarCount; bar++) { > > > > > > > > if (lookingForHigh) { > > > > > > > > if (bigHigh[bar]) { > > > > > > > > lookingForHigh = false; // now looking for low > > > > > > > > } > > > > > > > > } else { > > > > > > > > if (smallLow[bar]) { > > > > > > > > lookingForHigh = true; > > > > > > > > } > > > > > > > > } > > > > > > > > } > > > > > > > > > > > > > > > > Mike > > > > > > > > > > > > > > > > --- In [email protected], "Markus Witzler" <funnybiz@> > > > > > > > > wrote: > > > > > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > > > > > I wonder if I can step thru a loop where the step size is > > > > > > > > > being computed WITHIN the loop. > > > > > > > > > > > > > > > > > > An example: > > > > > > > > > > > > > > > > > > I want the loop to check for every bar until high >Ref > > > > > > > > > (hhv(high,50),-1). > > > > > > > > > > > > > > > > > > From THAT bar on, the loop should check if low < Ref > > > > > > > > > (llv(low,50),-1) occured. > > > > > > > > > > > > > > > > > > Say, the first condition is true on bar 50, the loop should > > > > > > > > > afterwards start to check for the second ccondition from bar > > > > > > > > > 51 until that condition is fullfilled, say on bar 80. > > > > > > > > > > > > > > > > > > From THAT bar on, it again should check for the first > > > > > > > > > condition etc. > > > > > > > > > > > > > > > > > > The thing is that I can“t tell the loop the step size in > > > > > > > > > ADVANCE and it may differ over the whole data range, > > > > > > > > > depending on WHEN the condition beign checked for is true. > > > > > > > > > > > > > > > > > > Any ideas on this? > > > > > > > > > > > > > > > > > > Thanks > > > > > > > > > > > > > > > > > > Markus > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
