0% found this document useful (0 votes)
132 views

2 Afl

This document describes an algorithm for automatically identifying pivot points in stock price data. It uses a series of arrays and variables to track high and low values over a lookback period, identify trend changes, and mark pivot points. The algorithm loops through historical bars, compares highs and lows to the previous bars, and flags pivots when the trend changes from up to down or vice versa. It also includes additional logic to potentially identify missing pivots. Finally, it plots the identified pivot points on a candlestick chart using arrows.

Uploaded by

NishaMehta
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
132 views

2 Afl

This document describes an algorithm for automatically identifying pivot points in stock price data. It uses a series of arrays and variables to track high and low values over a lookback period, identify trend changes, and mark pivot points. The algorithm loops through historical bars, compares highs and lows to the previous bars, and flags pivots when the trend changes from up to down or vice versa. It also includes additional logic to potentially identify missing pivots. Finally, it plots the identified pivot points on a candlestick chart using arrows.

Uploaded by

NishaMehta
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 12

_SECTION_BEGIN("Pivot Finder");

//------------------------------------------------------------------------------
//
// Formula Name: Pivot Finder
// Author/Uploader: Mark
// E-mail:
// Date/Time Added: 2004-07-19 01:06:36
// Origin: This has got to be one of the best pivot finders I have fou
nd yet. Nobody knows the author who wrote it.... Whoever you are thanks a bunch
!!
// Keywords:
// Level: semi-advanced
// Flags: indicator
// Formula URL: http://www.amibroker.com/library/formula.php?id=359
// Details URL: http://www.amibroker.com/library/detail.php?id=359
//
//------------------------------------------------------------------------------
//
// /* **********************************
//
// 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);
//
//------------------------------------------------------------------------------
/* **********************************
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);

_SECTION_END();
_SECTION_BEGIN("StochRSI");
SetChartOptions(0,0,chartGrid20|chartGrid80);
Periods = Param( "Periods", 10, 1, 50, 1 );
StochRSIstyle = ParamStyle("Style", styleLine );
StochRSI=(Sum(RSI(Periods)-LLV(RSI(Periods),Periods),3)/Sum(HHV(RSI(Periods),Per
iods)-LLV(RSI(Periods),Periods),3))*100;
StochRSIcolor = IIf( StochRSI > Ref(StochRSI,-1), ParamColor("Up Color", colorGr
een ), ParamColor("Down Color", colorRed ));
Plot( StochRSI, _DEFAULT_NAME(), StochRSIcolor, StochRSIstyle );
_SECTION_END();
_SECTION_BEGIN("Automatic Trend");
x = Cum(1);
perchg = 0.3*LastValue( Highest( ROC( Low, 50 ) ));
startvalue = LastValue( Trough( Low, perchg, 1 ) );
endvalue1 = LastValue( Trough( Low, perchg, 2 ) );
startbar = LastValue( ValueWhen( Low == startvalue, x, 1 ) );
endbar = LastValue( ValueWhen( Low == endvalue1, x, 1 ) );
Aa = (endvalue1-startvalue)/(endbar-startbar);
b = startvalue;
trendline = Aa * ( x - startbar ) + b;
Plot( Close, "Price", colorBlue, styleCandle );
Plot( IIf( x >= endbar, trendline, Null ), "Trendline", colorRed );
_SECTION_END();

You might also like