Step catalog

All nine v1 Steps you can add to a Route. Filter steps drop signals; transform steps modify them; score steps annotate.

Overview

Steps are the processing units inside a Route's pipeline. They run in array order, top-to-bottom, on a per-Target clone of the canonical signal. Three families:

  • Filter, evaluates the signal and either lets it continue or drops it. When a signal is dropped, a Delivery row is written with status filtered and the Step name recorded. No further Steps run and no dispatch occurs for that Target.
  • Transform, mutates the signal clone (symbol, volume, comment, etc.) and always continues. The original Signal row is never touched.
  • Score, annotates the signal clone with a computed value (e.g. AI confidence). Does not drop or modify the signal on its own; combine with a filter Step to act on the score.

Step ordering matters

Transform Steps must come before any filter or Target that depends on the transformed value. For example, place transform.symbol_map before filter.symbol_allow so the filter sees the broker-side symbol, not the source symbol. Similarly, place score.ai before filter.ai_probability.

filter.symbol_allow

Drop signals whose symbol is not in the allow list. Only signals whose Symbol exactly matches one of the listed values will continue to the next Step or Target.

Config schema

{
  "type": "filter.symbol_allow",
  "enabled": true,
  "config": {
    "symbols": ["EURUSD", "GBPUSD", "XAUUSD"]
  }
}
json

Use it when

Your Source receives signals for many instruments but a specific Target (e.g. a conservative MT5 account) should only trade a curated list. Add this Step at the top of the pipeline so signals for unlisted symbols are dropped before any transform runs.

filter.symbol_block

Drop signals whose symbol is in the block list. The inverse of filter.symbol_allow, every symbol passes except those you explicitly block.

Config schema

{
  "type": "filter.symbol_block",
  "enabled": true,
  "config": {
    "symbols": ["BTCUSD", "ETHUSD"]
  }
}
json

Use it when

Most signals from your Source are fine to pass through, but a small set of instruments is off-limits for a particular account, for example, blocking crypto pairs on a broker that charges high swap fees for them.

filter.action_allow

Drop signals whose action is not in the allow list. Valid action values include buy, sell, buylimit, selllimit, buystop, sellstop, close, and closeall.

Config schema

{
  "type": "filter.action_allow",
  "enabled": true,
  "config": {
    "actions": ["buy", "sell"]
  }
}
json

Use it when

A Target should only receive market orders, not pending orders or close signals. For example, an MT5 account managed by a specific risk strategy can be restricted to buy and sell only, ignoring any buylimit or close signals from the Source.

filter.time_window

Drop signals received outside a weekly schedule. Each window specifies a day of the week, an opening time, and a closing time. Times are evaluated in the configured timezone. Multiple windows can be defined for the same or different days.

Config schema

{
  "type": "filter.time_window",
  "enabled": true,
  "config": {
    "tz": "America/New_York",
    "windows": [
      { "day": "Monday",    "from": "09:30", "to": "16:00" },
      { "day": "Tuesday",   "from": "09:30", "to": "16:00" },
      { "day": "Wednesday", "from": "09:30", "to": "16:00" },
      { "day": "Thursday",  "from": "09:30", "to": "16:00" },
      { "day": "Friday",    "from": "09:30", "to": "16:00" }
    ]
  }
}
json

Use it when

You only want trades placed during active market hours for a given region, or when your strategy is known to perform poorly around news events outside regular hours. The example above restricts signals to US equity session hours, Monday through Friday.

filter.ai_probability

Drop signals whose AI-scored probability is below a minimum threshold. This Step reads the probability value written by a preceding score.ai Step and drops the signal if the score is too low. Requires the Advanced plan.

Config schema

{
  "type": "filter.ai_probability",
  "enabled": true,
  "config": {
    "min": 70
  }
}
json

Use it when

You want to let AI act as a gatekeeper, only allowing high-confidence setups through to execution. Place score.ai first to generate the score, then this Step to enforce the threshold. Signals scoring below min are dropped; those at or above continue.

transform.symbol_map

Rename a signal's symbol using a lookup map. The Step rewrites signal.Symbol to the broker-side name before any downstream filter or Target receives it. Replaces the old per-connection SymbolMaps table.

Config schema

{
  "type": "transform.symbol_map",
  "enabled": true,
  "config": {
    "map": {
      "GOLD":  "XAUUSD",
      "US30":  "DJ30",
      "OIL":   "USOIL"
    }
  }
}
json

Use it when

Your signal source uses generic or exchange-standard symbol names (e.g. GOLD) but your broker uses a different ticker (XAUUSD). Map as many symbols as you need. Symbols not in the map are left unchanged. Place this Step before any filter that checks symbol names.

transform.volume_scaler

Multiply the signal's volume by a constant factor before dispatch. Values below 1 reduce the position size; values above 1 increase it. The result is passed directly to the Target, ensure it is within the broker's lot size constraints.

Config schema

{
  "type": "transform.volume_scaler",
  "enabled": true,
  "config": {
    "factor": 0.5
  }
}
json

Use it when

You want to run the same strategy at a different risk level on a second account. Set up a separate Route with a factor of 0.5 to halve the position size automatically, without changing the original signal or the primary Route.

transform.comment_template

Set the trade comment (or notification message body) using a template with placeholders. The rendered comment is attached to every MT5 order placed by this Route, making it easy to trace the source of a trade in your broker's order history.

Config schema

{
  "type": "transform.comment_template",
  "enabled": true,
  "config": {
    "template": "{{symbol}}-{{action}}-{{comment}}"
  }
}
json

Available placeholders: {{symbol}}, {{action}}, {{volume}}, {{comment}} (original comment from the signal, if any), and {{source}} (Source name).

Use it when

You manage multiple strategies or accounts and want every MT5 order labelled with the symbol, direction, and source so you can filter the order history later. Also useful for Telegram and Discord notification routes where the message body should follow a consistent format.

score.ai

Annotate the signal with an AI confidence score in the range [0, 100]. The score is written to signal.Parameters.probability. This Step does not drop or modify the signal on its own, combine it with filter.ai_probability to act on the result. Requires the Advanced plan.

Config schema

{
  "type": "score.ai",
  "enabled": true,
  "config": {
    "model": "claude-sonnet-4-20250514",
    "systemPrompt": "You are a trading signal evaluator. Score the signal quality from 0 to 100 based on the symbol, action, and market context. Return only a JSON object with a single key 'probability'."
  }
}
json

Use it when

You want a second opinion before executing a trade. The Step calls the Claude API with your system prompt and the serialised signal, then extracts the probability score from the response. Because the API call adds latency, place this Step as late in the pipeline as possible, after fast filter Steps have already dropped signals you know you don't want. Follow it with filter.ai_probability to gate on the result.

Advanced plan required

score.ai calls the Claude API on every signal that reaches it. This Step is gated behind the Advanced plan. Attempting to enable it on a lower plan returns 402 PLAN_STEP_RESTRICTED.