Formula Basics

Five types of formulas exist:

      QFormulas

      Conditions

      User Values

      Custom Studies

      Trade Systems

 

For our purposes, a formula can be either:

      a mathematical calculation, e.g. addition or division to reach a numerical value;

      a logical calculation, e.g. greater than or AND to reach a true/false value; or

      a parameter (in the case of user values).

Formulas are applied to bars on charts and return either a value or an indication of a true condition.

 

Formula Components

Formulas are made up some combination of:

      symbols

      bar values

      mathematical, relational, logical, and movement operators

      offsets

      functions

      variables

      parameters

      comments

      studies

      other custom formulas

 

Consider these the building blocks of formulas.

Formulas are created on Formula Builder. Components can be typed manually, or you can use the toolbox to help build formulas.

Symbols

Formulas include either a specific symbol or the symbol placeholders (@).

Symbols must be entered in capital letters. Lowercase symbols display the inverse contract value. The system automatically defaults to all capital letters.

When the placeholder is used, the symbol is inherited from the application the formula is being used in.

For example:

This QFormula uses specific symbols: SPREAD(CLEM-2*CLEN+CLEQ,,,1:2:1)

This user value uses the placeholder: (High(@) + Low(@) + Close(@))/3

You can also use question marks:

?

Offset to most active contract

??

Offset to most active contract, includes cash/spot

 

In Formula Builder syntax preferences, symbols are included in the Identifier group.

Bar values

Comments

Bar values represent the outputs of chart types. For example:

      Bar: Last

      Bar: TrueRange

      Bar: CurrentBestAsk

      CVB: Open

      Heikin-Ashi: Mid

      Spread Bar: HLC3

      TFlow: BestBidPrice

      TFlow: DomBidVol1

Within formulas, bar values are formatted like this:

      Last(@)[-1]

      TrueRange(@)

      CurrentBestAsk(@)

      CVBXOpen(@,10)

      HAMid(@)

      SBHLC3(@,5X)

      TFBestBidPrice(@,TFlowSimpleAggregation,1)

      TFDomBidVol1(@,TFlowSimpleAggregation,1)

Bar parameters are also indicated. For example,  (@,TFlowSimpleAggregation,1). These parameters can be changed.

Bar values also include three studies: Bar, CVB, and TFlow External Data.

Note about Current Values: Current values (such as CurrentBestAsk, CurrentBestBid, and CurrentTickVol) were designed especially for building trade systems. As input variables in trade systems, the current bar values recalculate on every tick within the trade system regardless of recalculation settings (Setup > Chart Preferences > Recalc). Regular bar values follow the recalculation mode setting.

Bar values have no special syntax highlighting.

Operators

Operators create relationships between formula components. You can type operators in a formula, or you can insert them using the Toolbox.

In Formula Builder syntax preferences, mathematical and relational operators, commas, and question marks are included in the Operator group. Logical and movement operators are in the Keyword group.

Order of Operations

Mathematical (numerical value)

Operator

Meaning

Example

+

addition

Close(@) + High(@)

-

subtraction

MA(@,Exp,15)-MA(@,Exp,60)

*

multiplication

2.5 * Close(@)

/

division

Range(@)/2

Relational (true/false)

 Operator

Meaning

Example

greater than

Range(@) > .987

=

equals

Hour(@) = BHour AND Minute(@) = BMinute

<=

less than or equal to

Close(CUS10Y) - Close(CUS02Y) <= Threshold

<> 

not equal

IF(LO <> LO[-1], LO-HI, IF(HI<>HI[-1],HI-LO, none))

>=

greater than or equal to

ADX(@,Period) >= Threshold

Logical (true/false)

To illustrate these operators as clearly as possible, the variables A and B have been added.

Operator

Meaning

Example

A AND B

True when both A and B are true

High(@) < High(@)[-1] AND Low(@)  > Low(@)[-1]

A OR B

True when either A is true or B is true

Low(@) < Low(@)[-1] OR High(@) > High(@)[-1]

NOT B

Exclude B

NOT Close@ > Open@[-1]

A WHEN B

If B is true, then A is true

High@[-1] WHEN RSI(@,5) XBELOW 75

IF(A, B,C,)

This operator creates:

 - one IF statement A

 - one THEN statement B, in the case A is true

 - one THEN statement C, in the case A is false

So,

If A = T, then B

If A = F, then C

IF(Low(@) = LoLevel(@,10,0), 0, none)

 

You can type these operators in a formula, or you can use the Toolbox.

Movement (true/false)

Formula

True When…

Example

A XABOVE B

A crosses above B

RSI(@,21) XABOVE 25,

A XBELOW B

A crosses below B

RSI(@,21) XBELOW 75,

A GOINGUP

A is greater than previous A

MAx1(DD,Sim,5) GOINGUP

A GOINGDN

A is less than previous A

MAx1(DD,Sim,5) GOINGDOWN

A GOINGUP B

A has been greater than the previous A for B consecutive times

Close(@)GOINGUP 3

A GOINGDN B

A has been less than the previous A for B consecutive times

Close(@) GOINGDOWN 3

A TURNSUP

A is greater than the last A, and the last A is less than two As ago

ADX(@,10) TURNSUP

A TURNSDN

A is less than the last A, and the last A is greater than two As ago

ADX(@,10) TURNSDOWN

 

You can type these operators in a formula, or you can use the Toolbox.

Offsets

Offsets identify which bar to apply the formula to.

An offset is indicated by using brackets [ ] around the offset value.

The offset value can be negative (for a bar in the past), positive (for a bar in the future), or zero (for the current bar). It is not necessary to indicate the current bar, as it is the default.

For example: High(@)[-2] = high of two bars ago

Functions

Functions represent the outputs of pre-defined functions. For example:

      Bars Since

      DOM Bid Volume

      Maximum Since

      Net Change

      Spread

      Standard Deviation

      Yield

Within formulas, functions are formatted like this:

      BarsSince(@,1,400)

      DomBidVol(@,1,Single,1.0_secs)

      MaxSince(@,none)

      NC(@)

      SPREAD(@)

      STDDEV(@,8)

      Yield(@)

Function parameters are also indicated. For example,  (@,1,Single,1.0_secs). These parameters can be changed.

Variables

A variable is a temporary value used to simplify complex, nested formulas.

A colon (:) is placed after the variable and a semi-colon (;) is placed at the end of the expression.

For example:

x:=MA(2, Sim, 7);

y:=close(@)[-5];

z:=x+y;

So, z = MA(2, Sim, 7) + close(@)[-5]

Variables do not apply across formulas, as user values do. So, x could mean three different things in three different formulas.

Parameters

Conditions, User Values, Custom Studies, and Trade System can include parameters.

For example: B.cqg.HVolLOw

In

HVOL(@,Percent,HVPeriod,AnnFactor) <  (1+Percent) * LoLevel (HVOL(@,Percent,HVPeriod,AnnFactor),Lookback,0)

HVPeriod, AnnFactor, Lookback, and Percent are parameters.

In Formula Builder syntax preferences, parameters are included in the Identifier group.

Comments

Comments are set off by /* and */.

There are two types of comments: those automatically generated by the system and those you add yourself.

For example, typing

SPREAD(

automatically generates

/* SPREAD(linear expression, [calculation mode], [tick size], [trade ratio], [BAT filter], [roll-over], [rounding mode])

Examples:

      SPREAD(42*HOE-CLE, L1, 0.01, 1:2, T:BA, 1)

      SPREAD(EP-ENQ, L1, 0.01, 1:1.33, T:BA, 1, MATH)

      SPREAD(EP/ENQ) */

SPREAD(@)

You can turn off auto-generated comments in Formula Builder preferences.

Studies

Studies represent the outputs of pre-defined studies. For example:

      Moving Average

      Moving Average Top Envelope

      Momentum

      Momentum Oversold

      RSI Divergence Down

      Filtered Bid Volume

Within formulas, studies are formatted like this:

      MA(@,Sim,21)

      MATE(@,Sim,21)

      Mom(@,10)

      Mom_OS(@,10)

      RsDivDn(@,1,5,25,75,25,Sim,1,9)

      VolFiltBid(@,0)

Study parameters are also indicated. For example,  (@,1,5,25,75,25,Sim,1,9). These parameters can be changed.

Other custom formulas

Formulas can be components of other formulas.

      When you add a condition to a formula, prefix it with B, like this:

B.Condition(@)

      When you add a user value to a formula, prefix it with V, like this:

V.UserValue(@)

      When you add a study to a formula, format it like this:

STUDY.CURVE^(@)

CustomStudy.Average^(@)