In this post, I want to share some code that I was surprised wasn’t really all that accessible. I was in need of passing a 2-D array to a function and couldn’t remember the exact syntax. The semantics of the problem is pretty straightforward.
- Build Array
- Pass Array as Reference
- Unpack Array
- Do Calculation
A 2D Array Is Just Like a Table
Any readers please correct me if I am wrong here, but you can’t use dynamic arrays on any dimension greater than 1. A dynamic array is one where you don’t initially know the size of the array so you leave it blank and TradeStation allocates memory dynamically. Also, there are a plethora of built-in functions that only work with dynamic arrays. Once we step up in dimension then that all goes out the window. I know what you are thinking, just use multiple dynamic arrays. Sometimes you want to keep the accounting down to a minimum and a matrix or table fits this bill. So if you do use multi-dimension arrays just remember you will need to know the total number of rows and columns in your table. Table? What do you mean table? I thought we were talking about arrays. Well, we are and a two-dimensional array can look like a table with rows as your first index and columns as your second. Just like an Excel spreadsheet. First, let’s create a very small and simple table in EasyLangauge:
array: testArray[2,2](0);
Once
begin
testArray[0,0] = 100;
testArray[0,1] = 5;
testArray[1,0] = 200;
testArray[1,1] = 10;
testArray[2,0] = 300;
testArray[2,1] = 7.5;
Value2 = getArrayHH(testArray,2,2);
Print (value2);
end;
Create a Very Small Table in Our Sandbox
My EasyLanguage Sandbox
You will notice I used the keyword Once. I use this whenever I want to play around with some code in my EasyLanguage Sandbox. Huh? In programmer-ese a Sandbox is a quick and dirty environment that runs very quickly and requires nearly zero overhead. So here I apply the code to print out just one line of output when applied to any chart. Notice how I declare the 2-D array – use the keyword Array: and the name of the array or table and allocate the total number of rows as the first argument and the total number of columns as the second argument. Also notice the arguments are separated by a comma and enclosed in square brackets. The following value enclosed in parentheses is the default value of every element in the array. Remember arrays are zero-based in EasyLanguage. So if you dimension an array with the number 2 you access the rows with 0 and 1 and 2. Same goes for columns as well. Did you catch that. If you dimension an array with the number 2 shouldn’t there be just 2 rows? Well in EasyLanguage when you dimension an array you get a free element at row 0 and column 0. In EasyLanguage you can just ignore row 0 and column 0 if you like. Here is the code if you ignore row 0 and column 0.
Should I Use Row 0 and Column Zero – It’s A Preference
array: testArray[2,2](0);
Once
begin
testArray[1,1] = 100;
testArray[1,2] = 5;
testArray[2,1] = 200;
testArray[2,2] = 10;
Value2 = getArrayHH(testArray,2,2);
Print (value2);
end;
Ignore the Elements at Row 0 and Column 0
Out Of Bounds
Even though you get one free row you still cannot go beyond the boundaries of the array size. If I were to say something like:
testArray[3,1] = 300;
I would get an error message. If you want to work with a zero element then all of your code must coincide with that. If not, then your code shouldn’t try to access row 0 or column 0. Okay here is the function that I programmed for this little test:
inputs: tempArray[x,y](numericArray),numOfRows(numericSimple),whichColumn(numericSimple);
vars: j(0),tempHi(0),cnt(0);
For j= 1 to numOfRows
Begin
print(j," ",tempArray[j,whichColumn]);
If tempArray[j,whichColumn] > tempHi then tempHi = tempArray[j,whichColumn];
end;
GetArrayHH = tempHi;
Function That Utilizes a 2D Array
Notice in the inputs how I declare the tempArray with the values x and y. You could have used a and b if you like or any other letters. This informs the compiler to expect a 2D array. It doesn’t know the size and that’s not important as long as you control the boundaries from the calling routine. The second parameter is the number of rows in the table and the third parameter is the column I am interested in. In this example, I am interested in column 2.
The Caller Function is the QuarterBack – Make Sure You Don’t Throw it Out of Bounds
Again this function assumes the caller will prevent stepping out of bounds. I loop the number of rows in the table and examine the second column and keep track of the highest value. I then return the highest column value.
This was a simple post, but remembering the syntax can be tough and know that EasyLangauge is zero-based when it comes to arrays is nice to know. You can also use this format for your own Sandbox.