Back Home S&C Magazine Departments Traders' Tips OMNITRADER: SWAMICHARTS

OMNITRADER: SWAMICHARTS

In their article in this issue, John Ehlers & Ric Way demonstrate a method of producing heatmaps from common indicators. This is accomplished by calculating the indicator with a series of values of the parameter, then generating a color coding for each bar based on the indicator value. Heatmaps of this type are provided by Nirvana’s Cycle Trader plugin, which has preconfigured heatmaps for some of the most popular indicators.

These heatmaps can also be produced in OmniLanguage, though the implementation is not as elegant. To ensure our heatmaps match those in the article, we have used the stochastics %D line in this example. (See Figure 12.) We vary the primary parameter from four to 48 periods, while fixing the two smoothing parameters at three and nine periods, respectively. The concept can be similarly applied to other indicators.

Image 1

FIGURE 12: OMNITRADER, SWAMICHARTS. Here is a sample chart of GOOG with the StochHeat indicator.

For the sake of completeness, we have included code for the %D indicator (PercentD.txt) and the heatmap-generation code (StochHeat.txt), available below. The code will work with the professional versions of both OmniTrader and VisualTrader.

To use the software, copy the two files to the VBA folder of your OmniTrader or VisualTrader directory. The next time you start OT or VT, these indicators will be available for use. If desired, the calculations can be modified using the Omni-Language IDE.


'**************************************************************
'*   Percent D Indicator (PercentD.txt)
'*     by Jeremy Williams
'*	   January 13, 2012
'*
'*	Adapted from Technical Analysis of Stocks and Commodities
'*     March 2012
'*
'*  Summary: 
'*
'*      This indicator plots a the Percent D line of a 
'*  Stochastics Indicator. The smoothing periods for this 
'*  indicator are set at 3 and 9 respectively. For more 
'*  information see "Introducing SwamiCharts" in the March 2012
'*  edition of Technical Analysis of Stocks and Commodities.
'*
'*  Parameters:
'*  
'*  Periods- Sets the number of periods used for the base 
'*  calculation of the Stochastics indicator
'*
'*  Notes:
'*
'*  The two smoothing parameters for a traditional stochastics
'*  are fixed at 3 and 9 respectively for this indicator.
'*
'************************************************************** 

#Indicator
#Param "Periods",14

Dim HH As Single
Dim LL As Single
Dim Num As Single
Dim Denom AS Single
Dim D As Single

' Calculate the highs and lows
HH= HHV(Periods)
LL=LLV(Periods)

' Calculate numerator and denominator with smoothing
' Note: alpha of .5 equates to a 3 period EMA
Num = .5*(Close-LL)+.5*Num[1]
Denom = .5*(HH-LL)+.5*Denom[1]

' Calcuate the %D line
' Note: alpha of .2 equates to a 9 period EMA
If Denom <>0 Then 
	D= .2*Num/Denom +.8*D[1]
Else
	D= 0
End IF

' Plot the Percent D indicator
Plot("PercentD", D)

' Return the calculated Value
Return D 

'**************************************************************
'*   Stochastic Heat (StochHeat.txt)
'*     by Jeremy Williams
'*	   January 13, 2012
'*
'*	Adapted from Technical Analysis of Stocks and Commodities
'*     March 2012
'*
'*  Summary: 
'*
'*      This indicator plots a Heatmap of the Percent D line 
'*  of the Stochastics Indicator. For more information see
'*  "Introducing SwamiCharts" in the March 2012 edition of
'*  Technical Analysis of Stocks and Commodities.
'*
'*  Notes:
'*
'*  This indicator requires the PercentD (PercentD.txt) 
'*  indicator to function. This can be found at: 
'*  
'*  www.omnitrader.com/ProSI
'*
'*  This indicator is only a visual tool and does not
'*  return a value.
'*
'************************************************************** 

#Indicator

' Setup Plot area Y- Axis from 4 to 48 corresponding with the
' period of the Stochastic used.
SetScales(4,48)

' Process the 4 period stochastics
Dim oColor4 As Object
Dim myStoch4 As Single
myStoch4 =  PercentD(4)

' Color heatmap line based on value
If myStoch4 < .50 Then
	oColor4 = Color.FromARGB(255,255*2*myStoch4,0)
Else 
	oColor4 = Color.FromARGB(255*(2-2*myStoch4),255,0)
End If

' Plot line for period 4 stochastics
Plot("4",4,oColor4,10)

' Contiune similarly for other periods.
Dim oColor5 As Object
Dim myStoch5 As Single
myStoch5 = PercentD(5)
If myStoch5 < .50 Then
	oColor5 = Color.FromARGB(255,255*2*myStoch5,0)
Else 
	oColor5 = Color.FromARGB(255*(2-2*myStoch5),255,0)
End If
Plot("5",5,oColor5,10)

Dim oColor6 As Object
Dim myStoch6 As Single
myStoch6 = PercentD(6)
If myStoch6 < .50 Then
	oColor6 = Color.FromARGB(255,255*2*myStoch6,0)
Else 
	oColor6 = Color.FromARGB(255*(2-2*myStoch6),255,0)
End If
Plot("6",6,oColor6,10)

Dim oColor7 As Object
Dim myStoch7 As Single
myStoch7 = PercentD(7)
If myStoch7 < .50 Then
	oColor7 = Color.FromARGB(255,255*2*myStoch7,0)
Else 
	oColor7 = Color.FromARGB(255*(2-2*myStoch7),255,0)
End If
Plot("7",7,oColor7,10)

Dim oColor8 As Object
Dim myStoch8 As Single
myStoch8 = PercentD(8)
If myStoch8 < .50 Then
	oColor8 = Color.FromARGB(255,255*2*myStoch8,0)
Else 
	oColor8 = Color.FromARGB(255*(2-2*myStoch8),255,0)
End If
Plot("8",8,oColor8,10)

Dim oColor9 As Object
Dim myStoch9 As Single
myStoch9 = PercentD(9)
If myStoch9 < .50 Then
	oColor9 = Color.FromARGB(255,255*2*myStoch9,0)
Else 
	oColor9 = Color.FromARGB(255*(2-2*myStoch9),255,0)
End If
Plot("9",9,oColor9,10)

Dim oColor10 As Object
Dim myStoch10 As Single
myStoch10 = PercentD(10)
If myStoch10 < .50 Then
	oColor10 = Color.FromARGB(255,255*2*myStoch10,0)
Else 
	oColor10 = Color.FromARGB(255*(2-2*myStoch10),255,0)
End If
Plot("10",10,oColor10,10)

Dim oColor11 As Object
Dim myStoch11 As Single
myStoch11 = PercentD(11)
If myStoch11 < .50 Then
	oColor11 = Color.FromARGB(255,255*2*myStoch11,0)
Else 
	oColor11 = Color.FromARGB(255*(2-2*myStoch11),255,0)
End If
Plot("11",11,oColor11,10)

Dim oColor12 As Object
Dim myStoch12 As Single
myStoch12 = PercentD(12)
If myStoch12 < .50 Then
	oColor12 = Color.FromARGB(255,255*2*myStoch12,0)
Else 
	oColor12 = Color.FromARGB(255*(2-2*myStoch12),255,0)
End If
Plot("12",12,oColor12,10)

Dim oColor13 As Object
Dim myStoch13 As Single
myStoch13 = PercentD(13)
If myStoch13 < .50 Then
	oColor13 = Color.FromARGB(255,255*2*myStoch13,0)
Else 
	oColor13 = Color.FromARGB(255*(2-2*myStoch13),255,0)
End If
Plot("13",13,oColor13,10)


Dim oColor14 As Object
Dim myStoch14 As Single
myStoch14 = PercentD(14)
If myStoch14 < .50 Then
	oColor14 = Color.FromARGB(255,255*2*myStoch14,0)
Else 
	oColor14 = Color.FromARGB(255*(2-2*myStoch14),255,0)
End If
Plot("14",14,oColor14,10)

Dim oColor15 As Object
Dim myStoch15 As Single
myStoch15 = PercentD(15)
If myStoch15 < .50 Then
	oColor15 = Color.FromARGB(255,255*2*myStoch15,0)
Else 
	oColor15 = Color.FromARGB(255*(2-2*myStoch15),255,0)
End If
Plot("15",15,oColor15,10)

Dim oColor16 As Object
Dim myStoch16 As Single
myStoch16 = PercentD(16)
If myStoch16 < .50 Then
	oColor16 = Color.FromARGB(255,255*2*myStoch16,0)
Else 
	oColor16 = Color.FromARGB(255*(2-2*myStoch16),255,0)
End If
Plot("16",16,oColor16,10)


Dim oColor17 As Object
Dim myStoch17 As Single
myStoch17 = PercentD(17)
If myStoch17 < .50 Then
	oColor17 = Color.FromARGB(255,255*2*myStoch17,0)
Else 
	oColor17 = Color.FromARGB(255*(2-2*myStoch17),255,0)
End If
Plot("17",17,oColor17,10)


Dim oColor18 As Object
Dim myStoch18 As Single
myStoch18 = PercentD(18)
If myStoch18 < .50 Then
	oColor18 = Color.FromARGB(255,255*2*myStoch18,0)
Else 
	oColor18 = Color.FromARGB(255*(2-2*myStoch18),255,0)
End If
Plot("18",18,oColor18,10)


Dim oColor19 As Object
Dim myStoch19 As Single
myStoch19 = PercentD(19)
If myStoch19 < .50 Then
	oColor19 = Color.FromARGB(255,255*2*myStoch19,0)
Else 
	oColor19 = Color.FromARGB(255*(2-2*myStoch19),255,0)
End If
Plot("19",19,oColor19,10)

Dim oColor20 As Object
Dim myStoch20 As Single
myStoch20 = PercentD(20)
If myStoch20 < .50 Then
	oColor20 = Color.FromARGB(255,255*2*myStoch20,0)
Else 
	oColor20 = Color.FromARGB(255*(2-2*myStoch20),255,0)
End If
Plot("20",20,oColor20,10)

Dim oColor21 As Object
Dim myStoch21 As Single
myStoch21 = PercentD(21)
If myStoch21 < .50 Then
	oColor21 = Color.FromARGB(255,255*2*myStoch21,0)
Else 
	oColor21 = Color.FromARGB(255*(2-2*myStoch21),255,0)
End If
Plot("21",21,oColor21,10)


Dim oColor22 As Object
Dim myStoch22 As Single
myStoch22 = PercentD(22)
If myStoch22 < .50 Then
	oColor22 = Color.FromARGB(255,255*2*myStoch22,0)
Else 
	oColor22 = Color.FromARGB(255*(2-2*myStoch22),255,0)
End If
Plot("22",22,oColor22,10)


Dim oColor23 As Object
Dim myStoch23 As Single
myStoch23 = PercentD(23)
If myStoch23 < .50 Then
	oColor23 = Color.FromARGB(255,255*2*myStoch23,0)
Else 
	oColor23 = Color.FromARGB(255*(2-2*myStoch23),255,0)
End If
Plot("23",23,oColor23,10)


Dim oColor24 As Object
Dim myStoch24 As Single
myStoch24 = PercentD(24)
If myStoch24 < .50 Then
	oColor24 = Color.FromARGB(255,255*2*myStoch24,0)
Else 
	oColor24 = Color.FromARGB(255*(2-2*myStoch24),255,0)
End If
Plot("24",24,oColor24,10)

Dim oColor25 As Object
Dim myStoch25 As Single
myStoch25 = PercentD(25)
If myStoch25 < .50 Then
	oColor25 = Color.FromARGB(255,255*2*myStoch25,0)
Else 
	oColor25 = Color.FromARGB(255*(2-2*myStoch25),255,0)
End If
Plot("25",25,oColor25,10)

Dim oColor26 As Object
Dim myStoch26 As Single
myStoch26 = PercentD(26)
If myStoch26 < .50 Then
	oColor26 = Color.FromARGB(255,255*2*myStoch26,0)
Else 
	oColor26 = Color.FromARGB(255*(2-2*myStoch26),255,0)
End If
Plot("26",26,oColor26,10)

Dim oColor27 As Object
Dim myStoch27 As Single
myStoch27 = PercentD(27)
If myStoch27 < .50 Then
	oColor27 = Color.FromARGB(255,255*2*myStoch27,0)
Else 
	oColor27 = Color.FromARGB(255*(2-2*myStoch27),255,0)
End If
Plot("27",27,oColor27,10)

Dim oColor28 As Object
Dim myStoch28 As Single
myStoch28 = PercentD(28)
If myStoch28 < .50 Then
	oColor28 = Color.FromARGB(255,255*2*myStoch28,0)
Else 
	oColor28 = Color.FromARGB(255*(2-2*myStoch28),255,0)
End If
Plot("28",28,oColor28,10)


Dim oColor29 As Object
Dim myStoch29 As Single
myStoch29 = PercentD(29)
If myStoch29 < .50 Then
	oColor29 = Color.FromARGB(255,255*2*myStoch29,0)
Else 
	oColor29 = Color.FromARGB(255*(2-2*myStoch29),255,0)
End If
Plot("29",29,oColor29,10)

Dim oColor30 As Object
Dim myStoch30 As Single
myStoch30 = PercentD(30)
If myStoch30 < .50 Then
	oColor30 = Color.FromARGB(255,255*2*myStoch30,0)
Else 
	oColor30 = Color.FromARGB(255*(2-2*myStoch30),255,0)
End If
Plot("30",30,oColor30,10)

Dim oColor31 As Object
Dim myStoch31 As Single
myStoch31 = PercentD(31)
If myStoch31 < .50 Then
	oColor31 = Color.FromARGB(255,255*2*myStoch31,0)
Else 
	oColor31 = Color.FromARGB(255*(2-2*myStoch31),255,0)
End If
Plot("31",31,oColor31,10)

Dim oColor32 As Object
Dim myStoch32 As Single
myStoch32 = PercentD(32)
If myStoch32 < .50 Then
	oColor32 = Color.FromARGB(255,255*2*myStoch32,0)
Else 
	oColor32 = Color.FromARGB(255*(2-2*myStoch32),255,0)
End If
Plot("32",32,oColor32,10)


Dim oColor33 As Object
Dim myStoch33 As Single
myStoch33 = PercentD(33)
If myStoch33 < .50 Then
	oColor33 = Color.FromARGB(255,255*2*myStoch33,0)
Else 
	oColor33 = Color.FromARGB(255*(2-2*myStoch33),255,0)
End If
Plot("33",33,oColor33,10)


Dim oColor34 As Object
Dim myStoch34 As Single
myStoch34 = PercentD(34)
If myStoch34 < .50 Then
	oColor34 = Color.FromARGB(255,255*2*myStoch34,0)
Else 
	oColor34 = Color.FromARGB(255*(2-2*myStoch34),255,0)
End If
Plot("34",34,oColor34,10)


Dim oColor35 As Object
Dim myStoch35 As Single
myStoch35 = PercentD(35)
If myStoch35 < .50 Then
	oColor35 = Color.FromARGB(255,255*2*myStoch35,0)
Else 
	oColor35 = Color.FromARGB(255*(2-2*myStoch35),255,0)
End If
Plot("35",35,oColor35,10)


Dim oColor36 As Object
Dim myStoch36 As Single
myStoch36 = PercentD(36)
If myStoch36 < .50 Then
	oColor36 = Color.FromARGB(255,255*2*myStoch36,0)
Else 
	oColor36 = Color.FromARGB(255*(2-2*myStoch36),255,0)
End If
Plot("36",36,oColor36,10)

Dim oColor37 As Object
Dim myStoch37 As Single
myStoch37 = PercentD(37)
If myStoch37 < .50 Then
	oColor37 = Color.FromARGB(255,255*2*myStoch37,0)
Else 
	oColor37 = Color.FromARGB(255*(2-2*myStoch37),255,0)
End If
Plot("37",37,oColor37,10)


Dim oColor38 As Object
Dim myStoch38 As Single
myStoch38 = PercentD(38)
If myStoch38 < .50 Then
	oColor38 = Color.FromARGB(255,255*2*myStoch38,0)
Else 
	oColor38 = Color.FromARGB(255*(2-2*myStoch38),255,0)
End If
Plot("38",38,oColor38,10)


Dim oColor39 As Object
Dim myStoch39 As Single
myStoch39 = PercentD(39)
If myStoch39 < .50 Then
	oColor39 = Color.FromARGB(255,255*2*myStoch39,0)
Else 
	oColor39 = Color.FromARGB(255*(2-2*myStoch39),255,0)
End If
Plot("39",39,oColor39,10)


Dim oColor40 As Object
Dim myStoch40 As Single
myStoch40 = PercentD(40)
If myStoch40 < .50 Then
	oColor40 = Color.FromARGB(255,255*2*myStoch40,0)
Else 
	oColor40 = Color.FromARGB(255*(2-2*myStoch40),255,0)
End If
Plot("40",40,oColor40,10)


Dim oColor41 As Object
Dim myStoch41 As Single
myStoch41 = PercentD(41)
If myStoch41 < .50 Then
	oColor41 = Color.FromARGB(255,255*2*myStoch41,0)
Else 
	oColor41 = Color.FromARGB(255*(2-2*myStoch41),255,0)
End If
Plot("41",41,oColor41,10)


Dim oColor42 As Object
Dim myStoch42 As Single
myStoch42 = PercentD(42)
If myStoch42 < .50 Then
	oColor42 = Color.FromARGB(255,255*2*myStoch42,0)
Else 
	oColor42 = Color.FromARGB(255*(2-2*myStoch42),255,0)
End If
Plot("42",42,oColor42,10)


Dim oColor43 As Object
Dim myStoch43 As Single
myStoch43 = PercentD(43)
If myStoch43 < .50 Then
	oColor43 = Color.FromARGB(255,255*2*myStoch43,0)
Else 
	oColor43 = Color.FromARGB(255*(2-2*myStoch43),255,0)
End If
Plot("43",43,oColor43,10)


Dim oColor44 As Object
Dim myStoch44 As Single
myStoch44 = PercentD(44)
If myStoch44 < .50 Then
	oColor44 = Color.FromARGB(255,255*2*myStoch44,0)
Else 
	oColor44 = Color.FromARGB(255*(2-2*myStoch44),255,0)
End If
Plot("44",44,oColor44,10)


Dim oColor45 As Object
Dim myStoch45 As Single
myStoch45 = PercentD(45)
If myStoch45 < .50 Then
	oColor45 = Color.FromARGB(255,255*2*myStoch45,0)
Else 
	oColor45 = Color.FromARGB(255*(2-2*myStoch45),255,0)
End If
Plot("45",45,oColor45,10)


Dim oColor46 As Object
Dim myStoch46 As Single
myStoch46 = PercentD(46)
If myStoch46 < .50 Then
	oColor46 = Color.FromARGB(255,255*2*myStoch46,0)
Else 
	oColor46 = Color.FromARGB(255*(2-2*myStoch46),255,0)
End If
Plot("46",46,oColor46,10)


Dim oColor47 As Object
Dim myStoch47 As Single
myStoch47 = PercentD(47)
If myStoch47 < .50 Then
	oColor47 = Color.FromARGB(255,255*2*myStoch47,0)
Else 
	oColor47 = Color.FromARGB(255*(2-2*myStoch47),255,0)
End If
Plot("47",47,oColor47,10)


Dim oColor48 As Object
Dim myStoch48 As Single
myStoch48 = PercentD(48)
If myStoch48 < .50 Then
	oColor48 = Color.FromARGB(255,255*2*myStoch48,0)
Else 
	oColor48 = Color.FromARGB(255*(2-2*myStoch48),255,0)
End If
Plot("48",48,oColor48,10)

Return 0     ' Return the value calculated by the indicator

For more information on Nirvana’s Cycle Trader and source code for this article, visit http://www.omnitrader.com/CycleTrader.

—Jeremy Williams
Nirvana Systems, Inc.
www.omnitrader.com, www.nirvanasystems.com

Teline4-tabs1 - Site

  • Traders' Tips

  • Letters To The Editor

Teline4-tabs2 - Site

  • Q & A

  • Novice Traders' Notebook

Teline4-tabs3 - Site

  • Books For Traders

  • News & Products

Teline4-tabs4 - Site

  • Free Articles

  • At The Close

SUBSCRIBE TO OUR FREE
EMAIL NEWSLETTER!