Signals are where a strategy stops being a chart and starts being a set of decisions. A rule turns a comparison between indicator lines into an action: open a position, or close one. You write them on the Signals tab.
Groups and rules#
Everything on the Signals tab lives in a signal group — just a named
container. Click Add Signal to create one (call it something like
Reversion), then Add Rule to add rules to it. A strategy can have
several groups; use them to keep unrelated ideas apart.
The shape of a rule#
When you click Add Rule, you choose two things at the top and then build one or more conditions underneath.
- Action — enter position or exit position.
- Direction — long or short.
Each Condition row compares one line against something, using three or four controls:
| Control | What it holds |
|---|---|
| Line | The line being tested, e.g. RSI.rsi |
| Condition | The comparison — goes above, is less than, and so on |
| Fixed value | A constant to compare against, e.g. 30 |
| Threshold line | or another line to compare against, e.g. EMA.ema |
Fill in Fixed value or Threshold line, not both. There is also an N ago box on each line for looking back a few candles — leave it blank unless you specifically want "RSI two candles ago".
Add more than one condition and they are joined with AND: every condition in the rule must be true on the same candle for it to fire.
Events and states#
This is the single most important idea in the signal builder. The Condition dropdown offers two kinds of comparison, and mixing them up is the most common way a first strategy misbehaves.
- Use goes above / goes below to open and close positions. They fire once, on the crossing.
- Use is greater than / is less than (and equals) as filters alongside another condition. They stay true.
Picking is greater than 30 as an entry means "enter long on every candle where RSI is above 30" — which is almost always, so the strategy tries to enter constantly. goes above 30 fires once, as the market leaves oversold. That is the difference between a strategy and a stuck buy button.
A worked rule#
Enter long when RSI comes up out of oversold:
- Action
enter position· Directionlong - One condition: Line
RSI.rsi· Conditiongoes above· Fixed value30
Then compare two lines instead of a constant — go long when price crosses up through its 50-period moving average (add an EMA first so its line exists):
- Action
enter position· Directionlong - Line
close· Conditiongoes above· Threshold lineEMA.ema
And combine conditions — only take the RSI entry while price is also above the moving average, by adding a second condition row:
- Line
RSI.rsi· Conditiongoes above· Fixed value30 - AND · Line
close· Conditionis greater than· Threshold lineEMA.ema
The first condition is the event that fires the entry; the second is the state that filters it.
Make sure positions close#
An entry rule with no matching exit is not a strategy — it is a buy button.
If nothing closes a position, it stays open until a stop loss or take profit fires. That turns your risk settings into your exit strategy whether you meant that or not. Every entry group should have an exit rule in the same direction, or a stop and target you have deliberately chosen as the exit.
A complete, symmetric pair for the RSI idea:
- Enter long when
RSI.rsigoes above30— leaving oversold. - Exit long when
RSI.rsigoes above70— reaching overbought.
Shorting#
A short strategy is the mirror image: set Direction to short on both
the entry and the exit. The Condition you want usually flips too — you
might enter short when RSI goes below 70 and exit short when it
goes below 30.
Building the JSON directly through the API instead of the builder? The same conditions in payload form, with the raw operator names, are documented under developer tools.