
Range bars (see code)
| Open, High, Low, Close, Price |
Arrays with two elements of the corresponding price; f.i. Close[1] is the close price of the previous bar, and Close[0] is the most recent price. The prices of the current bar can be modified by the bar function. Price is the mean price and can be omitted when not used in the function. |
| Start | Optional start time of the bar in the OLE DATE format. Can be omitted when not used in the function. |
| Time | Optional time of the most recent tick or price quote. Can be omitted when not used in the function. |
var BarRange = 0.0030; // 0.3 cents bar range
// Range Bars, standard (high-low)
int bar(var* Open,var* High,var* Low,var* Close)
{
if(Open[0] != Close[1]) {
High[0] = max(Open[0],Close[1]);
Low[0] = min(Open[0],Close[1]);
Open[0] = Close[1];
}
if(High[0]-Low[0] >= BarRange)
return 1; // bar ends
return 4; // bar continues
}
// Renko Bars, standard
int bar(var* Open,var* High,var* Low,var* Close)
{
Open[0] = roundto(Close[1],BarRange);
if(Close[0]-Open[0] >= BarRange) {
Close[0] = Open[0]+BarRange;
High[0] = Close[0];
Low[0] = Open[0];
return 1;
}
if(Open[0]-Close[0] >= BarRange) {
Close[0] = Open[0]-BarRange;
High[0] = Open[0];
Low[0] = Close[0];
return 1;
}
return 4;
}
// Renko Bars with wicks
int bar(var* Open,var* High,var* Low,var* Close)
{
Open[0] = roundto(Close[1],BarRange);
if(Close[0]-Open[0] >= BarRange) {
Close[0] = Open[0]+BarRange;
return 1;
}
if(Close[0]-Open[0] <= -BarRange) {
Close[0] = Open[0]-BarRange;
return 1;
}
return 4;
}
// Renko Bars, variant
int bar(var* Open, var* High, var* Low, var* Close)
{
var OpenDiff = abs(Close[0]-Open[1]);
var CloseDiff = abs(Close[0]-Close[1]);
if(OpenDiff < CloseDiff) // we have a valley or peak
Open[0] = Open[1];
else // we are moving with the trend
Open[0] = roundto(Close[1],BarRange);
if(Close[0]-Open[0] >= BarRange) { // going up
Close[0] = Open[0]+BarRange;
High[0] = Close[0];
Low[0] = Open[0];
return 1;
}
if(Open[0]-Close[0] >= BarRange) { // going down
Close[0] = Open[0]-BarRange;
High[0] = Open[0];
Low[0] = Close[0];
return 1;
}
return 4;
}
// Mean Renko Bars
int bar(var* Open, var* High, var* Low, var* Close)
{
Open[0] = 0.5*(Close[1]+Open[1]);
if(Close[0] <= Open[0] - BarRange) {
Close[0] = Open[0] - BarRange;
return 1;
} else if(Close[0] >= Open[0] + BarRange) {
Close[0] = Open[0] + BarRange;
return 1;
}
return 4;
}
// Haiken Ashi Bars
int bar(var* Open,var* High,var* Low,var* Close)
{
Close[0] = (Open[0]+High[0]+Low[0]+Close[0])/4;
Open[0] = (Open[1]+Close[1])/2;
High[0] = max(High[0],max(Open[0],Close[0]));
Low[0] = min(Low[0],min(Open[0],Close[0]));
return 8;
}
// Point-and-Figure Bars
int bar(var* Open,var* High,var* Low,var* Close)
{
static int direction = 0;
if(direction == 1 && High[0]-Close[0] >= BarRange) {
Open[0] = round(Low[0],BarRange);
Close[0] = round(High[0],BarRange);
Low[0] = Open[0];
High[0] = Close[0];
direction = 0;
return 1;
}
if(direction == 0 && Close[0]-Low[0] >= BarRange) {
Open[0] = round(High[0],BarRange);
Close[0] = round(Low[0],BarRange);
High[0] = Open[0];
Low[0] = Close[0];
direction = 1;
return 1;
}
return 4;
}
// Point-and-Line Bars
int bar(var *Open,var *High,var *Low,var *Close)
{
static int gDir = -1; // initially down
static var gCF = C, gCR = C;
var Percentage = 1;
int gReverse = 3; // 3 boxes for reversal
// box size = percentage of price
var Box = Close[0]*Percentage/100;
var CF = ceil(Close[0]/Box)*Box;
var CR = floor(Close[0]/Box)*Box;
if(CF < gCF && gDir < 0) {
gCR = CF-Box; gCF = CF;
return 1; // continue down
}
if(gCF+Box*gReverse <= CR && gDir < 0) {
gCR = CR; gCF = CR+Box;
gDir = 1; return 1; // go up
}
if(gCR < CR && gDir > 0) {
gCR = CR; gCF = CR+Box;
return 1;
}
if(gCR-Box*gReverse >= CF && gDir > 0) {
gCF = CF; gCR = CF-Box;
gDir = -1; return 1;
}
return 4; // keep bar open, call again on next tick
}