[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

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/