Builder automatically generates strategy code based on the performance criteria that you specify. Technically, the program uses a technique called genetic programming, which "evolves" a population of trading strategies to maximize the so-called fitness, which is based on the performance criteria you select. More information on the build algorithm is provided here. The article library also includes information on genetic programming.
Builder is designed to be user-friendly and easy to use for those with a basic knowledge of trading systems. You don't need to know how to design or develop trading strategies, and no programming is required. However, you do need to know a good trading strategy when you see one. This is how you select the performance criteria that guide the build process. The program incorporates features such as out-of-sample testing, stress testing, and build monitoring rules that help insure good strategies are found, but it's ultimately up to you to decide when the strategies are good enough.
How is the algorithm in Builder different from genetic optimization, such as the genetic optimizer in TradeStation?
Genetic optimizers, such as the one in TradeStation, are designed to optimize parameter values, such as the inputs to a trading strategy. The algorithm in Builder is called genetic programming. By contrast, genetic programming optimizes the rules and logic of a trading strategy. It actually evolves the trading system starting from a set of possible technical indicators, logical operators, inequality operators, and entry and exit order types. In effect, it automates the manual process a strategy developer might go through in trying to develop a new trading strategy from scratch given only the market data and the developer's knowledge of trading and the trading strategy development process.
Yes, a trial is available. Builder is available as a fully functional trial for 14 days. The trial is functionally the same as the licensed version. After purchasing the license, the licensed version can be downloaded and installed through a link provided in your purchase receipt.
Yes, Builder will run on both 64-bit and 32-bit versions of Windows, although the latest version is only available for 64-bit versions of Windows. This enables the processing of larger price files and larger populations of strategies.
Absolutely. The build algorithm was parallelized starting in version 1.2.0. This means Builder will take full advantage of all available cores on a multi-core machine. Because of this and the implementation of a more efficient strategy evaluation algorithm, version 1.2.0 is up to 25 times faster on multi-core computers than prior versions. The parallel processing algorithms were further improved for version 2.1. Currently, the program does not utilize GPU processing.
Here are two examples for a quad-core 3 GHz processor (based on version 18.104.22.168):
- 10 years of daily bars; population size of 1000; 5 generations. Processing time: 17 seconds.
- 14 years of 15 min bars of E-mini S&P; population size of 100; 5 generations. Processing time: 1 min, 1 sec.
Yes. Builder includes a "code output" option for selecting between current versions of TS and TS 2000i. Any strategy in Builder, including those built from prior versions, can be re-written for either version of TS at any time simply by selecting the strategy in the Build Results table and selecting Evaluate from the Evaluation menu.
Yes. Builder includes the ability to read text files of price data saved from MultiCharts. This means if you use MultiCharts to develop and run your EasyLanguage strategies, rather than TradeStation, you can now easily save your chart data for use in Builder. All strategies generated by Builder contain pure, standard EasyLanguage code (no dll's), so there is already maximum compatibility between Builder and MultiCharts in terms of strategy code evaluation.
Absolutely. Strategies created by Builder contain standard EasyLanguage code and can be automated just as easily as any other TradeStation strategy.
March 2010. Builder is undergoing continuous improvement with new versions coming out as soon as possible.
The following links discuss Builder and/or provide examples of its use:
- Sviluppare strategie con Adaptrade Builder (TRADERS' Mag Italia, May 2013)
- Product Review: Adaptrade Builder 1.2 ( Technical Analysis of Stocks & Commodities magazine, Nov 2011)
- Calling The Tune In The Gold Market (Technical Analysis of Stocks & Commodities magazine, Jul 2011)
- Financnik.com (online review; Czech)
Licenses and upgrades are two different things. The license for Adaptrade Builder is a lifetime license. This means you can use the version you purchased for as long as you want. If you purchase version 2.1, you can use that version indefinitely.
Starting with version 2.0, upgrades are free for one year from the date of purchase. After one year, an annual maintenance contract can be purchased, which will cover all new releases during the maintenance period. The maintenance contract is entirely optional and can be purchased at any time. For older versions (version 1.x), the policy is that all upgrades are free through the end of version 1. In addition, all licensees of version 1.x can upgrade free of charge to version 2.0.1.
To be clear, the maintenance fee has no bearing on the license you purchase, which is a lifetime license. If you purchase version 2.1.0, for example, you will be able to use that version for as long as you want without any additional payments. You could also upgrade for free to any version that was released within one year of the date of your purchase. To upgrade to any releases after that time would require purchasing a maintenance contract. The maintenance contract is approximately 20% of the purchase price. An upgrade button is provided in the license area of your online account to allow purchases of the maintenance contract.
Yes. Builder is licensed per-user, not per-computer. Provided it's for your own use only, you can install the program on multiple computers, such as on a home computer, a work computer, and a laptop. However, only one copy may be used at one time for a single-user license. The single-user license comes with three activations by default. More can be added upon request to accommodate computer replacement, operating system changes (which can require reactivation), and so on.
I noticed my favorite indicator is not included in Builder. Do you plan to add other indicators in the future?
Builder already includes the most popular indicators, including ones from all major categories of indicators. Nonetheless, future releases of Builder will most likely include additional indicators, depending on interest. Also, the custom indicator feature (next answer) can be used to include other indicators in Builder in addition to the ones currently built-in to the program.
Yes. Builder now includes a feature that allows you to include your own custom indicators in the program. By plotting your custom indicator on a chart and saving the data to a text file, the column of indicator values can be read into Builder and associated with a text string that represents the code for the corresponding indicator function used to generate the values in the file. Builder will use the indicator in strategies and include the text string for the indicator function code in the entry or exit statement in which the indicator is used. Provided that function is available in the trading platform when the strategy is executed, the code will generate the same results as in Builder. More information on this feature can be found in the Input Data and Settings section of the user's guide.
The custom indicator feature can be used to include prices for other data series such as data2, data3, and so on, provided the secondary data streams have the same bar size as the primary series. For example, adding "Close of data2" and "High of data2" (in EasyLanguage notation) as additional columns of data in the price data file would allow for logical statements such as "Average(XAverage(Close of data2, N1), N2) crosses above TriAverage(High of data2, N3)". See the newsletter article Building Trading Strategies Using Inter-Market Logic. The ability to directly add multiple time frames will be added in a future release.
Can I build a strategy across multiple markets, such as gold and crude oil, so it will work on both markets?
Yes. Starting with version 1.4, Builder allows you to select multiple markets and build over all selected markets. Each strategy is designed to work over the portfolio of selected markets.
Builder now supports EasyLanguage for TradeStation and MultiCharts, NinjaScript for NinjaTrader 7, MQL4 for MetaTrader 4, and AFL for AmiBroker. NinjaScript for NinjaTrader 8 will most likely be added in an upcoming release.
While no one can guarantee profitability, compared to strategies built via the traditional, manual way, the strategies generated by Builder should be more likely to perform well in real time. This is because Builder incorporates several features that help guide the process to strategies that are likely to have good out-of-sample and real-time performance. In particular, Builder includes automatic out-of-sample testing, so you can immediately see how well the strategies perform on data not used in the build. Also, you can choose to optimize for statistical significance, maximize the number of trades, and minimize the system complexity, all of which will increase the quality of the generated strategies. You can also vary the input parameters and price data via a Monte Carlo approach, which helps incorporate robustness into the build process, and Builder tracks the performance on the so-called "test" segment to detect over-fitting. Moreover, the strategy logic produced by Builder incorporates volatility-normalized parameters, which help adapt the strategies to different market conditions. The user's guide includes a section that covers factors affecting out-of-sample performance and ways to maximize the out-of-sample results.
Optimization is not the same as over-optimization. The key is to avoid over-fitting, which leads to results that look good in historical testing but don't hold up well out-of-sample or in real-time tracking or trading. Builder includes automatic out-of-sample testing so that all members of the population of strategies are evaluated out-of-sample. That means they're evaluated on data not used during the build process, which provides an objective measure of performance.
Builder also includes stress testing based on Monte Carlo analysis, which can be incorporated into the build process or run afterwards to evaluate the robustness of a strategy. In addition, there are build termination and build failure tracking rules that monitor the build process and help prevent over-fitting by monitoring convergence and stopping the build process before the over-optimization sets in.
Moreover, there are several metrics in Builder that can be incorporated into the fitness function just by selecting them from the Build Metrics table that will increase the likelihood of getting superior out-of-sample results. These include statistical significance, correlation coefficient of the equity curve, number of trades, strategy complexity, among others. In all, Builder includes more than 100 different metrics that can be selected to define the fitness.
Most technical indicators don't work. Why would Builder generate good strategies if it's based on technical indicators?
By themselves, most technical indicators are ineffective, especially when used as stand-alone trading systems and in the way originally recommended by the indicator's creator. That's probably because the markets tend to be efficient, so that any advantage afforded by a particular indicator is lost after it becomes commonly used. However, this is not how Builder works.
Builder combines indicators in unique ways, most of which have probably never been previously used in trading strategies. Most indicators can be thought of as ways to transform a price series so that the result is a smoothed or normalized version of the market. The transformation itself is not the most important part; it's how that transformed representation of the market is used to construct trading rules. This is where Builder differs from other trading strategy software. Builder looks at the indicator values as input to the construction of trading rules, rather than as the trading rules themselves. The algorithm that Builder uses to construct strategies means there is an almost infinite variety of unique trading logic available to build your strategies.
Builder also include adaptive and zero-lag indicators that are exclusive to Adaptrade Software. Because these indicators are not found in other platforms, it's unlikely the market has compensated for their advantage. Moreover, Builder includes non-indicator trading logic, such as price patterns, breakout entries, time-of-day, day-of-week, and other entry and exit constraints. If desired, strategies can be built without using any technical indicators.
I don't track strategies via live trading myself. However, some of my partners do; see, for example, the profiles of Petr Tmej and Tomas Nesnidal. Also, Builder will perform out-of-sample testing automatically to verify each strategy in the final population. It's always a good idea when developing trading strategies to test the strategies in real time by tracking them forward. Since it only takes a matter of minutes to start creating strategies with Builder, you can use part or even most of the trial period to test strategies forward in real time if you wish. Also, the strategies you create during the trial don't expire, so you can continue to test and track them even after your trial of Builder is over.
Generally speaking, if you've developed profitable trading strategies before, you can do so in Builder, just faster and with better tooling to develop, test, and validate your strategies. If you haven't, Builder will give you the tools to do so.
In some cases, the results displayed by Builder don’t match the results I get when I run the strategy in my trading platform. What's wrong?
There are several possible explanations. One possibility is that the date ranges of the price series are different between Builder and the trading platform. It's also important to set the "Maximum number of bars study will reference" in TradeStation (Format Strategies, Properties for All) to the MaxBarsBack value listed in the Results table. In MultiCharts, the value is entered under Format Signal, Properties ("Maximum number of bars study will reference"). This will insure that the calculations start on the correct bar. This is not necessary in AmiBroker since the code itself contains the MaxBarsBack setting.
MetaTrader automatically starts the indicator calculations so that the first bar of trading is on the first day you specify. This means you don't need to enter a "max bars back" value. However, it also makes it difficult to align the starting date in Builder with that of MetaTrader. Sometimes, the bar on which the calculations start can make a substantial difference. For example, if trading starts two bars earlier in MetaTrader than in Builder and each trade lasts exactly five bars, each trade could be starting and ending two bars earlier in MetaTrader, which could significantly affect the results.
Trading costs can also be a factor. Note that Builder deducts the trading costs once per trade, whereas TradeStation deducts costs once "per side". For example, if your trading costs are set to $25 in Builder, they should be set to $12.50 in TradeStation.
If you're re-using a strategy name in the strategy editor by pasting the strategy code over the code for an existing strategy, it will be necessary to reset the input values before running the back-test. Otherwise, the trading platform may be using the prior strategy's input values with the new strategy. In TradeStation, delete the strategy from the chart and re-insert it to reset the input values. In MetaTrader 4, reset the input values by clicking the Expert properties button on the Tester window and clicking the Reset button on the Inputs tab. In AmiBroker, click the Parameters icon on the Analysis window and click "Reset all".
MetaTrader 4 applies a minimum price distance to determine if an order can be placed. If a pending order (stop or limit) is too close to the market at the time it's placed, the order will be rejected. This is based on the idea that there won't be sufficient time to place the order before the market moves through the order price. Builder doesn't reject such orders, which can sometimes cause a discrepancy in back-testing between Builder and MetaTrader 4.
Another source of difference in MetaTrader involves the accumulation/distribution indicator. The values of this indicator depend on the bar on which the calculations start. In MetaTrader, while you can specify the starting and ending dates for the strategy, the indicators are evaluated starting at the beginning of the available data. This means that the accumulation/distribution values may be very different in MetaTrader than in Builder.
In TradeStation, another possible source of difference is how Builder and TradeStation use trading volume on intraday data. If your strategy uses volume in an indicator for either an entry or exit condition and your price data is intraday data, TradeStation may be using only the "up volume", rather than the total (up plus down) volume. There is an option on the Price File Format window in Builder to "Set the volume to the sum of up-tick and down-tick volumes." Try changing this option then re-evaluate the strategy using the Evaluate button on the Evaluation menu.
For forex trading, one source of discrepancy is the so-called "roll over credit", which TradeStation calculates on foreign exchange trades. This is currently outside the scope of Builder. In most cases, these credits are small amounts that do not affect the overall results substantially.
Also keep in mind that Builder does not look inside bars (what TradeStation refers to as "look-inside back-bar testing"). If your strategies enter and exit on the same bar or have multiple exit orders that could be triggered on the same bar, such as a target and a protective stop, this can result in discrepancies. As a general rule, it's probably better to use more data for a given number of trades during a given trading period rather than less. This suggests that going to a smaller bar size with more bars per trade is preferable to having trades enter and exit on the same bar or having the bar size be so large that both stops and targets could be triggered on the same bar. Provided this is done, there will not be any ambiguity about which order is triggered first, and the discrepancy associated with the lack of look-inside bar testing can be avoided.
Even with all the settings correct, there may be differences. Oftentimes, these result from rounding errors and other small differences that are unavoidable. For example, if an oscillator is compared to a fixed value, such as 80.0, using the less-than-or-equal (≤) operator, there may be a bar where the value calculates as exactly 80.0 in Builder but as 80.0000001 in TradeStation. This seemingly insignificant difference can result in a trade that is not taken in TradeStation but is taken in Builder. This could then affect subsequent trades because the presence or absence of a trade can either prevent or allow another trade to be taken. This is particularly true when entries are taken at market, especially when the entry condition is "true". Such strategies rely on the exit logic, so that if one trade is off by a bar, the next trade will be delayed by one bar, and so on. In this way, a small calculation difference can lead to entirely different results. One way to handle this possibility is to stress test strategies after building them. Strategies that do poorly under stress testing may be too "fragile" for real life trading.
When I tried to run a strategy in TradeStation, I got an error message "Tried to reference more bars than allowed by current Max bars back setting." In MultiCharts, the error is "Tried to reference back more bars than allowed by current MaxBarsBack setting."
The max bars back (MaxBarsBack) setting in TradeStation and MultiCharts refers to the number of bars required to start the calculations. You need to set this to the value listed in Builder in the performance tables under MaxBarsBack. The same value is also listed in the comment block at the top of the strategy code. In TradeStation, you enter the value under "Maximum number of bars study will reference" in Format Strategies, Properties for All. In MultiCharts, the value is entered under Format Signal, Properties ("Maximum number of bars study will reference"). This will insure that the calculations start on the correct bar. Although the value calculated by Builder is accurate in nearly all cases, it occasionally represents an approximation and may need to be increased slightly to avoid the error message.
I selected the exit end-of-day order type, but my trades don't exit at the end of day in real time trading. What can I do?
First, the exit end-of-day order type is not available in MetaTrader. For MetaTrader strategies, the "Exit after" option on the Strategy Logic drop-down menu should be used to exit intraday strategies at the end of the day or at a specified time. For TradeStation and MultiCharts, the "Exit end-of-day" order type on the Order Types menu in Builder causes the program to include the SetExitOnClose command in strategies. This command is mostly for back-testing purposes. In real time trading, it causes a market order to be generated on the close of the last bar of the current session. However, by the time the order is sent, the market has already closed, so the order is not filled. A work-around technique that some traders use is to define a custom session that ends a few minutes prior to the actual session close. Then the SetExitOnClose command will have time to exit your position prior to the end of the actual session. You just need to make sure to correctly set the session end time in Builder for the custom session, and, of course, the chart in TradeStation/MultiCharts has to use the same custom session as in Builder in order to avoid discrepancies between the results in Builder and those in TradeStation/MultiCharts.
A simpler approach is to use the "Exit after" option on the Strategy Logic drop-down. Set the time to at least one bar prior to the end of the session. That will trigger an exit prior to the end of the session.
If the stops are too large, the easiest solution is to reduce the maximum stop size on the Parameter Ranges window. There are separate parameter ranges for fixed size, percentage, and price-based stops. You can also set a target for the Max Loss metric. For example, if you want no more than 9 points loss on trades in the E-mini S&P, you can set a target for the Max Loss metric of $450 (i.e., 9 points x $50 per point). Alternatively, you can try including the Ave MAE (maximum adverse excursion) in the build goals. The Ave MAE is a measure of the intra-trade drawdown. There is also a Max MAE metric (maximum value of the MAE over all trades).
If the problem is that you're not getting protective stops in your strategies, you can include any selected exit type in all strategies. To include a protective stop, just select the protective stop in the "Include" column on the Order Types window.
The exit time option allows you to set an exit time for your trades. If, for example, you set the time to 3:00 pm, the strategy logic will be modified so that exits take place after this time. However, it's important to keep in mind that the time stamp on bars is typically the time the bar closes. For example, if you're using 30 minute bars, a bar time of 3:30 pm means the bar closes at 3:30. Since it's a 30 minute bar, that means it opens at 3:00 pm. The exit time option causes a trade to exit on the next bar's open if the time of the current bar is greater than or equal to the exit time. So if you've specified an exit time of 3:00 pm, the trade will exit on the open of the 3:30 pm bar (assuming 30 minute bars). The exit time will be listed as 3:30 pm because that's the time stamp on the bar, but the actual time will be a moment after 3:00 pm, which corresponds to the open of the 3:30 pm bar.
Also keep in mind that a trading strategy can only trade the bars of price data it has. If you're using 60 minute bars that end on even hours (e.g., 2:00 pm, 3:00 pm, 4:00 pm, etc.), and you specify an exit time of 3:15 pm, your trades will not end at 3:15 pm because there's no bar with that time. In this case, the trade would exit on the open of the 5:00 pm bar, which would be a moment after 4:00 pm.
If your data has been exported from MetaTrader 4, the bar time is the time the bar opens. However, the logic works the same way as described above, and the results should be the same for the same exit-time value.
The option to limit the number of entries per day uses the EntriesToday function in EasyLanguage or the equivalent function for other languages. The strategy code checks to make sure the current value is less than the specified limit before placing the orders. However, it can still place two orders – one long and one short – if both entry conditions apply, either of which or both may be filled, depending on the market. That means you could get up to two entries if both are filled, which could result in as many as four entries for the day.
The program never replaces the top strategy in the population. However, after new strategies are added, the top strategy may change, which means the top strategy from a prior generation may no longer be the top strategy in the current generation. The strategy to replace at each step is chosen as the least fit member among a small number of randomly chosen members. The number of such members is given by the so-called tournament size, which can be changed on the GP Settings drop-down menu. To decrease the likelihood that one of the top strategies might be replaced, you can increase the tournament size. The default size is 2. Increasing it to a high number is not recommended and may hurt the performance of the program.
If many or all of your final strategies are the same or similar, you probably need to reduce the number of generations or use the Build Termination Options on the GP Settings menu. After a number of generations, the results will often tend to converge, resulting in duplicate strategies. This can also happen if insufficient variety is in the initial population. To get more variety in the initial population, either increase the population size or make sure that the build sets (indicator and order) have not been overly restricted by removing too many items. It may also be possible to increase diversity in the final set of strategies by increasing the mutation rate and decreasing the crossover rate.
Depending on the market, time frame, and other factors, it's always possible that a trading strategy will stop working at some point and need to be rebuilt or re-optimized. The user's guide includes a section on this topic. One approach involves tracking the trailing performance characteristics of the strategy and rebuilding or re-optimizing when the results start to differ significantly from the long-term averages. A simpler approach is to track the equity curve and look for deviations from straight-line performance. If the strategy needs to be rebuilt, it's just as easy with Builder to create a new strategy as it was to develop the original one.
One point to keep in mind: if you try to re-optimize a strategy's parameter values before the strategy starts to underperform, there's no reason to think you'll get different results (assuming it's already optimized) if you re-optimize over the same data. You can either re-optimize over more recent data while dropping the earlier data from the date range or wait until the strategy has been underperforming sufficiently that the optimization process is likely to find better parameter values over the same data than those you previously found.
No. Any changes made to the settings, such as build goals or strategy options, have no effect on an ongoing build. However, if you stop the build then restart it, any changes you've made will be picked up and used in the new build.
When I compile my MT4 strategy, I get warning messages about functions that have been deleted from the file. Is there something wrong?
No. Those messages can safely be ignored. The include file for MetaTrader 4 contains functions for all the different order types any strategy created by Builder might need. No single strategy will use all the different order types, so the MT4 compiler removes the functions for the order types that are not used. The warnings are simply telling you that those functions have been removed from the compiled strategy code. The functions have not been removed from the include file itself.
The AmiBroker Formula Language (AFL) makes it very easy to write simple strategies, provided they're consistent with the underlying design of AFL. However, more complex strategies can be very difficult, if not impossible, to construct. The degree of complexity required by Builder-generated strategies makes it impractical to allow AFL strategies that include both long and short trades in the same strategy. Of course, you can generate separate populations for long-only and short-only strategies if you plan to trade both sides of the market. Because strategies can only be long-only or short-only in AmiBroker-generated Builder code, the option to "Wait for exit before entering new trades" is always checked. Unchecking it would only be useful for stop-and-reverse strategies containing both long and short trades.