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