Have you discovered a seasonal tendency but can’t figure out how to test it?
Are there certain times of the year when a commodity increases in price and then recedes? In many markets this is the case. Crude oil seems to go up during the summer months and then chills out in the fall. It will rise once again when winter hits. Early spring might show another price decline. Have you done your homework and recorded certain dates of the year to buy/sell and short/buyToCover. Have you tried to apply these dates to a historical back test and just couldn’t figure it out? In this post I am going to show how you can use arrays and loops to cycle through the days in your seasonal database (database might be too strong of a term here) and apply long and short entries at the appropriate times during the past twenty years of daily bar data.
Build the Quasi-Database with Arrays
If you are new to EasyLanguage you may not yet know what arrays are or you might just simply be scared of them. Now worries here! Most people bypass arrays because they don’t know how to declare them, and if they get passed that, how to manipulate them to squeeze out the data they need. You may not be aware of it, but if you have programmed in EasyLanguage the least bit, then you have already used arrays. Check this out:
In reality the keywords high and low are really arrays. They are lists that contain the entire history of the high and low prices of the data that is plotted on the chart. And just like with declared arrays, you index these keywords to get historic data. the HIGH[1] means the high of yesterday and the HIGH[2] means the high of the prior day. EasyLanguage handles the management of these array-like structures. In other words, you don’t need to keep track of the indexing – you know the [1] or [2] stuff. The declaration of an array is ultra-simple once you do it a few times. In our code we are going to use four arrays:
- Buy array
- SellShort array
- Sell array
- BuyToCover array
Each of these arrays will contain the month and day of month when a trade is to be entered or exited. Why not the year? We want to keep things simple and buy/short the same time every year to see if there is truly a seasonal tendency. The first thing we need to do is declare the four arrays and then fill them up.
Our simple database has been declared, initialized and populated. This seasonal strategy will buy on:
- April 15th and Exit on May 15th
- June 5th and Exit on August 30th
It will sellShort on:
- September 15th and Cover on November 30th
- February 15th and Cover on March 30th
You could use this template and follow the pattern to add more dates to your database. Just make sure nothing overlaps.
Now, each chart has N dates of history plotted from the left to right. TradeStation starts out the test from the earliest date to the last date. It does this by looping one day at a time. The first thing we need to do is convert the bar date (TradeStation represents dates in a weird format – YYYMMDD – Jan 30, 2022 is represented by the number 1220130 – don’t ask why!!) to a format like the data that is stored in our arrays. Fortunately, we don’t have to deal with the year and EasyLanguage provides two functions to help us out.
- Month(Date) = the month (1-12) of the current bar
- DayOfMonth(Date) = the day of the month of the current bar
All we need to do is use these functions to convert the current bar’s date into terms of our database, and then test that converted date against our database. Take a look:
This code might look a little daunting, but it really isn’t. The first for-loop starts at 1 and goes through the number of buyDates. The index variable is the letter n. The loop starts at 1 and goes to 2 in increments of 1. Study the structure of the for-loop and let me know if you have any questions. What do you think this code is doing.
As you know the 15th of any month may fall on a weekend. This code basically says, ” Okay if today is less than the buyDate and tomorrow is equal to or greater than buyDate, then tommorrow is either going to be the exact day of the month or the first day of the subsequent week (the day of month fell on a weekend.) If tomorrow is a trade date, then a conditional buyNow is set to True. Further down in the logic the trade directive is issued if buyNow is set to True.
Total of 4 loops – 2 for each long/short entry and 2 for each long/short exit.
Here is the rest of the code:
Does it work? It does – please take my word for it. IYou can email me with any questions. However, TS 10 just crashed on me and is wanting to update, but I need to kill all the processes before it can do a successful update. Remember to always export your new code to an external location. I will post an example on Monday Jan 30th.