Very Accurate Modified Bollinger bands


Very Accurate Modified Bollinger bands
Very Accurate Modified Bollinger bands

//www.aflcode.com


_SECTION_BEGIN("Price 396");
SetChartBkColor(colorGrey50);

_N(Title = StrFormat("{{NAME}} - {{INTERVAL}} {{DATE}} Open %g, Hi %g, Lo %g, Close %g (%.1f%%){{VALUES}}",
O, H, L, C, SelectedValue( ROC( C, 1 ) ) ));

SelPds = ParamList("Periods:", "34,55,89,144",0);

if( SelPds == "34" ) Pds= 34;
if( SelPds == "55" ) Pds= 55;

Middle = EMA(C,pds);

Himid = EMA(H,Pds);
Lomid = EMA(L,Pds);

UpperBand = Middle + 3.5 * ATR(Pds);
UpperBand1 = Middle + 1.75 * ATR(Pds);
LowerBand = Middle - 3.5 * ATR(Pds);
LowerBand1 = Middle - 1.75 * ATR(Pds);

Plot(C,"",colorBlack,styleCandle);

Plot(Middle, "Middle",colorCustom12,styleThick);
Plot(Himid, "",colorCustom12,styleDashed);
Plot(Lomid, "",colorCustom12,styleDashed);
Plot(UpperBand, "Upper",colorGold,styleThick);
Plot(UpperBand1, "",colorGold,styleDashed);
Plot(LowerBand, "Lower",colorGold,styleThick);
Plot(LowerBand1, "",colorGold,styleDashed);
PlotOHLC(Lomid,Himid,Lomid,Himid,"",ColorRGB(230,200,200),styleCloud | styleNoLabel);
_SECTION_END();

_SECTION_BEGIN("Price 3150");
//  /* **********************************
//
//  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);
 

Previous
Next Post »