Issue 2/2000
AmiBroker Tips weekly newsletter.
Issue 2/2000.
Copyright (C)2000 Tomasz Janeczko.
All back issues available from:
1 Welcome
2 AFL Formula Library: DeMarker and Range Expansion Index
3 Tip of the week: Using graph styles, colors and titles in Indicator Builder
1 Welcome

Welcome to the second issue of AmiBroker Tips newsletter. With this release a new regular column will start: "AFL Formula Library". In this column I will present new AFL formulas for indicators, trading systems and commentaries. All formulas presented in this column will also appear in

By the way: Do you find this newsletter useful? Have any comments/suggestions or article ideas. Please don't hesitate to drop a line to

2 AFL Formula Library: DeMarker and Range Expansion Index


The DeMarker indicator is an attempt to overcome the shortcomings of classical overbought / oversold indicators. The DeMarker Indicator identifies potential price bottoms and tops. It accomplishes this by making price comparisons from one bar to the next and measuring the level of price demand. The formula for DeMarker is quite simple - in AFL it looks like this:

** Tom Demark's DeMarker Indicator
** AFL Implementation by Tomasz Janeczko

highm = IIF( H > Ref( H, -1 ), H - Ref( H, - 1), 0 );
lowm = IIF( L < Ref( L, -1 ), Ref( L, - 1 ) - L, 0 );

DeMarker = 100 * Sum( highm, 13 )/( Sum( lowm, 13 ) + Sum( highm, 13 ) );

graph0 = DeMarker;

DeMarker should be interpreted as other overbought / oversold indicators such as RSI with the levels of 30 and 70. Compared to RSI it is smoother but still able to detect tops and bottoms a little bit better.

Range Expansion Index

The DeMark Range Expansion Index is a market-timing oscillator described in DeMark on Day Trading Options, by T.R. DeMark and T.R. Demark, Jr., McGraw Hill, 1999. The oscillator is arithmetically calculated and is designed to overcome problems with exponentially calculated oscillators, like MACD. The TD REI oscillator typically produces values of -100 to +100 with 45 or higher indicating overbought conditions and -45 or lower indicating oversold. Here is how Tom DeMark describes the calculation of Range Expansion Index:

"The first step in calculating the REI is to add together the respective differences between the current day's high and the high two days earlier and the current day's low and the low two days earlier. These values will be positive or negative depending on whether the current day's high and low are greater or less than the high and low two days earlier. To prevent buying or selling prematurely into a steep price decline or advance, two additional conditions should be met to qualify a positive or negative value on a particular day: 1) either the high two days earlier must be greater than or equal to the close seven or eight days ago, or the current day's high must be greater than or equal to the low five or six days ago; 2) either the low two days earlier must be less than or equal to the close seven or eight days ago, or the current day's low must be less than or equal to the high five or six days ago. If either of these conditions are not satisfied, a zero value is assigned to that day. If they both are, the daily values (the differences between the highs and lows) are summed , and the specific value for that next day is determined. Next, all the positives and negative values are added together over a five-day period. This value is then divided by the absolute value price movement of each day over the five-day period. The numerator of the calculation can be either positive, negative or zero, because each day's value is summed for five days, but the denominator is always positive because it is only concerned with the differential price movement itself. This value is then multiplied by 100. Consequently, the REI can fluctuate between +100 and -100."

Following this description I wrote the AFL formula for REI:

** Tom DeMark's Range Expansion Index
** AFL Implementation by Tomasz Janeczko

HighMom = H - Ref( H, -2 );
LowMom = L - Ref( L, -2 );

Cond1 = ( H >= Ref( L,-5) OR H >= Ref( L, -6 ) );
Cond2 = ( Ref( H, -2 ) >= Ref( C, -7 ) OR Ref( H, -2 ) >= Ref( C, -8 ) );
Cond3 = ( L <= Ref( H, -5 ) OR L <= Ref( H, -6) );
Cond4 = ( Ref( L, -2 ) <= Ref( C, -7 ) OR Ref( L, -2 ) <= Ref( C, -8 ) );

Cond = ( Cond1 OR Cond2 ) AND ( Cond3 OR Cond4 );

Num = IIf( Cond, HighMom + LowMom, 0 );
Den = Abs( HighMom ) + Abs( LowMom );

TDREI = 100 * Sum( Num, 5 )/Sum( Den, 5 ) ;

graph0 = TDREI;

DeMark advises against trading in extreme overbought or oversold conditions indicated by six or more bars above or below the 45 thresholds. For more information on calculation and using both TD REI and DeMarker indicator check Tom DeMark's site.

3 Tip of the week: Using graph styles, colors and titles in Indicator Builder

Note: Some of the functionality described here is available only in AmiBroker version 3.4 (definable styles and colors)

AmiBroker 3.4 introduced customizable styles and colors of graphs in custom indicators. These features allow more flexibility in designing your indicators. This article will explain how to use styles and colors. It will also explain how to define chart title that appears at the top of the chart.

Let's begin with a list of special variable names available in Indicator Builder:

Variable Usage Applies to
title defines title text Indicator Builder
maxgraph specifies maximum number of graphs to be drawn in custom indicator window (default=3) Indicator Builder
graphN defines the formula for the graph number N (where N is a number 0,1,2,..., maxgraph-1) Indicator Builder
graphNcolor defines the color index of Nth graph line (color indexes are related to the current palette - see Preferences/Color) Indicator Builder

defines the style of Nth graph. Style is defined as a combination (sum) of one or more following flags:

1 - normal (line) chart (default)
2 - histogram chart
4 - fat (thick)
8 - include dots
16 - no line
32 - semi-logarithmic scale
64 - candlestick chart
128 - traditional bar chart
256 - no draw (perform axis scaling only)

Not all flag combinations make sense, for example (64+1) (candlestick + line) will result in candlestick chart (style=64)

Note on candlestick/bar charts: these styles use indirectly O, H, L arrays in addition to graphN. So ordinary candlestick price chart formula is graph0=close; graph0style=64;.
But if you want to draw something else than close price you have to assign new values to predefined O,H,L arrays.

Indicator Builder

New graphNstyle and graphNcolor variables (where N is 0,1,2...) allow you to change the default plain line style. Let me show you some examples, here is how ADX/DMI chart defined in AFL would look like:

maxgraph = 3;
graph2 = pdi(14);
graph1 = mdi(14);
graph0 = adx(14);
graph2style = graph1style = 1;
graph0style = 5;
graph1color = 5;
graph2color = 6;
graph0color = 7;
title=name() + " - +DM" + writeval( graph2 )+ ", -DM" + writeval( graph1 )+
", ADX" + writeval( graph0 );

The first line defines that we will use 3 graphs (this is the default so it is not really needed). Next three lines define the formulas for +DM, -DM and ADX graphs. Then we define that graph2 and graph1 (+DM and -DM) will have plain line style and ADX line (graph0) will have fat line style (1+4). Then we define the colors according to palette settings. AmiBroker uses a pallette that can be changed by user. Go to Tools->Preferences->Colors, click Palette Editor and take a look at "Custom colors" - these 16 color boxes display AmiBrokers pallette - the first box is represent color index 0, next one - 1 and so on. So if you write graph0color = 7 you tell AmiBroker to take the color with index 7 (this is the color with which Pallette editor's box number eight is painted). And now we are at the last line which defines the formula for the chart title. Instead of plain default <TICKERNAME> - <CustomIndicatorName> we can show something more informative. In this example we concatenate a string which contains ticker name and the values of +DM, -DM and ADX. If you assign any string to the title variable it will be displayed instead of the default one.

Next example is a Parabolic SAR chart drawn over traditional bar chart:

graph0 = close;
graph0style = 128;
graph0color = 2;
graph1 = sar();
graph1style = 8+16;
graph1color = 8;
title = "This is my title: " + name() + " - SAR - " + writeval( graph1 );

In this example we plot SAR chart with only dots (graph1style = 8 (dots) + 16 (no line)). A price chart (graph0) is drawn with traditional bar chart style (graph0style=128). In order to do that we have to assign a close price to graph0 variable. Note that for candlesticks and traditional bar charts AmiBroker uses indirectly O,H, L arrays, since more data is needed than one array. So if you want to plot something different than close price you have to assign new values also to O,H,L predefined arrays. Please note also that redefining O,H,L,C arrays affects many built-in indicators that are using these arrays indirectly so to be 100% sure the following code is needed:

/* save predefined arrays */
sclose = close;
shigh = high;
slow = low:
sopen = open;

/* redefine arrays */
close = 2 * close;
high = 2 * high;
low = 2 * low;
open = 2 * open;

/* plot graph0 with a new values of predefined arrays */
graph0 = close;
graph0style = 64; /* candlesticks - indirectly use O,H,L */

/* restore arrays */
close = sclose;
high = shigh;
low = slow:
open = sopen;

/* now you can continue with calculations and use built in functions since built in arrays are restored */

As you already noticed you can combine styles by adding the values of style flags: 128+4 will result in thick traditional bar chart, while 1+8 will give you dotted line chart. Note that style=256 does not draw anything - instead AmiBroker takes graph formula, calculates it and performs chart scaling (in automatic scale mode). This is useful if you want to rescale the chart according to some array values that should not be plotted at all.

However, not all flag combinations make sense, for example (64+1) (candlestick + line) will result in candlestick chart (style=64).

.... and that's all for this week - hope you enjoyed reading

AmiBroker Tips weekly newsletter. Issue 2/2000. Copyright (C)2000 Tomasz Janeczko. All back issues available from: