Happy New Year and some code tidbits

Dollar Cost Averaging Algorithm – Buy X amount every other Monday!

I am not going to get into this controversial approach to trading.  But in many cases, you have to do this because of the limitations of your retirement plan.  Hey if you get free matching dough, then what can you say.

Check this out!

Buy $1000 worth of shares every other Monday. INTC
if dayOfWeek(d of tomorrow)< dayOfWeek(d) Then
begin
toggle = not(toggle);
if toggle then buy dollarInvestment/close shares next bar at open;
end;
Toggle every other Monday ON

Here I use a Boolean typed variable – toggle.   Whenever it is the first day of the week, turn the toggle on or off.  Its new state becomes the opposite if its old state.  On-Off-On-Off – buy whenever the toggle is On or True.  See how I determined if it was the first day of the week; whenever tomorrow’s day of the week is less than today’s day of the week, we must be in a new week.  Monday = 1 and Friday = 5.

Allow partial liquidation on certain days of the year.

Here I use arrays to set up a few days to liquidate a fractional part of the entire holdings.

arrays: sellDates[20](0),sellAmounts[20](0);
//make sure you use valid dates
sellDates[0] = 20220103;sellAmounts[0] = 5000;
sellDates[1] = 20220601;sellAmounts[1] = 5000;
sellDates[2] = 20230104;sellAmounts[2] = 8000;
sellDates[3] = 20230601;sellAmounts[3] = 8000;

value1 = d + 19000000;
if sellDates[cnt] = value1 then
begin
sell sellAmounts[cnt]/close shares total next bar at open;
cnt = cnt + 1;
end;
Notice the word TOTAL in the order directive.

You can use this as reference on how to declare an array and assign the elements an initial value.  Initially, sellDates is an array that contains 20 zeros, and sellAmounts is an array that contains 20 zeros as well.  Load these arrays with the dates and the dollar amounts that want to execute a partial liquidation.  Be careful with using Easylanguage’s Date.  It is in the form YYYMMDD – todays date December 28, 2023, would be represented by 1231228.  All you need to do is add 19000000 to Date to get YYYYMMDD format.  You could use a function to help out here, but why.  When the d + 19000000 equals the first date in the sellDates[1] array, then a market sell order to sell sellAmounts[1]/close shares total is issued.  The array index cnt is incremented.  Notice the order directive.

sell X shares total next bar at market;

If you don’t use the keyword total, then all the shares will be liquidated.

To create a complete equity curve, you will want to liquidate all the shares at some date near the end of the chart.  This is used as input as well as the amount of dollars to invest each time.

//Demonstation of Dollar Cost Averaging
//Buy $1000 shares every two weeks
//Then liquidate a specific $amount on certain days
//of the year

vars: toggle(False),cnt(0);
inputs: settleDate(20231205),dollarInvestment(1000);
arrays: sellDates[20](0),sellAmounts[20](0);
//make sure you use valid dates
sellDates[0] = 20220103;sellAmounts[0] = 5000;
sellDates[1] = 20220601;sellAmounts[1] = 5000;
sellDates[2] = 20230104;sellAmounts[2] = 8000;
sellDates[3] = 20230601;sellAmounts[3] = 8000;

value1 = d + 19000000;
if sellDates[cnt] = value1 then
begin
sell sellAmounts[cnt]/close shares total next bar at open;
cnt = cnt + 1;
end;

if dayOfWeek(d of tomorrow)< dayOfWeek(d) Then
begin
toggle = not(toggle);
if toggle then buy dollarInvestment/close shares next bar at open;
end;

if d + 19000000 = settleDate Then
sell next bar at open;

A cool looking chart.

A chart with all the entries and exits.

Allow Pyramiding

Turn Pyramding On. You will want to allow up to X entries in the same direction regardless of the order directive.

Working with Data2

I work with many charts that have a minute bar chart as Data1 and a daily bar as Data2.  And always forget the difference between:

Close of Data2 and Close[1] of Data2

24 hour regular session used here
1231214 1705 first bar of day - close of data2 4774.00 close[1] of data2 4760.75
1231214 1710 second bar of day - close of data2 4774.00 close[1] of data2 4760.75
1231215 1555 next to last bar of day - close of data2 4774.00 close[1] of data2 4760.75
1231215 1600 last bar of day - close of data2 4768.00 close[1] of data2 4774.00

Up to the last bar of the current trading day the open, high, low, close of data2 will reflect the prior day’s values.  On the last bar of the trading day – these values will be updated with today’s values.

Hope these tidbits help you out.  Happy New Years!

Warmest regards,

George


Discover more from George Pruitt

Subscribe to get the latest posts sent to your email.

Leave a Reply