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.
If c > average(c,200) and c = lowest(c,3) then buy("5Large") 5 contracts this bar on close;
Using keyword contracts to put on multiple positions
Here you specify the number of contracts prior to the keyword contracts.
Easylanguage requires you to create a separate order for each exit. Let’s say you want to get out of the 5 positions at different times and possibly prices. Here’s how you do it:
If currentContracts = 5 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 4 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 3 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 2 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 1 and c > c[1] then sell 1 contracts this bar on close;
One order for each independent exit
The reserved word currentContracts hold the current position size. Intuitively this should work but it doesn’t.
{If currentContracts > 0 then sell 1 contract this bar on close;}
You also can’t put order directives in loops. You can scale out using percentages if you like.
Value1 = 5;
If currentContracts = 5 and c > c[1] then sell 0.2 * Value1 contracts this bar on close; If currentContracts = 4 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 3 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 2 and c > c[1] then sell 1 contracts this bar on close; If currentContracts = 1 and c > c[1] then sell 1 contracts this bar on close;
Using a percentage of original order size
That’s all there is to scaling out. Just remember to have an independent exit order for each position you are liquidating. You could have just two orders: scale out of 3 and then just 2.
One Problem with the “Next Bar” Paradigm – market position nor entryPrice are adjusted by the end of the bar
Whenever I develop a strategy I like to program all of my entries and exits without utilizing TradeStations built-in execution functions. I just got use to doing this when I started programming in Fortran many years ago. However, there a few scenarios where this isn’t possible. If you enter a trade and use the following logic to get you out with a loss or a profit when referencing your entryPrice, you will be surprised with your results. This is because you are telling the computer to use entryPrice before you know what it is.
This logic is absolutely correct in its intention. However, TradeStation doesn’t realize you are in a position at the end of the bar and can’t properly reference entryPrice. Okay so we force TradeStation to only issue orders once it has a valid entryPrice.TradeStation only realizes the correct marketPosition the following day and then issues an order for the next bar. So we get the one bar delay. It would be helpful if TradeStation would set the marketPosition at the close of the bar on the bar of entry. However, you can overcome this with TradeStation’s built-in execution functions. For some reason these functions know exactly when you get in – you can also get the same results by inserting the respective strategies on the chart.
But this little bug can creep into other areas of your programming. Keep an eye on this.
Backtesting with [Trade Station,Python,AmiBroker, Excel]. Intended for informational and educational purposes only!
Get All Three Books in the Easing Into EasyLanguage Series - A Day Trade Edition will be Added Later this Year!
Announcement – A Day Trade Edition will be added to my Easing Into EasyLanguage Series this year! This edition will be the fourth installment and will utilize concepts discussed in the Hi-Res and Advanced Topics editions. I will show how to develop and program algorithms that will enter after the open of the day and get out before the market closes. Hence, no overnight exposure. Most examples will be carried out on the mini Dow, Nasdaq, S&P500 and Russel. The programming skills that you will learn can be carried to any market that provides enough bang for the buck to day trade. Look for this edition later this year. But get geared up for it by reading the first three editions in the series now. Get your favorite QUANT the books they need!
The Cover of my latest book. The first in the series.
Hello to All! The Easing Into EasyLanguage Series is now complete with the publication of the Advanced Topics Edition. This series includes three educational editions. 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. All source code is available too, and if you have TradeStation, so are the workspaces. Plus you can always email George for any questions. george.p.pruitt@gmail.com.
Hi-Res Edition Cover
This book is for those that have read the Foundation Edition or have some experience working with EasyLanguage and the various functions that help make a trading decision. This book’s audience will be those programmers that want to take an idea, that requires an observation of intraday market movements to make a trading decision, and program it accurately. If you have programmed daily bar systems, and you want to drill down and add some components that require additional market information (like what came first – the high or the low), then you have come to the right place. If you want to buy and sell short in the same day and use trade management principles such as profit targets and stop losses then The Hi-Res Edition is the book you need. There are two paradigms that EasyLanguage covers: daily and intraday bar programming. It’s the same language, but the move from daily to intraday programming can be quite difficult. Learn all the essentials and shortcuts with this edition. 5 HOURS OF VIDEO INSTRUCTION in this Hi-Res edition – one for each tutorial. All source code is available too, and if you have TradeStation, so are the workspaces. Plus you can always email George for any questions. george.p.pruitt@gmail.com.
Advanced Topics Cover
Advanced Topics (AT) could cover a vast amount of ideas and concepts and be the length of “War and Peace” on steroids. Since this book is part of the series, I wanted to cover a handful of concepts that included the follow programming constructs. Arrays and their manipulation. Buffers (fixed length arrays) and the tools to maintain buffer elements with formulas for extraction and sorting. Finite State Machines using the switch-case construct and range based case values. Using original text graphic objects and retrieving and analyzing their properties to determine X and Y coordinate values of text location. Seasonality: The Ruggiero/Barna Universal Seasonal and the Sheldon Knight Seasonal methods. In AT, you will also find an introduction to EasyLanguage’s Project Concept and the steps to create one by adding/deleting component files. TradeStation now provides access to fundamental data such as Commitment of Traders – learn how to convert the Net Change indicator into a strategy utilizing the FundValue functionality. If you wanted to find out how to merge multiple time frames into a single indicator, you are in luck! Create a MTF indicator for yourself.
Pick up your copies today – e-Book or paperback format – at Amazon.com