Type natural language or structured dot-notation to instantly build trading signal expressions.
Expressions follow the pattern: LEFT OPERATOR RIGHT with optional symbol and timeframe.
bullish engulfing > 0 // unary — candle / pattern flag (compare > 0) doji > 0 on EURUSD 15min RSI(14) < 30 SMA(50) > SMA(200) Close > SMA(200) on EURUSD 5min
When an AI/model generates expression JSON or dot-notation from this page, use these rules first.
| Case | Canonical Output |
|---|---|
| Regular indicators: RSI, SMA, EMA, MACD, ATR, BBANDS, STOCH, ADX, SAR... | Use GTSIndicators for every regular indicator. |
| Extended/subsystem indicators: InertialRsi, AdaptiveCentricMa, AdaptiveMacdR2, BreakOfStructure... | Use ExtendedIndicators. |
Decimal parameters such as SAR(0.02,0.2) | Use function syntax. Do not encode decimal params in dot notation because dots are separators. |
| Single value on a multi-param extended indicator | The value fills the first configured parameter; remaining parameters use defaults. |
| Subfields with spaces | Prefer compact aliases in text/dot notation: Upper, Lower, SenkouA, AroonUp. JSON may use the runtime field name. |
| Subfield case | Use the documented convention in generated dot notation: regular GTSIndicators subfields are capitalized (.Signal, .SlowK); ExtendedIndicators outputs are lowercase (.signal, .value). |
| Candle patterns | Canonical natural order is trend pattern, e.g. bullish engulfing. Dot notation is TA_CandlePatterns.PATTERN.Trend.Frame. |
| Negative fixed values | Use natural/formula syntax: openpnl < -500. Dot notation may use FixedVal.-500 for integers. |
LEFT OPERATOR RIGHT. Arithmetic (+ - * /) is not supported — use an indicator, field, or saved expression directly, not a calculation.LEFT and RIGHT must each be a single numeric field, fixed value, indicator, pattern, account field, or date/time value.0 — use > 0 or != 0, never == 100..signal, .value); do not invent subfields.Bullish when unspecified; write bearish <pattern> or both <pattern> to change it.GTSIndicators (RSI, SMA, EMA, MACD, ATR, BBANDS, STOCH...). Extended Indicators use ExtendedIndicators: advanced / subsystem indicators (adaptive smoothers, SMC-ICT structure, ML/regime).Use NAME(param) or NAME(p1,p2,p3) syntax. Subfields use .SubField.
| Indicator | Syntax | Default Params | Subfields |
|---|---|---|---|
| RSI | RSI(14) | 14 | — |
| SMA | SMA(200) | 20 | — |
| EMA | EMA(50) | 30 | — |
| MACD | MACD(12,26,9) | 12, 26, 9 | Macd, Signal, Hist |
| BBANDS | BBANDS(20,2) | 20, 2 | Upper Band (Upper), Middle Band (Middle), Lower Band (Lower) |
| STOCH | STOCH(14,3,3) | 14, 3, 3 | SlowK, SlowD |
| ATR | ATR(14) | 14 | — |
| ADX | ADX(14) | 14 | — |
| CCI | CCI(20) | 14 | — |
| WILLR | WILLR(14) | 14 | — |
| SUPERTREND | SUPERTREND(10,3) | 10, 3 | Trend, Direction, Long, Short |
| ICHIMOKU | ICHIMOKU | — | Tenkan, Kijun, Senkou A (SenkouA), Senkou B (SenkouB), Chikou |
| AROON | AROON(25) | 25 | Aroon Up (AroonUp), Aroon Down (AroonDown) |
| SAR | SAR(0.02,0.2) | 0.02, 0.2 | — |
| MFI | MFI(14) | 14 | — |
| OBV | OBV | — | — |
MACD(12,26,9).Signal > 0 // MACD signal line BBANDS(20,2).Upper > Close // Bollinger upper band STOCH(14,3,3).SlowK < 20 // Stochastic %K ICHIMOKU.Tenkan > ICHIMOKU.Kijun // Ichimoku crossover
Append a timeframe token at the end of the expression. With no timeframe, the expression runs on whatever frame the alert/strategy is configured for. (Full token list in §10 Timeframes.)
RSI(14) < 30 5min // 5-minute RSI EMA(50) > EMA(200) 1h // hourly EMA cross SMA(200) > Close Daily // daily SMA MACD(12,26,9).Signal > 0 15min // 15-minute MACD signal ATR(14) > 5 4h // 4-hour ATR
Omit the symbol and the expression runs on the symbol(s) the alert or strategy is configured for. For alerts you usually name the market explicitly with on SYMBOL.
// WITHOUT a symbol — runs on the configured symbol(s) RSI(14) < 30 RSI(14) < 30 5min // WITH a symbol (typical for alerts) — name the market, then the frame RSI(14) < 30 on EURUSD 5min Close > SMA(200) on BTCUSDT 1h
The same signal can be written in plain formula or in structured dot-notation.
| Notation | Example |
|---|---|
| Natural / formula | RSI(14) < 30 on EURUSD 5min |
| Dot-notation | GTSIndicators.RSI.14.5Min < FixedVal.30 |
| Multi-param + frame | GTSIndicators.MACD.12.26.9.15Min.Signal > FixedVal.0 |
GTSIndicators.NAME.param(s).FRAME.subfield. See §11 Dot-Notation.| Category | Indicators |
|---|---|
| Overlap / Moving Avg | ALMA, DEMA, EMA, FWMA, HMA, JMA, KAMA, RMA, SMA, TEMA, TRIMA, VWAP, VWMA, WMA, ZLMA, T3, SUPERTREND, ... |
| Momentum | RSI, MACD, STOCH, STOCHRSI, CCI, MOM, ROC, WILLR, TSI, KDJ, QQE, SQUEEZE, TD_SEQ, AO, BOP, ... |
| Volatility | ATR, BBANDS, KC, DONCHIAN, NATR, TRUE_RANGE, RVI, SQUEEZE_PRO, ... |
| Volume | OBV, MFI, AD, ADOSC, CMF, EFI, KVO, NVI, PVI, VPT, ... |
| Trend | ADX, AROON, ICHIMOKU, SAR, VORTEX, CHOP, DPO, LINREG, CKS, ... |
| Statistics | STDDEV, VARIANCE, ZSCORE, SKEW, KURTOSIS, ENTROPY, MAD, ... |
| Smart Money (SMC) | BOS, CHOCH, FVG, ORDER_BLOCK, SWING_HIGH, SWING_LOW, MSB, ... |
Advanced / subsystem indicators (adaptive smoothers, SMC-ICT structure, ML / regime). Use NAME(param) syntax in natural/formula input; use ExtendedIndicators.NAME... in dot notation. Each indicator exposes named subfields such as .signal, .value, .trend, .upper — use only the subfields listed for that indicator.
| Indicator | Syntax | Default Params | Subfields |
|---|---|---|---|
| InertialRsi | InertialRsi(14).signal | 5, 21, 3, 9 | signal, rsi |
| AdaptiveCentricMa | AdaptiveCentricMa(200).value | 14, 2, 2, 0.01, 0.5 | value |
| AdaptiveEmaSlopeBand | AdaptiveEmaSlopeBand(50).trend | 20, 80, 2 | trend, upper, lower |
| AdaptiveMacdR2 | AdaptiveMacdR2(20,12,26,9).signal | 20, 12, 26, 9 | macd, signal, histogram |
| QuantileVolatilityBands | QuantileVolatilityBands(100,2).upper | 100, 2 | upper, mid, lower |
| InertialStochastic | InertialStochastic(5,34,3,3).signal | 5, 34, 3, 3 | signal, k, d |
| TrueRangePercentile | TrueRangePercentile.percentile | default | percentile |
| BreakOfStructure | BreakOfStructure(5,5).signal | 5, 5 | signal |
| ChangeOfCharacter | ChangeOfCharacter(5,5).signal | 5, 5 | signal |
| SuperTrendAiClustering | SuperTrendAiClustering.signal | default | trend, signal |
| KalmanTrendFilter | KalmanTrendFilter.trend | default | trend, value |
| VolumeZscoreImpulse | VolumeZscoreImpulse.signal | default | signal, zscore |
AdaptiveMacdR2(20,12,26,9).signal > 0 // native MACD-style signal QuantileVolatilityBands(100,2).upper > Close // upper volatility band InertialStochastic(5,34,3,3).signal < 20 // native stochastic-style signal BreakOfStructure(5,5).signal != 0 // structure break event
| Category | Indicators |
|---|---|
| Adaptive Smoothers | AdaptiveCentricMa, AdaptiveEmaSlopeBand, KalmanTrendFilter, Trama, TrendRegularityAdaptiveMa, ... |
| Oscillators | InertialRsi, AdaptiveMacdR2, InertialStochastic, MultiLookbackRsiConsensus, StochasticAdaptiveD, ... |
| Volatility | TrueRangePercentile, QuantileVolatilityBands, StatisticalTrailingStop, VolatilityConeProjection, VolatilityOfVolatility, ... |
| Volume | VolumeZscoreImpulse, SignedVolumePressure, VolumePercentileRank, VolumeWeightedTrendScore, VolumeProfileMatrix, ... |
| Regime / Trend | MarketStateMatrix, DirectionalMatrix, BayesianTrendProbability, SmaDirectionalMatrix, VolatilityStateMachine, ... |
| Statistics | ReturnMadZscore, RollingSkewKurtosis, RollingPercentileRank, PermutationEntropyRegime, IsotonicRegression, ... |
| Smart Money (SMC) | BreakOfStructure, ChangeOfCharacter, FvgDetector, OrderBlockDetector, LiquiditySweepReversal, ... |
Specify pattern name with optional trend (Bullish/Bearish). Compare against 0 to detect formation.
doji > 0 // any doji bullish engulfing > 0 on EURUSD 15min bearish doji > 0 // bearish doji only hammer > 0 morningstar > 0 on BTCUSDT 4h
DOJI, HAMMER, ENGULFING, MORNINGSTAR, EVENINGSTAR, SHOOTINGSTAR, HANGINGMAN, HARAMI, HARAMICROSS, SPINNINGTOP, MARUBOZU, PIERCING, DARKCLOUDCOVER, 3WHITESOLDIERS, 3BLACKCROWS, ABANDONEDBABY, INVERTEDHAMMER, DRAGONFLYDOJI, GRAVESTONEDOJI, HIKKAKE, KICKING, BELTHOLD, COUNTERATTACK, ...
| Alias | Maps To | Alias | Maps To |
|---|---|---|---|
close | CLOSE_PRICE | volume | VOLUME |
open | OPEN_PRICE | body_len | BODY_LEN |
high | MAX_PRICE | typical_price | TYPICAL_PRICE |
low | MIN_PRICE | direction | DIRECTION |
| Alias | Maps To | Alias | Maps To |
|---|---|---|---|
bid | Bid | mid | MidPrice |
ask | Ask | spread | SpreadInTicks |
| Alias | Maps To | Alias | Maps To |
|---|---|---|---|
ha_close | CLOSE_PRICE | ha_high | HIGH_PRICE |
ha_open | OPEN_PRICE | ha_low | LOW_PRICE |
Close > AdaptiveCentricMa(200).value // price above native smoother bid > 1.1000 // bid price check spread > 5 // spread filter ha_close > ha_open // Heikin Ashi bullish bar TrueRangePercentile.percentile > 80 // range/volatility pressure
Chart patterns detected automatically. Compare against 0 to detect formation.
DoubleBottom > 0 HeadAndShoulders > 0 BullFlag > 0 AscendingTriangle > 0 on EURUSD 1h
DoubleBottom, DoubleTop, TripleBottom, TripleTop, HeadAndShoulders, InverseHeadAndShoulders, AscendingTriangle, DescendingTriangle, SymmetricalTriangle, BullFlag, BearFlag, BullPennant, BearPennant, RisingWedge, FallingWedge, CupAndHandle, DiamondTop, DiamondBottom, VBottom, WBottom, MTop, GapUp, GapDown, ...
OnFormation (default), FormationDuration, PatternStrength, StartPrice, EndPrice, Direction, PatternHeight
| Alias | Field | Description |
|---|---|---|
trendside | TrendSide | 1=Up, -1=Down, 0=None |
trendspeedperhour | TrendSpeedPerHour | Trend speed in ticks/hour |
fastprice | FastPrice | Fast EMA current price |
slowprice | SlowPrice | Slow EMA current price |
trendside == 1 // uptrend active trendside == -1 // downtrend active fastprice > slowprice // fast EMA above slow
| Alias | Field |
|---|---|
upperchannel | UpperChannel |
lowerchannel | LowerChannel |
channellength | ChannelLength (width in ticks) |
upperchannel > close // price below upper channel close < lowerchannel // breakdown below channel
| Alias | Field | Alias | Field |
|---|---|---|---|
pp | Pivot Point | r1 | Resistance 1 |
s1 | Support 1 | r2 | Resistance 2 |
s2 | Support 2 | r3 | Resistance 3 |
s3 | Support 3 |
pp > close // price below pivot s1 < low // low broke support 1 close > r1 // price above resistance 1
| Alias | Field | Description |
|---|---|---|
balance | Balance | Account balance |
openpnl | OpenPNL | Open position profit/loss |
closedpnl | ClosedPNL | Closed profit/loss |
usedmargin | UsedMargin | Used margin |
availablemargin | AvailableMargin | Available margin |
openunits | OpenUnits | Total open units |
balance >= 10000 openpnl < -500
| Alias | Type | Field |
|---|---|---|
datetime | DateValue | CurrentSysDateTime |
day | DateValue | CurrentSysDay |
time | DateValue | CurrentSysTime |
14:00 | HourValue | Specific hour |
datetime > DateValue.2026-01-01 // current date/time after fixed date time < 14:00 // before 2 PM (intraday hour check)
| Operator | Meaning | Example |
|---|---|---|
> | Greater than | InertialRsi(14).signal > 70 |
< | Less than | InertialRsi(14).signal < 30 |
>= | Greater or equal | balance >= 10000 |
<= | Less or equal | TrueRangePercentile.percentile <= 50 |
== | Equal | trendside == 1 |
!= | Not equal | trendside != 0 |
AND | Both saved expressions must be true | UserExpression.RSI_Below_30 AND UserExpression.Balance_GT_100 |
OR | Either saved expression may be true | UserExpression.RSI_Below_30 OR UserExpression.Price_Above_SMA |
crossed / crosses [above] | Up-cross: was below last bar, above now | RSI(14) crossed 30 |
crossed below / crosses under | Down-cross: was above last bar, below now | Close crossed below EMA(50) |
My_Signal, or My_SignalA AND My_SignalB. Must match a saved expression exactly (built-in words like RSI/close still resolve to the indicator/field, not an expression).exp.My_Signal or exp(My_Signal). Use this when the name shadows a built-in word, to force the expression.UserExpression.My_Signal or UserExpression(My_Signal).exp. prefix.RSI(14) < 30 and balance > 100 auto-builds the two legs plus the combiner for you (no need to pre-save anything). You can also combine already-saved expressions by name with AND/OR (any of the reference forms above) when you want to reuse them.AND binds tighter than OR, so a AND b OR c AND d means (a AND b) OR (c AND d). Use parentheses to group explicitly and override precedence — (a OR b) AND c, even nested: a OR (b AND (c OR d)). Function calls like RSI(14) / MACD(12,26,9) / exp(X) are understood as operands, not grouping. The final loads in the builder; the intermediate step(s) are created automatically on Save. A leg can be a saved-expression name, a single operand, or a raw comparison — e.g. (bullish engulfing > 0) and RSI(14) > 50 auto-builds each condition into its own building-block expression, then combines them.// Input — (Trend_Up OR Reversal) AND RSI_Below_30 ( exp.Trend_Up OR exp.Reversal ) AND exp.RSI_Below_30 // step1 (intermediate, auto-created on Save) exp.Trend_Up OR exp.Reversal // final (loaded for approval) UserExpression.[step1] AND exp.RSI_Below_30
// Leg 1 RSI(14) < 30 // save as RSI_Below_30 // Leg 2 balance > 100 // save as Balance_GT_100 // Combiner UserExpression.RSI_Below_30 AND UserExpression.Balance_GT_100
[
{
"ExpressionName": "RSI_Below_30",
"Expression_left_ElementType": "GTSIndicators",
"Expression_left_ElementValue": "RSI",
"Expression_left_Frame": "5Min",
"Expression_left_Size1": 14,
"Expression_left_operation": "<",
"Expression_right_ElementType": "FixedVal",
"Expression_right_ElementValue": "30"
},
{
"ExpressionName": "Balance_GT_100",
"Expression_left_ElementType": "AccountObject",
"Expression_left_ElementValue": "Balance",
"Expression_left_operation": ">",
"Expression_right_ElementType": "FixedVal",
"Expression_right_ElementValue": "100"
},
{
"ExpressionName": "RSI_Below_30_AND_Balance_GT_100",
"Expression_left_ElementType": "UserExpression",
"Expression_left_ElementValue": "RSI_Below_30",
"Expression_left_operation": "AND",
"Expression_right_ElementType": "UserExpression",
"Expression_right_ElementValue": "Balance_GT_100"
}
]
a crossed b means a was below b on the previous bar AND a is above b now. Typing a cross in Quick Create auto-expands it into two history-indexed legs plus an AND combiner (built bottom-up). The combiner loads into the builder for you to review; the two legs are created automatically when you click Save. crossed below / crosses under flips it (was above, now below).// Input RSI(14) crossed 30 // Leg 1 — previous bar was below (a[1] < b) RSI(14)[1] < 30 // RSI_14_below_30_prev // Leg 2 — now above (a > b) RSI(14) > 30 // RSI_14_above_30_now // Combiner (loaded for approval) UserExpression.RSI_14_below_30_prev AND UserExpression.RSI_14_above_30_now
Append timeframe at the end with on SYMBOL TIMEFRAME or just TIMEFRAME.
| Input | Resolves To | Input | Resolves To |
|---|---|---|---|
1min 1mins 1m | 1Min | 1hour 1hours 1h | 1Hour |
5min 5mins 5m | 5Min | 2hour 2hours 2h | 2Hours |
10min 10mins 10m | 10Min | 4h 4hour 4hours | 4Hour |
15min 15mins 15m | 15Min | 12hour 12hours 12h | 12Hours |
30min 30mins 30m | 30Min | daily 1d | Daily |
weekly 1w | Weekly | monthly 1mo | Monthly |
For precise control, use structured TYPE.FIELD.PARAMS.FRAME syntax.
// Regular indicators GTSIndicators.RSI.14.5Min < FixedVal.30 GTSIndicators.MACD.12.26.9.15Min.Signal > FixedVal.0 OHLC_Bar.CLOSE_PRICE.Daily > GTSIndicators.SMA.30.Daily // Extended indicators / subsystems ExtendedIndicators.InertialRsi.14.5Min.signal > FixedVal.30 ExtendedIndicators.AdaptiveMacdR2.20.12.26.9.15Min.signal > FixedVal.0 ExtendedIndicators.QuantileVolatilityBands.100.2.1Hour.upper > OHLC_Bar.CLOSE_PRICE.1Hour // Candle patterns TA_CandlePatterns.DOJI.Bullish.5Min > FixedVal.0 // Price bars OHLC_Bar.CLOSE_PRICE.Daily > ExtendedIndicators.AdaptiveCentricMa.200.Daily.value HeikinAshiBar.CLOSE_PRICE.5Min > HeikinAshiBar.OPEN_PRICE.5Min // Objects TrendObject.TrendSide == FixedVal.1 ChannelObject.UpperChannel > OHLC_Bar.CLOSE_PRICE PivotObject.S1.Daily > OHLC_Bar.MIN_PRICE.Daily // Account & date AccountObject.Balance >= FixedVal.10000 AccountObject.OpenPNL < FixedVal.-500 DateValue.2026-06-01 > DateValue.2026-01-01 HourValue.14:00 > DateValue.CurrentSysDateTime // Price patterns PricePattern.DoubleBottom.OnFormation > FixedVal.0
TYPE.FIELD format.SAR(0.02,0.2) > Close 5min or bid > 1.1000.InertialRsi(14).signal < 30 // oversold-style momentum InertialRsi(14).signal > 70 // overbought-style momentum AdaptiveMacdR2(20,12,26,9).signal > 0 // MACD-style signal positive InertialStochastic(5,34,3,3).signal < 20 // stochastic-style oversold BreakOfStructure(5,5).signal != 0 // structure event
Close > AdaptiveCentricMa(200).value on EURUSD daily // above native smoother AdaptiveCentricMa(50).value > AdaptiveCentricMa(200).value // fast above slow KalmanTrendFilter.trend > 0 // strong trend trendside == 1 // GTS uptrend active
Close > QuantileVolatilityBands(100,2).upper // above upper band TrueRangePercentile.percentile > 80 // high range percentile VolatilityStateMachine.state != 0 // volatility regime active
bullish engulfing > 0 on GBPUSD 4h // candle pattern DoubleBottom > 0 // chart pattern hammer > 0 on EURUSD 1h // hammer on hourly
close > r1 // above resistance 1 s1 < low // broke support 1 close > upperchannel // channel breakout
balance >= 10000 // min balance openpnl < -500 // max open loss spread < 3 // max spread filter
on.A unary expression is a single operand with no comparison — it fires on its own when the operand is truthy / non-zero. Just type the operand by itself (no operator, no right side):
bullish engulfing // candle pattern — fires on formation doji on EURUSD 1h // pattern on a symbol / frame UserExpression.My_Signal // a saved expression, on its own KalmanTrendFilter.trend // fires when the value is non-zero
RSI(14) < 30). A bare numeric indicator (e.g. RSI(14)) becomes a unary getter — valid as a building block, but you usually want a comparison.Append [N] to any operand to read it N bars back — the same notation the builder shows in dot-notation. [0] or no suffix = the current bar.
Close[1] > Close[2] // previous close above the one before RSI(14)[1] < 30 // RSI on the previous bar direction[1] > 0 // previous bar closed up high[1] > SMA(20) // prior high vs current SMA(20)
a<b then a>b) needs two bars of state, which one single-condition expression can't hold. You don't have to build it by hand — type a crossed b (or crossed below) and it auto-expands into the two history-indexed legs (a[1] < b and a > b) plus an AND combiner. See the cross rows in Operators.