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

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



PureBytes Links

Trading Reference Links


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@x...]
> 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.





------------------------ Yahoo! Groups Sponsor --------------------~--> 
What would our lives be like without music, dance, and theater?
Donate or volunteer in the arts today at Network for Good!
http://us.click.yahoo.com/Tcy2bD/SOnJAA/cosFAA/GHeqlB/TM
--------------------------------------------------------------------~-> 

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:
    http://docs.yahoo.com/info/terms/