[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [amibroker] Re: AFL code that is too good to be true



PureBytes Links

Trading Reference Links

I understood you didn't write the code Ed... I ran the indicator and it gives nice identification of peaks.
 
The code I pre-fixed does not 'correct' any look forward problems but it does allow you to set bars, starting from the end of your chart, to NULL. If, when you do this, preceeding bars change that this reveals that those bars were using data from the bar you nulled, i.e. it was looking forward in time. This of course limits the code's application to research only, it would probably not be very useful in trading systems
 
best regards,
herman
 
 
-----Original Message-----
From: Ed [mailto:vvsignin@xxxxxxxxx]
Sent: Sunday, January 30, 2005 5:58 PM
To: amibroker@xxxxxxxxxxxxxxx
Subject: [amibroker] Re: AFL code that is too good to be true


Hermann,

Thank you for responding. This is not my code, I just found it on AFL
and I'm looking for those who have utilized this code for a while to
see what their experiences have been. I'm interested though in your
commentary about problems with future code. What does the code you
added in intend to do to correct future problems? Thanks.

Ed

--- In amibroker@xxxxxxxxxxxxxxx, "Herman van den Bergen"
<psytek@xxxx> wrote:
> Hello Ed,
>
> Correct me if i am wrong...but I think the code looks ahead, if you
remove
> bars from the end of your data then when the Red arrow drops away
the
> preceeding Green arrow may also disappear. This mean the Green
Arrow depends
> (at least some of the time) on future data.
>
> Just place the code below ahead of the code and gradually remove
bars from
> the end of your chart to check for look ahead problems. If the
display
> changes ahead of the last bar your code looks ahead.
>
> Z = Null;
> LB =LastValue(BarIndex());
> RM = Param("RemoveBars",0,0,1000,1);
> O = IIf(BarIndex()>(LB-RM),Z,O);
> H = IIf(BarIndex()>(LB-RM),Z,H);
> L = IIf(BarIndex()>(LB-RM),Z,L);
> C = IIf(BarIndex()>(LB-RM),Z,C);
>
> best regards,
> herman
>
> -----Original Message-----
> From: Ed [mailto:vvsignin@xxxx]
> Sent: Sunday, January 30, 2005 4:43 PM
> To: amibroker@xxxxxxxxxxxxxxx
> Subject: [amibroker] AFL code that is too good to be true
>
>
>
> Has anyone looked at this pivot finder? I found it in the AFL
library
> and just from eyeballing these signals they are rediculously good,
> almost too good. I just want to see others' experiences with this
> code:
>
> Details:
> Formula name: Pivot Finder
> Author/Uploader: Mark - (email hidden)
> Date/Time added: 2004-07-19 01:06:36
> Origin: This has got to be one of the best pivot finders I have
found
> yet. Nobody knows the author who wrote it.... Whoever you are thanks
> a bunch!!
> Keywords:
> Level: semi-advanced
> Flags: indicator
>
> DISCLAIMER: Most formulas present in AFL on-line library are
> submitted by the users and are provided here on an "as is" and "as
> available" basis. AmiBroker.com makes no representations or
> warranties of any kind to the contents or the operation of material
> presented here. We do not maintain nor provide technical support for
> 3rd party formulas.
>
> Download formula file  |  Delete formula
>
> Description:
> /* **********************************
>
> Code to automatically identify pivots
>
> ********************************** */
>
> // -- what will be our lookback range for the hh and ll?
> farback=Param("How Far back to go",100,50,5000,10);
> nBars = Param("Number of bars", 12, 5, 40);
>
> // -- Title.
>
> Title = Name() + " (" + StrLeft(FullName(), 15) + ") O: " + Open
+ ",
>
> H: " + High + ", L: " + Low + ", C: " + Close;
>
> // -- Plot basic candle chart
>
> PlotOHLC(Open, High, Low, Close,
>
> "BIdx = " + BarIndex() +
>
> "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L = " + L
>
> + "\n"+"C ",
>
> colorBlack, styleCandle);
>
> GraphXSpace=7;
>
> // -- Create 0-initialized arrays the size of barcount
>
> aHPivs = H - H;
>
> aLPivs = L - L;
>
> // -- More for future use, not necessary for basic plotting
>
> aHPivHighs = H - H;
>
> aLPivLows = L - L;
>
> aHPivIdxs = H - H;
>
> aLPivIdxs = L - L;
>
> nHPivs = 0;
>
> nLPivs = 0;
>
> lastHPIdx = 0;
>
> lastLPIdx = 0;
>
> lastHPH = 0;
>
> lastLPL = 0;
>
> curPivBarIdx = 0;
>
> // -- looking back from the current bar, how many bars
>
> // back were the hhv and llv values of the previous
>
> // n bars, etc.?
>
> aHHVBars = HHVBars(H, nBars);
>
> aLLVBars = LLVBars(L, nBars);
>
> aHHV = HHV(H, nBars);
>
> aLLV = LLV(L, nBars);
>
> // -- Would like to set this up so pivots are calculated back from
>
> // last visible bar to make it easy to "go back" and see the pivots
>
> // this code would find. However, the first instance of
>
> // _Trace output will show a value of 0
>
> aVisBars = Status("barvisible");
>
> nLastVisBar = LastValue(Highest(IIf(aVisBars, BarIndex(), 0)));
>
> _TRACE("Last visible bar: " + nLastVisBar);
>
> // -- Initialize value of curTrend
>
> curBar = (BarCount-1);
>
> curTrend = "";
>
> if (aLLVBars[curBar] <
>
> aHHVBars[curBar]) {
>
> curTrend = "D";
>
> }
>
> else {
>
> curTrend = "U";
>
> }
>
> // -- Loop through bars. Search for
>
> // entirely array-based approach
>
> // in future version
>
> for (i=0; i<farback; i++) {
>
> curBar = (BarCount - 1) - i;
>
> // -- Have we identified a pivot? If trend is down...
>
> if (aLLVBars[curBar] < aHHVBars[curBar]) {
>
> // ... and had been up, this is a trend change
>
> if (curTrend == "U") {
>
> curTrend = "D";
>
> // -- Capture pivot information
>
> curPivBarIdx = curBar - aLLVBars[curBar];
>
> aLPivs[curPivBarIdx] = 1;
>
> aLPivLows[nLPivs] = L[curPivBarIdx];
>
> aLPivIdxs[nLPivs] = curPivBarIdx;
>
> nLPivs++;
>
> }
>
> // -- or current trend is up
>
> } else {
>
> if (curTrend == "D") {
>
> curTrend = "U";
>
> curPivBarIdx = curBar - aHHVBars[curBar];
>
> aHPivs[curPivBarIdx] = 1;
>
> aHPivHighs[nHPivs] = H[curPivBarIdx];
>
> aHPivIdxs[nHPivs] = curPivBarIdx;
>
> nHPivs++;
>
> }
>
> // -- If curTrend is up...else...
>
> }
>
> // -- loop through bars
>
> }
>
> // -- Basic attempt to add a pivot this logic may have missed
>
> // -- OK, now I want to look at last two pivots. If the most
>
> // recent low pivot is after the last high, I could
>
> // still have a high pivot that I didn't catch
>
> // -- Start at last bar
>
> curBar = (BarCount-1);
>
> candIdx = 0;
>
> candPrc = 0;
>
> lastLPIdx = aLPivIdxs[0];
>
> lastLPL = aLPivLows[0];
>
> lastHPIdx = aHPivIdxs[0];
>
> lastHPH = aHPivHighs[0];
>
> if (lastLPIdx > lastHPIdx) {
>
> // -- Bar and price info for candidate pivot
>
> candIdx = curBar - aHHVBars[curBar];
>
> candPrc = aHHV[curBar];
>
> if (
>
> lastHPH < candPrc AND
>
> candIdx > lastLPIdx AND
>
> candIdx < curBar) {
>
>
> // -- OK, we'll add this as a pivot...
>
> aHPivs[candIdx] = 1;
>
> // ...and then rearrange elements in the
>
> // pivot information arrays
>
> for (j=0; j<nHPivs; j++) {
>
> aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-
>
> (j+1)];
>
> aHPivIdxs[nHPivs-j] = aHPivIdxs[nHPivs-(j+1)];
>
> }
>
> aHPivHighs[0] = candPrc ;
>
> aHPivIdxs[0] = candIdx;
>
> nHPivs++;
>
> }
>
> } else {
>
>
> // -- Bar and price info for candidate pivot
>
> candIdx = curBar - aLLVBars[curBar];
>
> candPrc = aLLV[curBar];
>
> if (
>
> lastLPL > candPrc AND
>
> candIdx > lastHPIdx AND
>
> candIdx < curBar) {
>
>
> // -- OK, we'll add this as a pivot...
>
> aLPivs[candIdx] = 1;
>
> // ...and then rearrange elements in the
>
> // pivot information arrays
>
> for (j=0; j<nLPivs; j++) {
>
> aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
>
> aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
>
> }
>
> aLPivLows[0] = candPrc;
>
> aLPivIdxs[0] = candIdx;
>
> nLPivs++;
>
> }
>
> }
>
> // -- Dump inventory of high pivots for debugging
>
> /*
>
> for (k=0; k<nHPivs; k++) {
>
> _TRACE("High pivot no. " + k
>
> + " at barindex: " + aHPivIdxs[k] + ", "
>
> + WriteVal(ValueWhen(BarIndex()==aHPivIdxs[k],
>
> DateTime(), 1), formatDateTime)
>
> + ", " + aHPivHighs[k]);
>
> }
>
> */
>
> // -- OK, let's plot the pivots using arrows
>
> PlotShapes(
>
> IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, 0,
>
> High, Offset=-15);
>
> PlotShapes(
>
> IIf(aLPivs==1, shapeUpArrow , shapeNone), colorGreen, 0,
>
> Low, Offset=-15);
>
>
> Formula:
>   /* **********************************
>
> Code to automatically identify pivots
>
> ********************************** */
>
> // -- what will be our lookback range for the hh and ll?
> farback=Param("How Far back to go",100,50,5000,10);
> nBars = Param("Number of bars", 12, 5, 40);
>
> // -- Title.
>
> Title = Name() + " (" + StrLeft(FullName(), 15) + ") O: " + Open
+ ",
>
> H: " + High + ", L: " + Low + ", C: " + Close;
>
> // -- Plot basic candle chart
>
> PlotOHLC(Open, High, Low, Close,
>
> "BIdx = " + BarIndex() +
>
> "\n" + "O = " + O + "\n"+"H = "+ H + "\n"+"L = " + L
>
> + "\n"+"C ",
>
> colorBlack, styleCandle);
>
> GraphXSpace=7;
>
> // -- Create 0-initialized arrays the size of barcount
>
> aHPivs = H - H;
>
> aLPivs = L - L;
>
> // -- More for future use, not necessary for basic plotting
>
> aHPivHighs = H - H;
>
> aLPivLows = L - L;
>
> aHPivIdxs = H - H;
>
> aLPivIdxs = L - L;
>
> nHPivs = 0;
>
> nLPivs = 0;
>
> lastHPIdx = 0;
>
> lastLPIdx = 0;
>
> lastHPH = 0;
>
> lastLPL = 0;
>
> curPivBarIdx = 0;
>
> // -- looking back from the current bar, how many bars
>
> // back were the hhv and llv values of the previous
>
> // n bars, etc.?
>
> aHHVBars = HHVBars(H, nBars);
>
> aLLVBars = LLVBars(L, nBars);
>
> aHHV = HHV(H, nBars);
>
> aLLV = LLV(L, nBars);
>
> // -- Would like to set this up so pivots are calculated back from
>
> // last visible bar to make it easy to "go back" and see the pivots
>
> // this code would find. However, the first instance of
>
> // _Trace output will show a value of 0
>
> aVisBars = Status("barvisible");
>
> nLastVisBar = LastValue(Highest(IIf(aVisBars, BarIndex(), 0)));
>
> _TRACE("Last visible bar: " + nLastVisBar);
>
> // -- Initialize value of curTrend
>
> curBar = (BarCount-1);
>
> curTrend = "";
>
> if (aLLVBars[curBar] <
>
> aHHVBars[curBar]) {
>
> curTrend = "D";
>
> }
>
> else {
>
> curTrend = "U";
>
> }
>
> // -- Loop through bars. Search for
>
> // entirely array-based approach
>
> // in future version
>
> for (i=0; i<farback; i++) {
>
> curBar = (BarCount - 1) - i;
>
> // -- Have we identified a pivot? If trend is down...
>
> if (aLLVBars[curBar] < aHHVBars[curBar]) {
>
> // ... and had been up, this is a trend change
>
> if (curTrend == "U") {
>
> curTrend = "D";
>
> // -- Capture pivot information
>
> curPivBarIdx = curBar - aLLVBars[curBar];
>
> aLPivs[curPivBarIdx] = 1;
>
> aLPivLows[nLPivs] = L[curPivBarIdx];
>
> aLPivIdxs[nLPivs] = curPivBarIdx;
>
> nLPivs++;
>
> }
>
> // -- or current trend is up
>
> } else {
>
> if (curTrend == "D") {
>
> curTrend = "U";
>
> curPivBarIdx = curBar - aHHVBars[curBar];
>
> aHPivs[curPivBarIdx] = 1;
>
> aHPivHighs[nHPivs] = H[curPivBarIdx];
>
> aHPivIdxs[nHPivs] = curPivBarIdx;
>
> nHPivs++;
>
> }
>
> // -- If curTrend is up...else...
>
> }
>
> // -- loop through bars
>
> }
>
> // -- Basic attempt to add a pivot this logic may have missed
>
> // -- OK, now I want to look at last two pivots. If the most
>
> // recent low pivot is after the last high, I could
>
> // still have a high pivot that I didn't catch
>
> // -- Start at last bar
>
> curBar = (BarCount-1);
>
> candIdx = 0;
>
> candPrc = 0;
>
> lastLPIdx = aLPivIdxs[0];
>
> lastLPL = aLPivLows[0];
>
> lastHPIdx = aHPivIdxs[0];
>
> lastHPH = aHPivHighs[0];
>
> if (lastLPIdx > lastHPIdx) {
>
> // -- Bar and price info for candidate pivot
>
> candIdx = curBar - aHHVBars[curBar];
>
> candPrc = aHHV[curBar];
>
> if (
>
> lastHPH < candPrc AND
>
> candIdx > lastLPIdx AND
>
> candIdx < curBar) {
>
>
> // -- OK, we'll add this as a pivot...
>
> aHPivs[candIdx] = 1;
>
> // ...and then rearrange elements in the
>
> // pivot information arrays
>
> for (j=0; j<nHPivs; j++) {
>
> aHPivHighs[nHPivs-j] = aHPivHighs[nHPivs-
>
> (j+1)];
>
> aHPivIdxs[nHPivs-j] = aHPivIdxs[nHPivs-(j+1)];
>
> }
>
> aHPivHighs[0] = candPrc ;
>
> aHPivIdxs[0] = candIdx;
>
> nHPivs++;
>
> }
>
> } else {
>
>
> // -- Bar and price info for candidate pivot
>
> candIdx = curBar - aLLVBars[curBar];
>
> candPrc = aLLV[curBar];
>
> if (
>
> lastLPL > candPrc AND
>
> candIdx > lastHPIdx AND
>
> candIdx < curBar) {
>
>
> // -- OK, we'll add this as a pivot...
>
> aLPivs[candIdx] = 1;
>
> // ...and then rearrange elements in the
>
> // pivot information arrays
>
> for (j=0; j<nLPivs; j++) {
>
> aLPivLows[nLPivs-j] = aLPivLows[nLPivs-(j+1)];
>
> aLPivIdxs[nLPivs-j] = aLPivIdxs[nLPivs-(j+1)];
>
> }
>
> aLPivLows[0] = candPrc;
>
> aLPivIdxs[0] = candIdx;
>
> nLPivs++;
>
> }
>
> }
>
> // -- Dump inventory of high pivots for debugging
>
> /*
>
> for (k=0; k<nHPivs; k++) {
>
> _TRACE("High pivot no. " + k
>
> + " at barindex: " + aHPivIdxs[k] + ", "
>
> + WriteVal(ValueWhen(BarIndex()==aHPivIdxs[k],
>
> DateTime(), 1), formatDateTime)
>
> + ", " + aHPivHighs[k]);
>
> }
>
> */
>
> // -- OK, let's plot the pivots using arrows
>
> PlotShapes(
>
> IIf(aHPivs==1, shapeDownArrow, shapeNone), colorRed, 0,
>
> High, Offset=-15);
>
> PlotShapes(
>
> IIf(aLPivs==1, shapeUpArrow , shapeNone), colorGreen, 0,
>
> Low, Offset=-15);
>
>
>
>
>
>
>
> Check AmiBroker web page at:
> http://www.amibroker.com/
>
> Check group FAQ at:
> http://groups.yahoo.com/group/amibroker/files/groupfaq.html
>
>
>
>
> Yahoo! Groups Links
>
> To visit your group on the web, go to:
> http://groups.yahoo.com/group/amibroker/
>
> To unsubscribe from this group, send an email to:
> amibroker-unsubscribe@xxxxxxxxxxxxxxx
>
> Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service.





Check AmiBroker web page at:
http://www.amibroker.com/

Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html




Check AmiBroker web page at:
http://www.amibroker.com/

Check group FAQ at: http://groups.yahoo.com/group/amibroker/files/groupfaq.html




Yahoo! Groups Links