[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

Herman,

Now I understand why you have so much time to answer everyones questions. You must own the whole planet by now if your system is a bit better than this one ;-)

Terry

Herman van den Bergen wrote:
Ed, I tested it but it is not quite as good as my own trading system ;-)

just add:

Sell = aHPivs==1;
Buy = aLPivs==1;
Short =Sell;
Cover=Buy;

to the end of the code. The result kind-of confirms the look ahead problem:
147639412554536.28 % in six months.
best regards,
herman



-----Original Message-----
From: Ed [mailto:vvsignin@xxxxxxxxx]
Sent: Sunday, January 30, 2005 7:12 PM
To: amibroker@xxxxxxxxxxxxxxx
Subject: [amibroker] Re: AFL code that is too good to be true



Herman,

Would you happen to know how to actually run a backtest from these
signals? I keep running into trouble when I insert buy/sell
statements into the Auto Analyzer. Thanks.

Ed

--- In amibroker@xxxxxxxxxxxxxxx, "Herman van den Bergen"
<psytek@xxxx> wrote:
  
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@x...]
  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@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.
  



  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

    a.. To visit your group on the web, go to:
    http://groups.yahoo.com/group/amibroker/

    b.. To unsubscribe from this group, send an email to:
    amibroker-unsubscribe@xxxxxxxxxxxxxxx

    c.. 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




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/
 





  


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