Using A Dictionary to Store Chart Patterns in EasyLanguage

Dictionary – Another Cool Collection Object

The dictionary object in EasyLanguage works just like a real dictionary.  It stores values that referenced by a key.  In a real-life dictionary, the keys would be words and the values would be the definitions of those words.

An Introduction

This little bit of code just barely skims the surface of the dictionary object, but it gives enough to get a nice introduction to such a powerful tool.  I am piggybacking off of my Pattern Smasher code here, so you might recognize some of it.

Object Delcaration

Like any of the objects in EasyLanguage a dictionary must be declared initially.

Using elsystem.collections; 
vars: dictionary patternDict(NULL),vector index(null), vector values(null);
input: patternTests(8);
var: patternTest(""),tempString(""),patternString("");
var: iCnt(0),jCnt(0);

once begin
clearprintlog;
patternDict = new dictionary;
index = new vector;
values = new vector;
end;
Declaring Objects

Here I tell the editor that I am going to be using the elsystem.collections and then a declare/define a dictionary named patterDict and two vectors:  index and values.  In the Once block, I create instances of the three objects.  This is boilerplate stuff for object instantiation.

 

for iCnt = 5 downto 2
begin
if(close[iCnt]> close[iCnt+1]) then
begin
patternString = patternString + "+";
end
else
begin
patternString = patternString + "-";
end;
end;

If patternString = "+++-" then Value99 = value99 + (c - c[2])/c[2];

if patternDict.Contains(patternString) then
Begin
// print("Found pattern: ",patternString," 3-day return is: ", (c - c[2])/c[2]);
patternDict[patternString] = patternDict[patternString] astype double + (c - c[2])/c[2];
end
Else
patternDict[patternString] = (c - c[2])/c[2];
Build the Pattern String and Then Store It

 

The keys that index into the dictionary are strings.  In this very simple example, I want to examine all of the different combinations of the last four-bar closing prices.   Once the pattern hits up I want to accumulate the percentage change over the past three days and store that value in the location pointed to by the patternString key.

Notice how I displace the loop by three days (5-2 insteat of 3-0)?  I do this so I can compare the close at the end of the pattern with today’s close, hence gathering the percentage change.  Also, notice that I test to make sure there is an entry in the dictionary with the specific key string.  If there wasn’t already an entry with the key and I tried to reference the value I would get an error message – “unable to cast null object.”

Once I store the keys and values I can regurgitate the entire dictionary very simply.  The keys and values are stored as vectors.  I can simply assign these components of the dictionary to the two vectors I instantiated earlier.

If lastBarOnChart and patternDict.Count > 0 then
Begin
index = patternDict.Keys;
values = patternDict.Values;
For iCnt = 0 to patternDict.Count-1
Begin
print(index[iCnt] astype string," ",values[iCnt] astype double);
end;
print("Value99 : ",value99:8:4);
end;
Printing Out the Dictionary

And then I can simply index into the vectors to print out their contents.  I will add some more commentary on this post a little later this week.  I hope you find this useful.  And remember this will not work with MultiCharts.