Release Notes



BarOffsetStart provides incorrect offset for a daily inner period on a monthly chart.

Printing charts with indicators using per-bar-colored filled areas can produce unexpected fill effects.

Equilla compiler generates incorrect code for function inputs if any function variable is initialized using a function.

Unhandled exception when using seasonal projection indicator and setting its percent performance mode to on.



BarOffsetEnd() may ignore an inner period bar the spans past the end of a session.



Correlation matrix restores Font Size and Show Symbols properties to the wrong container.



The optimizer can display a larger number of steps than actually performed when using walk-forward optimization with a large number of threads.

Incorrect sample sizes shown in the walk-forward optimizer wizard when re-running the optimizer and using a large history length override.



Loading a workspace with a portfolio containing a non-portfolio indicator on an instrument that fails to open due to a feed error, causes an exception message to be displayed.



Incorrect rendering of per-bar colored lower line from the DrawArea function.



Equilla debugger does not understand some loop optimizations and can ignore some iteration steps as a result.



BarStatus always returns BarStatusError when bound to a member of an instrument list.



Indicator "history too short" error unintentionally also prevents incremental updates to unrelated indicators in the same chart.

Opening a workspace on a different device with symbols that get replaced with a fallback symbol, causes COM extensions to not be notified about symbol state changes.



FeedName and InstrumentDefinition return an empty string when the Equilla script is evaluated in the optimizer.

Unhandled exception when running an optimizer and an instrument is temporarily unavailable from the data feed.

Tick/volume bar rolls at session midnight (instead of the normal session daily roll time) when transitioning from the last to the first session.



Items in the Evaluation order dialog are not grouped for portfolio when opened via the Remove button.

Very long Equilla source code (~15k lines) significantly slows down the editor.

Slow initial show of the code completion window.



Renaming a symbol in a symbol list sets the name to be the display name instead of the chosen name.

Chart indicates perpetual loading instead of a helpful message when it contains two indicators that cannot load because each references the other in a SelfList.



Show attribute is not applied to all inputs in the block when an instruments block follows the input blocks.



Quoted inline instruments sometimes behave erratically when used on calculated chart types views of TeleTrader UDCs.



Unhandled exception when updating Code Editor inline function syntax during a delete operation.

Applying optimizer result filter may fail if the query filter is modified to contain an empty from clause.

Some orders may not be reported as placed when mixing stop and limit entry orders.

Optimizer result import failed because of inconsistent user statistics.

Error when trying to optimize a strategy that loads a UDC as an inline instrument from a script running on a Heikin Ashi version of the same UDC.

Duplicated initialization when loading UDC instruments as inline instruments in scripts.



Periodic symbol list refresh can cause lock-up when an Equilla script uses more than one inline symbol list.



Add ICE Futures Europe to Interactive Brokers exchanges.


Tools drawn on points that do not exist in their parent's time series do not reappear when their maximized sub-chart is restored.

Target cursor window rounds visible filled order price to one decimal place less than a manual set tick size would imply.

Instrument variables assigned to function variables in a changing data context are generated non-data context aware.



ClearOutput() run during the initial full historic evaluation, does not clear output generated as part of the full evaluation, even if a restart is triggered.

Equilla NetProfit shortcut incorrectly returns the OpenEquity value instead of the AllTrades::NetProfit value.



Exception reported when reconnecting after showing a dialog containing a symbol list viewer.

Formula symbol inputs get reset to default values when changed.



Symbol chart type running in seasonal mode may show additional data points at the start and end of the season.



Portfolio item number and size-related Equilla functions only reflect the most recent portfolio state even during historic evaluation.



Insight window not shown for Draw functions with a data shift.



Compiling specific indicator causes unhandled exception while linked to scanner.

P&F chart can have vertical gaps when box size mode is logarithmic.

Equilla Settlement keyword used in a data field context generates a compiler error.



Scheduled print task fails with timeout error.



Client overridden Lot Size is not applied correctly.



Renko Bricksize will not be recalculated after changing chart type, replacing symbol, then changing back to Renko.

Performance Report shows some 0 profit trades as profitable trade (REGRESSION).


Documentation fixes.



Not possible to clear an advanced scanner filter.

Newly typed recipient address in the test email dialog is cleared on non-tab key focus change if no other address is present.

Symbol list control occasionally not garbage collected.



Forward curve created from custom symbol list via symbol toolbox context menu does not support forward curve specific property changes.

Incorrect drawing of ATR based P&F chart with minuscule prices.

TradeableTimestamps not found in help via text editor Lookup Keyword function.

Potential for object leaks when receiving specific events from an automatic order router.



Constant indicator’s input has been renamed

When loading a workspace that uses the “Constant” indicator from a prior version of the software, if when asked to use the newer version of the indicator, yes is selected, the input value of the indicator will be reset to its default value.



Chart glyph tool

The chart glyph tool allows a sizable symbol to be inserted into a chart. Clicking on the symbol will present a list of alternative symbols to swap between.

Fibonacci Wedge tool

The Fibonacci Wedge tool allows a wedge shaped region to be defined in the chart (with normal extension possibilities). Fibonacci arcs (with optional labels) are shown within the wedge.

Forward Curve wizard contract filters

The forward curve wizard now has an addition page that allows additional specification of which contracts should be included in the forward curve. Depending on the period of the contract, specific quarters, months or days of the week may be included.

Filter strategies based on applicability to the focused document

A new checkbox next to the strategies sidebar search box allows the user to filter the list of visible strategies to only include items that are applicable to the currently focused document in the workspace. Toggling the filter will show all available strategies.

Portfolio optimized versions of various trading strategies

Various trading strategies have been duplicated and optimized for using in large portfolios:
  • Adaptive Moving Average Simple Portfolio
  • Bollinger Band Breakout Portfolio
  • Channel Breakout Portfolio
  • Cyber Cycle Inv Fisher Portfolio
  • Cyclical System Portfolio
  • Dynamic Breakout System Portfolio
  • Fractal Adaptive Band Breakout Portfolio
  • Hilbert Channel (Signal) Portfolio
  • Intraday Reversal Portfolio
  • MACD Crossover Portfolio
  • Momentum Zero Line Crossover Portfolio
  • Moving Average Double Cross Portfolio
  • Moving Average Pullbacks Portfolio
  • Moving Average Single Cross Portfolio
  • Open Price Gap Portfolio
  • Parabolic Reversal Portfolio
  • Penny Stock Breakout Portfolio
  • Relative Strength Index Zone Portfolio
  • Sell in May and Go Away Portfolio
  • Stochastic RSI System Portfolio
  • Stochastic S&C System Portfolio
  • Trend Trigger Factor Portfolio
  • Universal Cycle Index Zone Portfolio
  • Volatility Breakout Portfolio
  • Volatility System Portfolio
  • Volume Flow Break From Base Portfolio
  • Volume Flow Crossover Portfolio
  • Volume Flow Divergence Portfolio
  • Pos Size Fixed Fractional Pct Portfolio
  • Pos Size Fixed Fractional Portfolio
  • Pos Size Fixed Pct Portfolio
  • Pos Size Fixed Risk Portfolio
  • Pos Size Market’s Money Portfolio
  • Pos Size Pct Volatility Portfolio

Trade Span indicator

The Trade Span indicator draws lines from the entry to the exit of each completed trade.

Monte Carlo Trade Shuffling in the Performance Report

The performance report Equity by Trade graph now has a mode to generate multiple versions of the equity curve based on shuffling the trades in different orders. To enable Monte Carlo Trade Shuffling, set the corresponding property to “Yes” and set the Monte Carlo Samples property to the desired number of reshuffled equity curves (default 50).

Trade duration column in the performance report

The trades view in the performance report has a new column called duration, that contains the elapsed duration of each trade. The column can be sorted.

Quantity weighted average column summary for trade entry and exit fill prices in the performance report

Right-clicking on the footer of the entry or exit fill column in the performance report trades view, will now allow the choice of a quantity weighted average (in addition to average, sum, min, max, etc.).

Periodic returns mode for the Equity By Date chart in the Performance Report

The equity by date graph in the performance report has a new mode property that can be changed between one of the following values:
  • Equity - Show the normal equity by date chart (default)
  • Monthly Returns - Show the % gain by month chart
  • Quarterly Returns - Show the % gain by quarter chart
  • Yearly Returns - Show the % gain by year chart
In addition all graphs have a new Chart Type option to display Bar charts.

Fill continuation/rolling symbol dialog root symbol if predefined future symbol list is focused

The root symbol in the continuation/rolling symbol dialog will be initially filled based on the current selection in the symbol list sidebar (if any). If a future contract or contract list is focused, its root will be used to fill the dialog. This behavior will only apply to creating a new symbol using “Home > Data > Symbol Search > Add User-defined Continuation symbol” (or rolling forward symbol).

Property to scale the pixels in the optimizer heatmap

The new optimizer results property “Heatmap scaling” can be used to make each of the points in the optimizer heatmap larger by the multiplier selected (1 being the original size). Each point will remain centered where it was originally centered (with no scaling) and points may overlap as a result of scaling. This option is useful when using Monte Carlo optimization with a very low ratio of samples to total search space, which would result in a significant amount of empty space with otherwise tiny data points.

Focus corresponding portfolio item when selecting an order or position in a position manager

Double clicking or pressing the “View In Chart” button on a row in the position manager, will focus the specific item in a portfolio if it is currently not visible.

Multi-select in the watchlist and scanner Add/Remove Columns Dialog

The Add/Remove Columns dialog in the watchlist and scanner now allows multiple items to be selected (by holding Shift or Ctrl). The two new buttons on the dialog, Check and Uncheck, can then be used to toggle the check boxes for all selected items in one go.

Mark the row in the optimizer that was last used to update the linked chart and provide a context menu option to goto this line

When an optimizer result row is used to update a linked chart, the row will now be marked, so that it can be more easily found in future. To automatically scroll to the last applied result row, right-click to show the context menu and select Goto Line.

Fill symbol fields in the formula symbol wizard with selected symbols in the symbol toolbox

If the symbol toolbox is focused and one or more symbols are selected (use Ctrl-Click on Shift-Click to multi select), then the “Add Formula Symbol” dialog (Home > Data > Symbol Search > Add Formula Symbol) will have any symbol fields filled with the selected items form the symbol toolbox. The symbols will be filled in the order they were selected (Ctrl-Clicked).

Contract Weight instrument property

Instruments supporting a price weight multiplier (such as some energy contracts) will now use that multiplier in trade price calculations (purchase price = list price x lot size x contract weight). Use of this field can be disabled on an instrument-by-instrument basis by selecting the instrument and setting “Home > Data > Sessions > Properties > Contract Weight” to “Ignore Contract Weight”.

Check suitability of local Python installation

If a user has selected to use a local Python installation instead of the embedded version, the application will attempt to validate if this local version is correctly set up to work with applications such as Tradesignal. If a problem is found, the user will be presented with an option to use the embedded Python instead or to be shown some tips on common fixes and to stop the application so they may be tried.

Drag and drop optimizer result row to configure a chart’s strategy inputs

To facilitate comparative equity curve analysis for optimizer results, two or more charts may be opened from the optimizer and then specific result rows may dragged and dropped from the optimizer grid onto each of the charts. Ref indicators in a further chart may be used to consolidate results into a single output chart.


Function keyword to define inline functions in Equilla scripts

The function keyword allows user functions to be defined and used within another indicator, strategy or function. Functions created in this way are only accessible from within the file that they are defined in, and in the case of inline functions defined in other inline functions, only in the same scope they are defined in. Functions must be declared before they are used in a script. Below is a simple SMA indicator, that shows how the function keyword is used:
    Price( Close ),
    Period( 10 );

Function mySMA Begin
        Price( NumericSeries ),
        Period( NumericSimple );

    mySMA = Average( Price, Period );

DrawLine( mySMA( Price, Period ) );

Return keyword for Equilla functions

The return keyword stops execution of the function in which it appears, sets the result of the function and returns control to the function caller.
return [<result-expression>]
The return keyword can be used in either user functions (files) or inline functions. The result of result-expression is used to set the result of the function. If no result-expression is set, the function will return the value zero.

The following example demonstrates a function using the return keyword to set the result value only, note that it is the last instruction in the function (in this case):
Function GetRange Begin
    Print( "getting high low spread" );
    Return High - Low; // Same as GetRange = High - Low
The following example, demonstrates using the return keyword to exit the function before all statements are processed, no argument for the return statement means it will set the result of the function to “0”.
Function EndEarly Begin
    Print( "Now you see me" );
    Print( "Now you don't" );

Switch statement in Equilla scripts

The switch keyword allows multiple conditions to be associated with a single test variable. The variable to be tested is placed after the switch keyword (in parentheses), then various case clauses are listed with their associated statements to execute if the case is met.
Switch ( <expression> ) Begin
    Case <case-expression>: <statements>;
    [Case <case-expression2>: <statements>;]
    [Case <case-expressionN>: <statements>;]
    Default: <statements>;
Only the first case that matches the test variable will be executed. Case statements can list exact variable matches (or comma separated lists of matches), inclusive ranges, operators (&lt; > <= >= <> =) or the results of function calls. A special default case can be specified if nothing else matches.
Switch ( Value1 ) Begin
    Case 1 to 5:
        Value2 = Value2 + 1;

    Case 10, 20, 30:
        Value3 = Highest(High,10);

    Case is > 40:
        Value3 = Value3 + 1;

    Case <> Average( Close, 10 ):
        Value3 = Value4 + 2;

        Value5 = Value5 + 1;

Const keyword in Equilla scripts

The Const block allows constant values to be assigned to a symbolic names for use in an indicator, strategy or function. Values in a Const block can be initialized in the same way as in variable blocks, including using the result of a constant retuning function. Const values cannot have their value changed later in a script (this is the main difference from variables). The Const block can be declared as Const, Consts, Constant or Constants.
Const: Pi( 3.1416 );

Constant: SecsPerDay( 24 * 60 * 60 );

    MontyPythonOne( 1 ),
    MontyPythonTwo( 2 ),
    MontyPythonThree( 5 );

    NineX = "xxxxxxxxx",
    TwoPointThree = 2.3,
    VeryTrue( True );

Input: Number( 1, 1 );
Const: BinaryNumber( IFs( Number % 2 = 0, 1, 0 ) );

Break keyword in Equilla loops and switch statements

The break keyword terminates the execution of the nearest enclosing loop or switch statement.
  • In a Switch statement, moves to the next statement after the switch end.
  • In loops (for, while or repeat), Break terminates execution of the loop containing the Break statement and moves to the next statement after the loop.
  • Within nested statements, Break terminates only the loop/switch that immediately encloses it.
In the following example, only the values “1” through “6” and “Done” will be printed:
Variable: i;

Once Begin
    For i = 1 To 9 Begin
        Print( i );
        If i = 6 Then
    Print( "Done" );

Continue keyword in Equilla loops

If the Continue keyword is encountered, the remaining statements of the loop will be skipped and the loop is re-evaluated. In a Repeat loop, the Until expression is evaluated and, if needed, the next iteration of the loop proceeds.

In the following example, the Print statement before the Continue is executed 5 times. The Print statement after the Continue is never shown:
Variable: i( 0 );

Once Begin
    While i < 5 Begin
        i = i + 1;
        Print( "Before the continue, i:", i );
        Print( "Message that never gets printed" );

    Print( "Loop example complete!" );

Settlement exit orders for time-limited and rolling products in Equilla scripts

Settlement exit orders are a special type of action that indicate how an open position should be closed when a product is held untill settlement.

Settlement exit orders have a syntax similar to other exit orders, the main difference being the price specified is the effective price at which the position should be booked when settlement occurs (i.e. if the position has not been exited normally prior to settlement).
<exit command> [From <entry name>] Next Bar on Settlement at <price>;
  • exit command - One of ExitPosition, Sell or Cover.
  • entry name - Optional entry from which to exit.
  • price - Price at which to book the virtual exit.
It is entirely up to the strategy author how they want to book a position held to settlement, e.g. as a loss (price set to zero) or perhaps to book it against the average entry price (as is the case when backtesting many procurement systems).

Settlement exit orders will not incur commission or slippage in their calculation, they are a synthetic method to balance the books.

Settlement exit orders will trigger on instruments that expire, such as futures contracts, they will also trigger on instruments that roll, such as user-defined continuations. In the case of rolling instruments, the settlement order will trigger at the given expiry date of the underlying contract, which may be after the roll date, the settlement actions will occur at each historical expiration dates.

For example, the following strategy will exit all positions held to expiry using a differing booking method for long and short orders:
Cover Next Bar on Settlement at EntryPrice;
Sell Next Bar on Settlement at 0;
The following strategy will exit at the average entry price:
ExitPosition Next Bar on Settlement at AvgEntryPrice;

Conditional Once keyword

The Once keyword now supports an optional conditional expression as an argument (surrounded with parentheses). The one-time evaluation of the statement following the once keyword will only be performed the first time this conditional expression evaluates to true.
Once ( MarketPosition = MarketPositionLong ) Begin
    Print( "First time long!" );
Omitting the parentheses and expression will cause the once keyword to perform as before.
Once Begin
    Print( "First and only print!" );

ForwardCurve() function contract filters in Equilla scripts

The ForwardCurve() function now has an additional optional parameter that may be used to provide filtering information as to which contracts should be included in the forward curve. Depending on the period of the contract, specific quarters, months, weeks of the year or days of the week may be included (or explicitly excluded).
// Only use March and September contracts in the forward curve
    fc( ForwardCurve( "FDXc1", Default, Default, Default, Default, Default, "M+HU" ) );

DrawSymbol( fc, "FCurve", SymbolDot + SymbolJoined );

ToolInterpolateValue() function to return a script drawn trendline value on a specific bar

Returns a value corresponding to the value of a trendline at a specific datetime value.
ToolInterpolateValue( <toolid>, [<datetime>] );
This function returns a value even if the trendline is not shown on the bar specified. When the function cannot perform its operation, it returns Invalid.

Switch( CurrentBar ) Begin
    Case 10:
        tl = DrawTrendline( DateTime[4], Close[4], DateTime, Close );

    Case 20:
        Print( ToolInterpolateValue( tl ) ); // this bar with no optional argument
        Print( ToolInterpolateValue( tl, DateTime[1] ) ); // last bar with DateTime
        Print( ToolInterpolateValue( tl, Date[2], Time[2] ) ); // 2 bars ago with Date and Time

Relative path to the output file in the PrintToFile() function

The PrintToFile() function now supports relative paths for its file argument, so now it is possible to specify a sub-folder to the file, e.g. “myfolder.txt” or “myfolder.txt” instead of just a file name. If the folders are not present, they will be created. The function will still only create files and folders starting at the path specified under “File > Options > Folders > Equilla > PrintToFile”.

RolloverCount() function

The RolloverCount function returns the number of contract rollovers that have occurred during this bar.
Each of the other rollover related functions support an argument to reference a specific rollover on the current bar (for example day-ahead contracts rolling within a monthly interval bar), the RolloverCount function is used to allow iteration over all rollovers in a for-loop.
Variables: i;
For i = RolloverCount - 1 DownTo 0
    Print( "Contract Rollover:", RolloverDate( i ), "Expiry:", ExpiryDate( i ) );

RolloverDate() function

The RolloverDate function returns the DateTime of the rollover of the instrument on the current bar.
RolloverDate( [<rollover>] );
  • rollover - Optional index of the underlying contract when multiple rollovers occur in a bar (0 is the current underlying, RolloverCount - 1 refers to the earliest contract that rolled this bar).
For expiring instruments (such as future contracts), the RolloverDate will normally be the same as the ExpiryDate. For rolling instruments (like user-defined continuation), the RollingDate will be the DateTime determined by the instruments custom rolling criteria.

ExpiryDate() function

The ExpiryDate function returns the DateTime of the expiry (last trading datetime) of the instrument (or underlying in the case of rolling instruments) on the current bar. The ExpiryDate keyword did exist as an instrument property in earlier versions of the application, it is now changed to an instrument-aware function with an optional argument.
ExpiryDate( [<rollover>] );
  • rollover - Optional index of the underlying contract when multiple rollovers occur in a bar (0 is the current underlying, RolloverCount - 1 refers to the earliest contract that rolled this bar).
For rolling instruments (like user-defined continuation), the ExpiryDate will be the DateTime of the current underlying contract.

LotSize() function

The LotSize function returns the contract size of the instrument (or underlying in the case of rolling instruments) on the current bar. The LotSize keyword did exist as an instrument property in earlier versions of the application, it is now changed to an instrument-aware function with an optional argument.
LotSize( [<rollover>] );
  • rollover - Optional index of the underlying contract when multiple rollovers occur in a bar (0 is the current underlying, RolloverCount - 1 refers to the earliest contract that rolled this bar).

ContractWeight() function

The ContractWeight function normally returns the contract-period multiplier of the instrument (or underlying in the case of rolling instruments) on the current bar.
ContractWeight( [<rollover>] );
  • rollover - Optional index of the underlying contract when multiple rollovers occur in a bar (0 is the current underlying, RolloverCount - 1 refers to the earliest contract that rolled this bar).

SessionCount() function

Returns the total number of sessions in a week for an instrument.

SessionCountDay() function

Returns the total number of complete sessions of a specified day.
SessionCountDay( <dayOfWeek> );
  • dayOfWeek - One of Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday.

SessionStartDay() function

Returns a numeric value representing the day of the week on which the session specified by its argument starts.
SessionStartDay( <sessionNumber> )
  • sessionNumber - The session to get the start day, a value of 1 to SessionCount is valid.

SessionEndDay() function

Returns a numeric value representing the day of the week on which the session specified by its argument ends.
SessionEndDay( <sessionNumber> )
  • sessionNumber - The session to get the end day, a value of 1 to SessionCount is valid.

SessionStartTime() function

Returns a numeric value representing the time of the day on which the session specified by its argument starts.
SessionStartTime( <sessionNumber> )
  • sessionNumber - The session to get the start time, a value of 1 to SessionCount is valid.

SessionEndTime() function

Returns a numeric value representing the time of the day on which the session specified by its argument ends.
SessionEndTime( <sessionNumber> )
  • sessionNumber - The session to get the end time, a value of 1 to SessionCount is valid.

ClosedTradeNetProfit() function

Returns the net profit of the specified closed trade.

ClosedTradeGrossProfit() function

Returns the gross profit of the specified closed trade.

Show() attribute to control visibility of an input based on the value of another input

The Show() attribute may be attached to an inputs block to indicate that the inputs in that block should only become visible in the property inspector (and chart legend) when other inputs have specific values. This feature will typically be used where a script has something like multiple different modes, each with there own specific additional inputs, and the inputs tied to a given mode only need to be visible when that mode is active.

The show() attributes argument is a boolean expression that must evaluate to true for the inputs in the block to be made visible. Only input variable may be used in the expression. The following operators may also be used: =, <>, And, Or, ().
    Mode( Simple, Advanced ),
    Period( 200 );

[Show( Mode = Advanced )]
    FastPeriod( 10 ),
    SmoothingPeriod( 5 );

If Mode = Advanced Then
    DrawLine( Average( Average( Close, FastPeriod ) - Average( Close, Period ), SmoothingPeriod ), "osc" )
    DrawLine( Close - Average( Close, Period ), "osc" );

Attribute syntax for Optimize, IntraBarPersist, Serialized and FullEvaluationPersist

The attribute-like keywords now use attribute syntax (surround with []) to bring them in line with other attributes. The old syntax (without square brackets) will continue to be supported.
  • Optimize -> [Optimize]
  • IntraBarPersist -> [IntraBarPersist]
  • Serialized -> [Serialized]
  • FullEvaluationPersist -> [FullEvaluationPersist]


“Get Support Information” to use a save as dialog and default to desktop location.

Text editor method insight for user functions does not understand enum declarations.

A single user function in a non-default data context, cannot be called from a for loop unless surrounded by a begin..end block.

Confirming the session dialog with provider sessions selected will merge consecutive sessions.