In real time trading I have noticed that once you reach a certain loss for the month its best, sometimes, to circle the wagons and quit trading until the beginning of the next month. This concept works best for very short term or day trade algorithms, as its very easy to get started back up. You can do this with Trend Following, but you must build a logical and replicable process for re-entering existing positions. Let’s assume a trading algorithm whose averaging losing month is $1500 and you are currently down $2000 – what are the chances that you will revert to the mean or draw down further? Probably 50/50. Who knows you might turn around and actually make money by month’s end. If you review a track record of a hedge fund manager, trader, or algorithm and they show a bar chart of monthly returns and there sticking out like a sore thumb is a big down bar, that kind of makes you think that could happen again. If you can control the monthly downside without sacrificing the existing Profit:DrawDown ratio, then why not do it.
Sample Code To Monitor IntraMonth $P/L
if month(date) <> month(date[1]) then Begin begMonthProf = netProfit; print(d," ",t," ",begMonthProf); canTrade = true; end;
Capture Beginning Of Month Net Profit
Here I am comparing the month of the current bar against the month of the prior bar. If they are not equal, then we have a new month. Store the netProfit in the variable begMonthProf. All you have to do is compare the current bar’s netProfit to begMonthProf and make a decision. Here is some code:
Making a Trading Decision Based on Monthly $P/L
If dayOfMonth(date) > 15 and begMonthProf - netProfit >= intraMonthMaxLoss then canTrade = false;
If Down MaxLoss for Month and Past Mid-Month - Quit Trading
If the day of the month is greater than 15 (month half over) and the difference between the current netProfit and begMonthProfit is greater than a negative intraMonthMaxLoss then quit trading for the month. Only turn it back on the first bar of the next month. See how this works for your algos.
We all know how to use the reserved word/function MarketPosition – right? Brief summary if not – use MarketPosition to see what your current position is: -1 for short, +1 for long and 0 for flat. MarketPosition acts like a function because you can index it to see what you position was prior to the current position – all you need to do is pass a parameter for the number of positions ago. If you pass it a one (MarketPosition(1)) then it will return the your prior position. If you define a variable such as MP you can store each bars MarketPosition and this can come in handy.
mp = marketPosition;
If mp[1] <> 1 and mp = 1 then buysToday = buysToday + 1; If mp[1] <> -1 and mp = -1 then sellsToday = sellsToday + 1;
Keeping Track of Buy and Sell Entries on Daily Basis
The code compares prior bar’s MP value with the current bar’s. If there is a change in the value, then the current market position has changed. Going from not 1 to 1 indicates a new long position. Going from not -1 to -1 implies a new short. If the criteria is met, then the buysToday or sellsToday counters are incremented. If you want to keep the number of buys or sells to a certain level, let’s say once or twice, you can incorporate this into your code.
If time >= startTradeTime and t < endTradeTime and buysToday < 1 and rsi(c,rsiLen) crosses above rsiBuyVal then buy this bar on close; If time >= startTradeTime and t < endTradeTime and sellsToday < 1 and rsi(c,rsiLen) crosses below rsiShortVal then sellShort this bar on close;
Using MP to Keep Track of BuysToday and SellsToday
This logic will work most of the time, but it depends on the robustness of the builtin MarketPosition function. Look how this logic fails in the following chart:
I only wanted 1 short entry per day!
MarketPosition Failure
Failure in the sense that the algorithm shorted twice in the same day. Notice on the first trade how the profit objective was hit on the very next bar. The problem with MarketPosition is that it only updates at the end of the bar one bar after the entry. So MarketPosition stays 0 during the duration of this trade. If MarketPosition doesn’t change then my counter won’t work. TradeStation should update MarketPosition at the end of the entry bar. Alas it doesn’t work this way. I figured a way around it though. I will push the code out and explain it later in more detail.
If d <> d[1] then Begin buysToday = 0; sellsToday = 0; startOfDayNetProfit = netProfit; end;
{mp = marketPosition;
If mp[1] <> 1 and mp = 1 then buysToday = buysToday + 1; If mp[1] <> -1 and mp = -1 then sellsToday = sellsToday + 1;}
If entriesToday(date) > buysToday + sellsToday then Begin If marketPosition = 1 then buysToday = buysToday + 1; If marketPosition =-1 then sellsToday = sellsToday + 1; If marketPosition = 0 then Begin if netProfit > startOfDayNetProfit then begin if exitPrice(1) > entryPrice(1) then buysToday = buysToday + 1; If exitPrice(1) < entryPrice(1) then sellsToday = sellsToday + 1; end;; if netProfit < startOfDayNetProfit then Begin if exitPrice(1) < entryPrice(1) then buysToday = buysToday + 1; If exitPrice(1) > entryPrice(1) then sellsToday = sellsToday + 1; end; end; print(d," ",t," ",buysToday," ",sellsToday); end;
If time >= startTradeTime and t < endTradeTime and buysToday < 1 and rsi(c,rsiLen) crosses above rsiBuyVal then buy this bar on close; If time >= startTradeTime and t < endTradeTime and sellsToday < 1 and rsi(c,rsiLen) crosses below rsiShortVal then sellShort this bar on close;
TradeStation does update EntriesToday at the end of the bar so you can use this keyword/function to help keep count of the different type of entries. If MP is 0 and EntriesToday increments then you know an entry and an exit has occurred (takes care of the MarketPosition snafu) – all you need to do is determine if the entry was a buy or a sell. NetProfit is also updated when a trade is closed. I establish the StartOfDayNetProfit on the first bar of the day (line 9 in the code) and then examine EntriesToday and if NetProfit increased or decreased. EntryPrice and ExitPrice are also updated at the end of the bar so I can also use them to extract the information I need. Since MarketPosition is 0 I have to pass 1 to the EntryPrice and ExitPrice functions – prior position’s prices. From there I can determine if a Long/Short entry occurred. This seems like a lot of work for what you get out of it, but if you are controlling risk by limiting the number of trades (exposure) then an accurate count is so very important.
An alternative is to test on a higher resolution of data – say 1 minute bars. In doing this you give a buffer to the MarketPosition function – more bars to catch up.
If you don’t like seeing blank days in your charts then make sure you tell TradeStation to skip these Holidays. It doesn’t make a difference in your calculations on a historic basis – TS skips these days already, but it’s more aesthetically pleasing not seeing the gaps.
I just learned something new! I guess I never programmed a strategy that pyramided at different price levels and scaled out at different price levels.
Initially I thought no problem. But I couldn’t get it to work – I tried everything and then I came across the keyword Total and then I remembered. If you don’t specify Total in you exit directives then the entire position is liquidated. Unless you are putting all your positions on at one time – like I did in my last post. So remember if you are scaling out of a pyramid position use Total in your logic.
vars: maxPosSize(2);
If currentContracts < maxPosSize - 1 and c > average(c,50) and c = lowest(c,3) then buy("L3Close") 1 contract this bar on close; If currentContracts < maxPosSize and c > average(c,50) and c = lowest(c,4) then buy("L4Close") 1 contract this bar on close;
If currentContracts = 2 and c = highest(c,5) then sell 1 contract total this bar on close; If currentContracts = 1 and c = highest(c,10) then sell 1 contract total this bar on close;
Scaling Out Of Pyramid
Why you have to use the Total I don’t know. You specify the number of contracts in the directive and that is sufficient if you aren’t pyramiding. The pyramiding throws a “monkey wrench” in to the works.
Backtesting with [Trade Station,Python,AmiBroker, Excel]. Intended for informational and educational purposes only!
Get All Five Books in the Easing Into EasyLanguage Series - The Trend Following Edition is now Available!
Announcement – A Trend Following edition has been added to my Easing into EasyLanguage Series! This edition will be the fifth and final installment and will utilize concepts discussed in the Foundation editions. I will pay respect to the legends of Trend Following by replicating the essence of their algorithms. Learn about the most prominent form of algorithmic trading. But get geared up for it by reading the first four editions in the series now. Get your favorite QUANT the books they need!
The Foundation Edition. The first in the series.
This series includes five editions that covers the full spectrum of the EasyLanguage programming language. Fully compliant with TradeStation and mostly compliant with MultiCharts. Start out with the Foundation Edition. It is designed for the new user of EasyLanguage or for those you would like to have a refresher course. There are 13 tutorials ranging from creating Strategies to PaintBars. Learn how to create your own functions or apply stops and profit objectives. Ever wanted to know how to find an inside day that is also a Narrow Range 7 (NR7?) Now you can, and the best part is you get over 4 HOURS OF VIDEO INSTRUCTION – one for each tutorial.
Hi-Res Edition Cover
This book is ideal for those who have completed the Foundation Edition or have some experience with EasyLanguage, especially if you’re ready to take your programming skills to the next level. The Hi-Res Edition is designed for programmers who want to build intraday trading systems, incorporating trade management techniques like profit targets and stop losses. This edition bridges the gap between daily and intraday bar programming, making it easier to handle challenges like tracking the sequence of high and low prices within the trading day. Plus, enjoy 5 hours of video instruction to guide you through each tutorial.
Advanced Topics Cover
The Advanced Topics Edition delves into essential programming concepts within EasyLanguage, offering a focused approach to complex topics. This book covers arrays and fixed-length buffers, including methods for element management, extraction, and sorting. Explore finite state machines using the switch-case construct, text graphic manipulation to retrieve precise X and Y coordinates, and gain insights into seasonality with the Ruggiero/Barna Universal Seasonal and Sheldon Knight Seasonal methods. Additionally, learn to build EasyLanguage projects, integrate fundamental data like Commitment of Traders, and create multi-timeframe indicators for comprehensive analysis.
Get Day Trading Edition Today!
The Day Trading Edition complements the other books in the series, diving into the popular approach of day trading, where overnight risk is avoided (though daytime risk still applies!). Programming on high-resolution data, such as five- or one-minute bars, can be challenging, and this book provides guidance without claiming to be a “Holy Grail.” It’s not for ultra-high-frequency trading but rather for those interested in techniques like volatility-based breakouts, pyramiding, scaling out, and zone-based trading. Ideal for readers of the Foundation and Hi-Res editions or those with EasyLanguage experience, this book offers insights into algorithms that shaped the day trading industry.
Trend Following Cover.
For thirty-one years as the Director of Research at Futures Truth Magazine, I had the privilege of collaborating with renowned experts in technical analysis, including Fitschen, Stuckey, Ruggiero, Fox, and Waite. I gained invaluable insights as I watched their trend-following methods reach impressive peaks, face sharp declines, and ultimately rebound. From late 2014 to early 2020, I witnessed a dramatic downturn across the trend-following industry. Iconic systems like Aberration, CatScan, Andromeda, and Super Turtle—once thriving on robust trends of the 1990s through early 2010s—began to falter long before the pandemic. Since 2020 we have seen the familiar trends return. Get six hours of video instruction with this edition.
Pick up your copies today – e-Book or paperback format – at Amazon.com