Skip to main content
Glama

Create Conditional Order

create_conditional_order

Create a rule-based conditional order that TraderWAI monitors every minute and fires ONCE when all conditions are met (pure algorithmic checks on price, candle closes and time — no AI involved). It can ENTER a trade or EXIT / manage an open position (close it, move its stop to break-even…), see EXITS below. Do NOT use this for immediate trades — use execute_trade for "buy now". Examples: "sell if an H1 candle closes below 1.0820", "buy if price crosses above 2350 between 08:00–16:00 UTC on weekdays", "sell gold if it sweeps the Asian session high at 4182 and an M15 candle closes back below" (sweep_above 4182, M15, then a market sell with the stop above the wick). "buy EUR_USD when price closes above the H1 EMA 50, only if price is above the D1 EMA 200" (close_above with level {"ref":"indicator","indicator":"ema","timeframe":"H1","period":50} + compare price above D1 EMA 200). "buy EUR_USD on the break and retest of today's 08:00-10:00 UTC range high" (retest {"level":{"ref":"range_high","start":"08:00","end":"10:00"},"direction":"up","timeframe":"M15","maxCandles":10}, market buy with stopAt {"type":"signal_extreme"} below the retest wick). "after an M15 close above today's 08:00-10:00 range high, leave a BUY LIMIT at that range high" (close_above with that level and action {"type":"limit","limitAt":{"type":"level","ref":{"ref":"range_high","start":"08:00","end":"10:00"}},"expiryMinutes":60}: the level is computed when the rule fires, optional limitAt.pips moves it up (+) or down (−)). PRICES: the rule is evaluated on the BROKER'S OWN PRICE of the account it trades (the first account in brokerConfigs; for exits, the position's account; for "suggest" without accounts, the account set for auto-execution of the symbol): real broker candles on MetaTrader and cTrader, the broker's live price on the other platforms. Each broker quotes slightly differently, so set levels from get_quote on that account, not from get_ohlc / get_chart (TraderWAI feed). If the broker does not answer, the rule falls back to the TraderWAI feed; get_conditional_order shows the source (lastPriceSource). Levels can be references (session high/low, previous day, indicators) that update every minute, and the same rule can be tested first with backtest_strategy. If your analysis needs judgement (patterns, divergences), translate it into concrete levels first. Action "execute" trades on the broker; "suggest" creates a suggested order for the user to confirm. IMPORTANT — a conditional order is NOT a limit order: TraderWAI waits for the conditions and then enters. How it enters is action.type: "market" (default) enters immediately at the broker price when the rule fires — for breakouts with an extra condition, or on platforms without pending STOP orders (Match-Trader, Binance). For a plain breakout on TradeLocker, cTrader or MetaTrader prefer execute_trade with executionType "STOP" (it waits at the broker). "limit" adds a second wait: after the rule fires it leaves a pending limit order at the broker, which only fills on a pullback to limitPrice (a retest entry). If the user just wants to wait for a price level with a pending order and no other condition, that is a plain LIMIT order with execute_trade, not a conditional order. Stop loss is required for entries. EXITS — WATCH AN OPEN POSITION: the same rules can MANAGE a position that is already open. Set action.type "close_position" (close it, or part of it with qty) or "modify_position" (move the stop loss to a price or to "break_even", or change the take profit), with brokerAccountId and positionId from get_positions. TraderWAI checks the rule every minute, around the clock, even when the user and you are away — so when the user asks you to "watch my trade and close it if…", create an exit rule instead of promising to check later yourself. Translate the idea into levels: e.g. "close my gold buy if there is a CHoCH on M15" → close_below the last higher low on M15 (take it from get_ohlc); "move the stop to break-even when it reaches 1R" → crosses_above entry + 1R with modify_position stopLoss "break_even". The position must be open when you create the rule; if it closes earlier (stop, target or manually) the rule is cancelled automatically. Exits do not use daily executions. Use the broker stop loss for instant price exits; exit rules are for structure, candle closes and time (checked once a minute on the broker's price). Entry orders last at most 24 hours from creation and exit rules at most 7 days, then expire. Active orders (entries and exits): Free 2, Plus 5, Trader 10, Max unlimited (if the plan changes, the excess is cancelled).

Input Schema

NameRequiredDescriptionDefault
titleNoShort descriptive name
actionYesWhat to do when the conditions are met
symbolYesTrading symbol (e.g. EUR_USD).
expiresAtNoISO 8601 expiration: entries at most 24h from now, exits at most 7 days (later values are capped). Omit for that maximum
conditionsYesConditions combined with AND (max 5; up to 8 when using level references, compare or candle_direction). At least one must be a price/candle condition or a compare with crosses_above/crosses_below.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed35 schema fields changed
    • addedInput schema / properties / action / properties / exitIfNoProgress
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Entries with mode \"execute\": close the position at the close of the candle when price has made no new high (buy) / low (sell) for N closed candles since entry. Same rule as backtest_strategy trade.management.exitIfNoProgress",
      +  "properties": {
      +    "candles": {
      +      "description": "Candles without a new extreme in favour (1-100)",
      +      "type": "integer"
      +    },
      +    "timeframe": {
      +      "enum": [
      +        "M1",
      +        "M5",
      +        "M15",
      +        "M30",
      +        "H1",
      +        "H4",
      +        "D1"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "candles",
      +    "timeframe"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / action / properties / exitOnCompression
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Entries with mode \"execute\": close the position when price compresses (accumulates) instead of moving. Same rule as backtest_strategy",
      +  "properties": {
      +    "candles": {
      +      "description": "Last N closed candles (2-100)",
      +      "type": "integer"
      +    },
      +    "maxRangeAtr": {
      +      "description": "Close when their total range is below this × ATR(14) of that timeframe (e.g. 0.8)",
      +      "type": "number"
      +    },
      +    "timeframe": {
      +      "enum": [
      +        "M1",
      +        "M5",
      +        "M15",
      +        "M30",
      +        "H1",
      +        "H4",
      +        "D1"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "candles",
      +    "timeframe",
      +    "maxRangeAtr"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / action / properties / limitAt / properties / point / description
      Previous value: -"type \"fvg\": near edge, midpoint (default) or far edge of the gap"New value: +"type \"fvg\" / \"zone\": near edge, midpoint (default) or far edge"
    • changedInput schema / properties / action / properties / limitAt / properties / ref / description
      Previous value: -"type \"level\": the level reference, same forms as in the conditions (e.g. {\"ref\":\"range_high\",\"start\":\"08:00\",\"end\":\"10:00\"}, {\"ref\":\"session_high\",\"session\":\"asia\"}, {\"ref\":\"prev_day_high\"})"New value: +"type \"level\": the level reference, same forms as in the conditions (e.g. {\"ref\":\"range_high\",\"start\":\"08:00\",\"end\":\"10:00\"}, {\"ref\":\"session_high\",\"session\":\"asia\"}, {\"ref\":\"prev_day_high\"}, {\"ref\":\"fib\",\"timeframe\":\"M15\",\"level\":0.618})"
    • changedInput schema / properties / action / properties / limitAt / properties / type / description
      Previous value: -"offset: N pips better than the price when the rule fires; fvg: inside the gap found by fvg_retest / fvg_formed; level: at a level reference computed when the rule fires (e.g. today's 08:00-10:00 UTC range high after a breakout of it)"New value: +"offset: N pips better than the price when the rule fires; fvg: inside the gap found by fvg_retest / fvg_formed; zone: inside the zone of a zone / confluence condition; level: at a level reference computed when the rule fires (e.g. today's 08:00-10:00 UTC range high after a breakout of it)"
    • changedInput schema / properties / action / properties / limitAt / properties / type / enum
      Previous value: -[
      -  "offset",
      -  "fvg",
      -  "level"
      -]New value: +[
      +  "offset",
      +  "fvg",
      +  "zone",
      +  "level"
      +]
    • changedInput schema / properties / action / properties / stopAt / description
      Previous value: -"Entries: a RELATIVE stop loss computed when the rule fires, instead of a fixed stopLoss (use with tpRrRatio)"New value: +"Entries: a RELATIVE stop loss computed when the rule fires, instead of a fixed stopLoss (use with tpRrRatio or takeProfitAt)"
    • addedInput schema / properties / action / properties / stopAt / properties / ref
      Added value: +{
      +  "$ref": "#/properties/conditions/items/properties/level/anyOf/1",
      +  "description": "type \"level\": the level reference"
      +}
    • changedInput schema / properties / action / properties / stopAt / properties / type / description
      Previous value: -"fvg: beyond the far edge of the gap; signal_extreme: beyond the sweep wick, the gap or the retest candle wick"New value: +"fvg: beyond the far edge of the gap; zone: beyond the far edge of the zone of a zone/confluence condition; signal_extreme: beyond the sweep wick, the gap, the retest or the confirmation candle wick; level: beyond a level reference computed when the rule fires (e.g. {\"ref\":\"swing_high\",\"timeframe\":\"M15\"})"
    • changedInput schema / properties / action / properties / stopAt / properties / type / enum
      Previous value: -[
      -  "fvg",
      -  "signal_extreme"
      -]New value: +[
      +  "fvg",
      +  "zone",
      +  "signal_extreme",
      +  "level"
      +]
    • addedInput schema / properties / action / properties / takeProfitAt
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Entries: a take profit at a level computed when the rule fires (instead of takeProfit / tpRrRatio)",
      +  "properties": {
      +    "pips": {
      +      "description": "Offset from the level in pips (positive above, negative below)",
      +      "type": "number"
      +    },
      +    "ref": {
      +      "additionalProperties": false,
      +      "description": "The level reference: e.g. the last swing low {\"ref\":\"swing_low\",\"timeframe\":\"M15\"} or a Fibonacci extension {\"ref\":\"fib\",\"timeframe\":\"M15\",\"level\":-0.27}",
      +      "properties": {
      +        "daysAgo": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/daysAgo"
      +        },
      +        "direction": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/direction"
      +        },
      +        "end": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/end"
      +        },
      +        "indicator": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/indicator"
      +        },
      +        "level": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/level"
      +        },
      +        "minImpulseAtr": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/minImpulseAtr"
      +        },
      +        "minSwingAtr": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/minSwingAtr"
      +        },
      +        "nth": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/nth"
      +        },
      +        "period": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/period"
      +        },
      +        "ref": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/ref"
      +        },
      +        "session": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/session"
      +        },
      +        "shift": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/shift"
      +        },
      +        "start": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/start"
      +        },
      +        "strength": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/strength"
      +        },
      +        "timeframe": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/timeframe"
      +        },
      +        "timezone": {
      +          "$ref": "#/properties/conditions/items/properties/level/anyOf/1/properties/timezone"
      +        }
      +      },
      +      "required": [
      +        "ref"
      +      ],
      +      "type": "object"
      +    },
      +    "type": {
      +      "const": "level",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type",
      +    "ref"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / conditions / items / properties / baseCandles
      Added value: +{
      +  "description": "flip_zone: minimum candles of the base (2-20, default 3)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / baseRangeAtr
      Added value: +{
      +  "description": "flip_zone: maximum range of the base in ATR(14) (0.2-5, default 1)",
      +  "type": "number"
      +}
    • addedInput schema / properties / conditions / items / properties / confirmStrength
      Added value: +{
      +  "description": "trigger \"choch\": swing strength on the confirmTimeframe (1-10, default 2)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / confirmTimeframe
      Added value: +{
      +  "description": "zone/confluence with trigger close/rejection (default the zone timeframe) or choch (required, lower than the zone timeframe)",
      +  "enum": [
      +    "M1",
      +    "M5",
      +    "M15",
      +    "M30",
      +    "H1",
      +    "H4",
      +    "D1"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / conditions / items / properties / from
      Added value: +{
      +  "description": "fib_zone: lower retracement level (default 0.5)",
      +  "type": "number"
      +}
    • changedInput schema / properties / conditions / items / properties / level / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "daysAgo": {
      -        "description": "day_high/day_low/day_close: 1 = yesterday, 2 = the day before…; day_open: 0 = today",
      -        "type": "integer"
      -      },
      -      "end": {
      -        "description": "range_high/range_low: HH:MM UTC (same day, after start)",
      -        "type": "string"
      -      },
      -      "indicator": {
      -        "description": "ref \"indicator\": highest/lowest = highest high / lowest low of the last N candles",
      -        "enum": [
      -          "sma",
      -          "ema",
      -          "rsi",
      -          "atr",
      -          "highest",
      -          "lowest"
      -        ],
      -        "type": "string"
      -      },
      -      "period": {
      -        "description": "ref \"indicator\": period (e.g. 50)",
      -        "type": "integer"
      -      },
      -      "ref": {
      -        "enum": [
      -          "session_high",
      -          "session_low",
      -          "range_high",
      -          "range_low",
      -          "prev_day_high",
      -          "prev_day_low",
      -          "prev_day_close",
      -          "day_high",
      -          "day_low",
      -          "day_open",
      -          "day_close",
      -          "indicator",
      -          "price"
      -        ],
      -        "type": "string"
      -      },
      -      "session": {
      -        "description": "session_high/session_low: asia 00:00-07:00, london 07:00-16:00, new_york 13:00-21:00 UTC",
      -        "enum": [
      -          "asia",
      -          "london",
      -          "new_york"
      -        ],
      -        "type": "string"
      -      },
      -      "shift": {
      -        "description": "ref \"indicator\": 0 = last closed candle (default), 1 = the one before…",
      -        "type": "integer"
      -      },
      -      "start": {
      -        "description": "range_high/range_low: HH:MM UTC",
      -        "type": "string"
      -      },
      -      "timeframe": {
      -        "description": "ref \"indicator\": candle timeframe",
      -        "enum": [
      -          "M1",
      -          "M5",
      -          "M15",
      -          "M30",
      -          "H1",
      -          "H4",
      -          "D1"
      -        ],
      -        "type": "string"
      -      },
      -      "timezone": {
      -        "description": "range_high/range_low: IANA time zone (e.g. Europe/London, America/New_York): the HH:MM times are local market time, so the same window follows the market in summer and winter (default UTC); the range must fall within the UTC day",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "ref"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "daysAgo": {
      +        "description": "day_high/day_low/day_close: 1 = yesterday, 2 = the day before…; day_open: 0 = today",
      +        "type": "integer"
      +      },
      +      "direction": {
      +        "description": "ref \"fib\": only if the last impulse goes this way (default any)",
      +        "enum": [
      +          "bullish",
      +          "bearish",
      +          "any"
      +        ],
      +        "type": "string"
      +      },
      +      "end": {
      +        "description": "range_high/range_low: HH:MM UTC (same day, after start)",
      +        "type": "string"
      +      },
      +      "indicator": {
      +        "description": "ref \"indicator\": highest/lowest = highest high / lowest low of the last N candles",
      +        "enum": [
      +          "sma",
      +          "ema",
      +          "rsi",
      +          "atr",
      +          "highest",
      +          "lowest"
      +        ],
      +        "type": "string"
      +      },
      +      "level": {
      +        "description": "ref \"fib\": the Fibonacci level (e.g. 0.618, 1, -0.27)",
      +        "type": "number"
      +      },
      +      "minImpulseAtr": {
      +        "description": "ref \"fib\": only impulses of at least this × ATR(14)",
      +        "type": "number"
      +      },
      +      "minSwingAtr": {
      +        "description": "swing_high/swing_low/fib: ignore swings that stand out less than this × ATR(14) (default 0)",
      +        "type": "number"
      +      },
      +      "nth": {
      +        "description": "swing_high/swing_low: 1 = the last confirmed swing (default), 2 = the one before…",
      +        "type": "integer"
      +      },
      +      "period": {
      +        "description": "ref \"indicator\": period (e.g. 50)",
      +        "type": "integer"
      +      },
      +      "ref": {
      +        "description": "Daily references, indicators, price, or MARKET STRUCTURE (M5-D1, closed candles only, no look-ahead): swing_high / swing_low = the last confirmed swing high/low (nth 2 = the one before…; a swing is a high/low with `strength` candles on each side, default 3, confirmed when those candles close); fib = a Fibonacci level of the LAST IMPULSE (the move between the last two opposite swings), measured from its end: 0.5 / 0.618 / 0.786 retracements, 1 = the impulse start, -0.27 / -0.618 = extensions beyond its end (targets).",
      +        "enum": [
      +          "session_high",
      +          "session_low",
      +          "range_high",
      +          "range_low",
      +          "prev_day_high",
      +          "prev_day_low",
      +          "prev_day_close",
      +          "day_high",
      +          "day_low",
      +          "day_open",
      +          "day_close",
      +          "indicator",
      +          "price",
      +          "swing_high",
      +          "swing_low",
      +          "fib"
      +        ],
      +        "type": "string"
      +      },
      +      "session": {
      +        "description": "session_high/session_low: asia 00:00-07:00, london 07:00-16:00, new_york 13:00-21:00 UTC",
      +        "enum": [
      +          "asia",
      +          "london",
      +          "new_york"
      +        ],
      +        "type": "string"
      +      },
      +      "shift": {
      +        "description": "ref \"indicator\": 0 = last closed candle (default), 1 = the one before…",
      +        "type": "integer"
      +      },
      +      "start": {
      +        "description": "range_high/range_low: HH:MM UTC",
      +        "type": "string"
      +      },
      +      "strength": {
      +        "description": "swing_high/swing_low/fib: candles on each side of a swing (1-10, default 3)",
      +        "type": "integer"
      +      },
      +      "timeframe": {
      +        "description": "ref \"indicator\": candle timeframe; swing_high/swing_low/fib: structure timeframe (M5-D1)",
      +        "enum": [
      +          "M1",
      +          "M5",
      +          "M15",
      +          "M30",
      +          "H1",
      +          "H4",
      +          "D1"
      +        ],
      +        "type": "string"
      +      },
      +      "timezone": {
      +        "description": "range_high/range_low: IANA time zone (e.g. Europe/London, America/New_York): the HH:MM times are local market time, so the same window follows the market in summer and winter (default UTC); the range must fall within the UTC day",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "ref"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / conditions / items / properties / maxAgeCandles
      Added value: +{
      +  "description": "zone: only zones created in the last N candles of its timeframe (1-500, default 50)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / maxTouches
      Added value: +{
      +  "description": "zone/confluence: 1 = first retest only (default), 2 = up to the second visit… (1-10)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / min
      Added value: +{
      +  "description": "confluence: how many zones must overlap (default 2)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / minCount
      Added value: +{
      +  "description": "equal_highs/equal_lows: swings needed (2-5, default 2)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / minImpulseAtr
      Added value: +{
      +  "description": "bos/choch/order_block/fib_zone: minimum size of the impulse (displacement) in ATR(14) (default 0)",
      +  "type": "number"
      +}
    • addedInput schema / properties / conditions / items / properties / minOverlapPips
      Added value: +{
      +  "description": "confluence: minimum height of the overlap in pips (default 0)",
      +  "type": "number"
      +}
    • addedInput schema / properties / conditions / items / properties / minSwingAtr
      Added value: +{
      +  "description": "Ignore swings that stand out less than this × ATR(14) (default 0)",
      +  "type": "number"
      +}
    • addedInput schema / properties / conditions / items / properties / pattern
      Added value: +{
      +  "description": "candle_pattern and trigger \"rejection\": pin_bar, engulfing or any (default)",
      +  "enum": [
      +    "pin_bar",
      +    "engulfing",
      +    "any"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / conditions / items / properties / shift / description
      Previous value: -"candle_direction: 1 = last closed candle (default), 2 = the one before…"New value: +"candle_direction / candle_pattern: 1 = last closed candle (default), 2 = the one before…"
    • addedInput schema / properties / conditions / items / properties / strength
      Added value: +{
      +  "description": "bos/choch/structure_trend/order_block/fib_zone/equal_*: candles on each side of a swing (1-10, default 3)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / conditions / items / properties / to
      Added value: +{
      +  "description": "fib_zone: upper retracement level (default 0.618)",
      +  "type": "number"
      +}
    • changedInput schema / properties / conditions / items / properties / tolerancePips / description
      Previous value: -"retest: how close to the level (in pips) counts as a retest (default 0 = must touch it)"New value: +"retest: how close to the level (in pips) counts as a retest (default 0 = must touch it); equal_highs/equal_lows: max distance between the swings (default 0.1 × ATR)"
    • changedInput schema / properties / conditions / items / properties / trigger / description
      Previous value: -"fvg_retest: touch = fire as soon as price reaches the gap, without waiting for the candle to close (default); close = fire when the candle that returns to the gap closes"New value: +"fvg_retest: touch = fire as soon as price reaches the gap, without waiting for the candle to close (default); close = fire when the candle that returns to the gap closes. zone/confluence: touch (default), close, rejection or choch"
    • changedInput schema / properties / conditions / items / properties / trigger / enum
      Previous value: -[
      -  "touch",
      -  "close"
      -]New value: +[
      +  "touch",
      +  "close",
      +  "rejection",
      +  "choch"
      +]
    • changedInput schema / properties / conditions / items / properties / type / description
      Previous value: -"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, trigger, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when price returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without going beyond its far edge. trigger \"touch\" (default) fires in the minute price reaches the gap, inside the candle; trigger \"close\" waits for that candle to close and requires it not to close beyond the far edge (more confirmation, later and worse entry). maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. retest {level, direction up|down, timeframe, maxCandles, tolerancePips}: BREAK AND RETEST of a level on closed candles of that timeframe. up: a candle closes above the level after a close at or below it (the breakout), then within maxCandles candles (1-50, default 10) the FIRST candle that comes back to the level (low <= level + tolerancePips, default 0) and still closes above it is the retest: it fires at the close of that candle. If a candle closes back at or below the level before the retest, that breakout is cancelled (a new one can start later). down = the mirror (break below, retest from below, close below). up → typically a BUY, down → a SELL; action.stopAt {\"type\":\"signal_extreme\"} puts the stop beyond the retest candle wick. Levels can be references (e.g. the 08:00-10:00 UTC range high: {\"ref\":\"range_high\",\"start\":\"08:00\",\"end\":\"10:00\"}, the Asian session high, the previous day high). at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."New value: +"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, trigger, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when price returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without going beyond its far edge. trigger \"touch\" (default) fires in the minute price reaches the gap, inside the candle; trigger \"close\" waits for that candle to close and requires it not to close beyond the far edge (more confirmation, later and worse entry). maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. retest {level, direction up|down, timeframe, maxCandles, tolerancePips}: BREAK AND RETEST of a level on closed candles of that timeframe. up: a candle closes above the level after a close at or below it (the breakout), then within maxCandles candles (1-50, default 10) the FIRST candle that comes back to the level (low <= level + tolerancePips, default 0) and still closes above it is the retest: it fires at the close of that candle. If a candle closes back at or below the level before the retest, that breakout is cancelled (a new one can start later). down = the mirror (break below, retest from below, close below). up → typically a BUY, down → a SELL; action.stopAt {\"type\":\"signal_extreme\"} puts the stop beyond the retest candle wick. Levels can be references (e.g. the 08:00-10:00 UTC range high: {\"ref\":\"range_high\",\"start\":\"08:00\",\"end\":\"10:00\"}, the Asian session high, the previous day high). at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". MARKET STRUCTURE (M5-D1, closed candles, no look-ahead; a swing = a high/low with `strength` candles on each side, default 3, known when those candles close): bos {timeframe, direction bullish|bearish, maxCandles, minImpulseAtr} = filter: the last break of structure (a close beyond the last swing) was in that direction within maxCandles candles (default 20); choch = the same but it reversed the previous break (change of character); structure_trend {timeframe, direction} = higher highs and higher lows (bullish) / lower highs and lower lows (bearish); candle_pattern {timeframe, pattern pin_bar|engulfing|any, direction, shift} = the last closed candle is a rejection candle. zone {zone, timeframe, direction, trigger, …} = ENTRY TRIGGER when price comes back to a live zone: zone order_block (last opposite candle before the impulse that broke structure; minImpulseAtr for displacement), flip_zone (a base of baseCandles+ candles within baseRangeAtr × ATR, default 3 and 1, broken by a close: broken support becomes resistance and vice versa), fib_zone (between the from/to retracements of the LAST impulse, default 0.5-0.618; OTE 0.62-0.79), fvg (fair value gap), equal_highs / equal_lows (2+ swing highs/lows within tolerancePips, default 0.1 × ATR: liquidity). A zone dies when a candle closes beyond it; maxAgeCandles (default 50) = how recent; maxTouches (default 1) = first retest only, 2 = up to the second visit… trigger: touch (default: the minute price reaches it), close (a confirmTimeframe candle touches it and closes back outside), rejection (same, with a pin bar / engulfing candle), choch (a CHoCH on a LOWER confirmTimeframe while price is in the zone: multi-timeframe entry). confluence {direction, zones:[{zone, timeframe, …}, …] (2-4), min (default 2), minOverlapPips, trigger…} = ENTRY TRIGGER at the OVERLAP of at least `min` live zones (the entry zone is their intersection; results are broken down by combination). The zone of the trigger is used by stop/limit \"zone\" (stop beyond its far edge, limit at its near edge / midpoint / far edge). Test the same rule first with backtest_strategy: the conditions are the same."
    • changedInput schema / properties / conditions / items / properties / type / enum
      Previous value: -[
      -  "price_above",
      -  "price_below",
      -  "crosses_above",
      -  "crosses_below",
      -  "close_above",
      -  "close_below",
      -  "range_breakout",
      -  "consecutive_closes",
      -  "sweep_above",
      -  "sweep_below",
      -  "fvg_retest",
      -  "fvg_formed",
      -  "retest",
      -  "at_time",
      -  "time_window",
      -  "days_of_week",
      -  "compare",
      -  "candle_direction"
      -]New value: +[
      +  "price_above",
      +  "price_below",
      +  "crosses_above",
      +  "crosses_below",
      +  "close_above",
      +  "close_below",
      +  "range_breakout",
      +  "consecutive_closes",
      +  "sweep_above",
      +  "sweep_below",
      +  "fvg_retest",
      +  "fvg_formed",
      +  "retest",
      +  "at_time",
      +  "time_window",
      +  "days_of_week",
      +  "compare",
      +  "candle_direction",
      +  "bos",
      +  "choch",
      +  "structure_trend",
      +  "zone",
      +  "confluence",
      +  "candle_pattern"
      +]
    • addedInput schema / properties / conditions / items / properties / zone
      Added value: +{
      +  "description": "zone: the zone kind",
      +  "enum": [
      +    "order_block",
      +    "flip_zone",
      +    "fib_zone",
      +    "fvg",
      +    "equal_highs",
      +    "equal_lows"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / conditions / items / properties / zones
      Added value: +{
      +  "description": "confluence: 2-4 zones, e.g. [{\"zone\":\"order_block\",\"timeframe\":\"M15\"},{\"zone\":\"flip_zone\",\"timeframe\":\"M15\"},{\"zone\":\"fib_zone\",\"timeframe\":\"M15\",\"from\":0.5,\"to\":0.618}]",
      +  "items": {
      +    "additionalProperties": false,
      +    "properties": {
      +      "baseCandles": {
      +        "type": "integer"
      +      },
      +      "baseRangeAtr": {
      +        "type": "number"
      +      },
      +      "from": {
      +        "type": "number"
      +      },
      +      "maxAgeCandles": {
      +        "type": "integer"
      +      },
      +      "minCount": {
      +        "type": "integer"
      +      },
      +      "minGap": {
      +        "type": "number"
      +      },
      +      "minImpulseAtr": {
      +        "type": "number"
      +      },
      +      "minSwingAtr": {
      +        "type": "number"
      +      },
      +      "strength": {
      +        "type": "integer"
      +      },
      +      "timeframe": {
      +        "enum": [
      +          "M5",
      +          "M15",
      +          "M30",
      +          "H1",
      +          "H4",
      +          "D1"
      +        ],
      +        "type": "string"
      +      },
      +      "to": {
      +        "type": "number"
      +      },
      +      "tolerancePips": {
      +        "type": "number"
      +      },
      +      "zone": {
      +        "enum": [
      +          "order_block",
      +          "flip_zone",
      +          "fib_zone",
      +          "fvg",
      +          "equal_highs",
      +          "equal_lows"
      +        ],
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "zone",
      +      "timeframe"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Changed3 schema fields changed
    • addedInput schema / properties / action / properties / trailing
      Added value: +{
      +  "description": "Entries with mode \"execute\": true: trailing stop executed by the broker — the stop follows price at the initial stop distance (entry to stopLoss) and only moves in favour. Available on cTrader, TradeLocker and MetaTrader (market and pending orders) and Bybit (market orders); rejected on other platforms. backtest_strategy trade.trailing simulates the same rule. Checked when the order is created.",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / conditions / items / properties / level / anyOf
      Previous value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "additionalProperties": false,
      -    "properties": {
      -      "daysAgo": {
      -        "description": "day_high/day_low/day_close: 1 = yesterday, 2 = the day before…; day_open: 0 = today",
      -        "type": "integer"
      -      },
      -      "end": {
      -        "description": "range_high/range_low: HH:MM UTC (same day, after start)",
      -        "type": "string"
      -      },
      -      "indicator": {
      -        "description": "ref \"indicator\": highest/lowest = highest high / lowest low of the last N candles",
      -        "enum": [
      -          "sma",
      -          "ema",
      -          "rsi",
      -          "atr",
      -          "highest",
      -          "lowest"
      -        ],
      -        "type": "string"
      -      },
      -      "period": {
      -        "description": "ref \"indicator\": period (e.g. 50)",
      -        "type": "integer"
      -      },
      -      "ref": {
      -        "enum": [
      -          "session_high",
      -          "session_low",
      -          "range_high",
      -          "range_low",
      -          "prev_day_high",
      -          "prev_day_low",
      -          "prev_day_close",
      -          "day_high",
      -          "day_low",
      -          "day_open",
      -          "day_close",
      -          "indicator",
      -          "price"
      -        ],
      -        "type": "string"
      -      },
      -      "session": {
      -        "description": "session_high/session_low: asia 00:00-07:00, london 07:00-16:00, new_york 13:00-21:00 UTC",
      -        "enum": [
      -          "asia",
      -          "london",
      -          "new_york"
      -        ],
      -        "type": "string"
      -      },
      -      "shift": {
      -        "description": "ref \"indicator\": 0 = last closed candle (default), 1 = the one before…",
      -        "type": "integer"
      -      },
      -      "start": {
      -        "description": "range_high/range_low: HH:MM UTC",
      -        "type": "string"
      -      },
      -      "timeframe": {
      -        "description": "ref \"indicator\": candle timeframe",
      -        "enum": [
      -          "M1",
      -          "M5",
      -          "M15",
      -          "M30",
      -          "H1",
      -          "H4",
      -          "D1"
      -        ],
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "ref"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "type": "number"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "daysAgo": {
      +        "description": "day_high/day_low/day_close: 1 = yesterday, 2 = the day before…; day_open: 0 = today",
      +        "type": "integer"
      +      },
      +      "end": {
      +        "description": "range_high/range_low: HH:MM UTC (same day, after start)",
      +        "type": "string"
      +      },
      +      "indicator": {
      +        "description": "ref \"indicator\": highest/lowest = highest high / lowest low of the last N candles",
      +        "enum": [
      +          "sma",
      +          "ema",
      +          "rsi",
      +          "atr",
      +          "highest",
      +          "lowest"
      +        ],
      +        "type": "string"
      +      },
      +      "period": {
      +        "description": "ref \"indicator\": period (e.g. 50)",
      +        "type": "integer"
      +      },
      +      "ref": {
      +        "enum": [
      +          "session_high",
      +          "session_low",
      +          "range_high",
      +          "range_low",
      +          "prev_day_high",
      +          "prev_day_low",
      +          "prev_day_close",
      +          "day_high",
      +          "day_low",
      +          "day_open",
      +          "day_close",
      +          "indicator",
      +          "price"
      +        ],
      +        "type": "string"
      +      },
      +      "session": {
      +        "description": "session_high/session_low: asia 00:00-07:00, london 07:00-16:00, new_york 13:00-21:00 UTC",
      +        "enum": [
      +          "asia",
      +          "london",
      +          "new_york"
      +        ],
      +        "type": "string"
      +      },
      +      "shift": {
      +        "description": "ref \"indicator\": 0 = last closed candle (default), 1 = the one before…",
      +        "type": "integer"
      +      },
      +      "start": {
      +        "description": "range_high/range_low: HH:MM UTC",
      +        "type": "string"
      +      },
      +      "timeframe": {
      +        "description": "ref \"indicator\": candle timeframe",
      +        "enum": [
      +          "M1",
      +          "M5",
      +          "M15",
      +          "M30",
      +          "H1",
      +          "H4",
      +          "D1"
      +        ],
      +        "type": "string"
      +      },
      +      "timezone": {
      +        "description": "range_high/range_low: IANA time zone (e.g. Europe/London, America/New_York): the HH:MM times are local market time, so the same window follows the market in summer and winter (default UTC); the range must fall within the UTC day",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "ref"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / conditions / items / properties / timezone
      Added value: +{
      +  "description": "time_window: IANA time zone (e.g. Europe/London, America/New_York): the HH:MM times are local market time, so the same window follows the market in summer and winter (default UTC)",
      +  "type": "string"
      +}
  3. Changed10 schema fields changed
    • changedInput schema / properties / action / properties / limitAt / properties / pips / description
      Previous value: -"type \"offset\": pips below (buy) / above (sell) the trigger price"New value: +"type \"offset\": pips below (buy) / above (sell) the trigger price; type \"level\": optional offset from the level in pips (positive above, negative below)"
    • addedInput schema / properties / action / properties / limitAt / properties / ref
      Added value: +{
      +  "$ref": "#/properties/conditions/items/properties/level/anyOf/1",
      +  "description": "type \"level\": the level reference, same forms as in the conditions (e.g. {\"ref\":\"range_high\",\"start\":\"08:00\",\"end\":\"10:00\"}, {\"ref\":\"session_high\",\"session\":\"asia\"}, {\"ref\":\"prev_day_high\"})"
      +}
    • changedInput schema / properties / action / properties / limitAt / properties / type / description
      Previous value: -"offset: N pips better than the price when the rule fires; fvg: inside the gap found by fvg_retest / fvg_formed"New value: +"offset: N pips better than the price when the rule fires; fvg: inside the gap found by fvg_retest / fvg_formed; level: at a level reference computed when the rule fires (e.g. today's 08:00-10:00 UTC range high after a breakout of it)"
    • changedInput schema / properties / action / properties / limitAt / properties / type / enum
      Previous value: -[
      -  "offset",
      -  "fvg"
      -]New value: +[
      +  "offset",
      +  "fvg",
      +  "level"
      +]
    • changedInput schema / properties / action / properties / stopAt / properties / type / description
      Previous value: -"fvg: beyond the far edge of the gap; signal_extreme: beyond the sweep wick or the gap"New value: +"fvg: beyond the far edge of the gap; signal_extreme: beyond the sweep wick, the gap or the retest candle wick"
    • changedInput schema / properties / conditions / items / properties / direction / description
      Previous value: -"range_breakout: up/down/any; candle_direction and fvg_retest: bullish/bearish"New value: +"range_breakout: up/down/any; retest: up/down; candle_direction and fvg_retest: bullish/bearish"
    • changedInput schema / properties / conditions / items / properties / maxCandles / description
      Previous value: -"sweep_above/sweep_below: candles allowed to close back inside after the wick (1-10, default 3); fvg_retest: how recent the gap must be, in candles (3-100, default 20)"New value: +"sweep_above/sweep_below: candles allowed to close back inside after the wick (1-10, default 3); fvg_retest: how recent the gap must be, in candles (3-100, default 20); retest: max candles between the breakout candle and the retest candle (1-50, default 10)"
    • addedInput schema / properties / conditions / items / properties / tolerancePips
      Added value: +{
      +  "description": "retest: how close to the level (in pips) counts as a retest (default 0 = must touch it)",
      +  "type": "number"
      +}
    • changedInput schema / properties / conditions / items / properties / type / description
      Previous value: -"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, trigger, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when price returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without going beyond its far edge. trigger \"touch\" (default) fires in the minute price reaches the gap, inside the candle; trigger \"close\" waits for that candle to close and requires it not to close beyond the far edge (more confirmation, later and worse entry). maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."New value: +"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, trigger, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when price returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without going beyond its far edge. trigger \"touch\" (default) fires in the minute price reaches the gap, inside the candle; trigger \"close\" waits for that candle to close and requires it not to close beyond the far edge (more confirmation, later and worse entry). maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. retest {level, direction up|down, timeframe, maxCandles, tolerancePips}: BREAK AND RETEST of a level on closed candles of that timeframe. up: a candle closes above the level after a close at or below it (the breakout), then within maxCandles candles (1-50, default 10) the FIRST candle that comes back to the level (low <= level + tolerancePips, default 0) and still closes above it is the retest: it fires at the close of that candle. If a candle closes back at or below the level before the retest, that breakout is cancelled (a new one can start later). down = the mirror (break below, retest from below, close below). up → typically a BUY, down → a SELL; action.stopAt {\"type\":\"signal_extreme\"} puts the stop beyond the retest candle wick. Levels can be references (e.g. the 08:00-10:00 UTC range high: {\"ref\":\"range_high\",\"start\":\"08:00\",\"end\":\"10:00\"}, the Asian session high, the previous day high). at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."
    • changedInput schema / properties / conditions / items / properties / type / enum
      Previous value: -[
      -  "price_above",
      -  "price_below",
      -  "crosses_above",
      -  "crosses_below",
      -  "close_above",
      -  "close_below",
      -  "range_breakout",
      -  "consecutive_closes",
      -  "sweep_above",
      -  "sweep_below",
      -  "fvg_retest",
      -  "fvg_formed",
      -  "at_time",
      -  "time_window",
      -  "days_of_week",
      -  "compare",
      -  "candle_direction"
      -]New value: +[
      +  "price_above",
      +  "price_below",
      +  "crosses_above",
      +  "crosses_below",
      +  "close_above",
      +  "close_below",
      +  "range_breakout",
      +  "consecutive_closes",
      +  "sweep_above",
      +  "sweep_below",
      +  "fvg_retest",
      +  "fvg_formed",
      +  "retest",
      +  "at_time",
      +  "time_window",
      +  "days_of_week",
      +  "compare",
      +  "candle_direction"
      +]
  4. Changed3 schema fields changed
    • addedInput schema / properties / conditions / items / properties / trigger
      Added value: +{
      +  "description": "fvg_retest: touch = fire as soon as price reaches the gap, without waiting for the candle to close (default); close = fire when the candle that returns to the gap closes",
      +  "enum": [
      +    "touch",
      +    "close"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / conditions / items / properties / type / description
      Previous value: -"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when a closed candle returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without closing beyond its far edge. maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."New value: +"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, trigger, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when price returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without going beyond its far edge. trigger \"touch\" (default) fires in the minute price reaches the gap, inside the candle; trigger \"close\" waits for that candle to close and requires it not to close beyond the far edge (more confirmation, later and worse entry). maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."
    • changedInput schema / properties / symbol / description
      Previous value: -"Trading symbol (e.g. EUR_USD). Use list_symbols"New value: +"Trading symbol (e.g. EUR_USD)."
  5. Changed3 schema fields changed
    • addedInput schema / properties / action / properties / brokerConfigs / items / properties / confirmHighRisk
      Added value: +{
      +  "description": "Only after the user explicitly confirmed a percentage risk above 10% per order",
      +  "type": "boolean"
      +}
    • changedInput schema / properties / action / properties / brokerConfigs / items / properties / sizingMode / description
      Previous value: -"\"percentage\" = % of balance to risk (max 10), \"fixed_lots\" = lot size"New value: +"\"percentage\" = % of the balance LOST if the stop loss is hit (not the share of the balance used); \"fixed_lots\" = lot size"
    • changedInput schema / properties / action / properties / brokerConfigs / items / properties / sizingValue / description
      Previous value: -"Percentage (e.g. 1) or lots (e.g. 0.01)"New value: +"Percentage (typically 0.25-2, up to 100; above 10 needs confirmHighRisk after the user confirms) or lots (e.g. 0.01)"
  6. Changed7 schema fields changed
    • addedInput schema / properties / action / properties / expiryMinutes
      Added value: +{
      +  "description": "Only for type \"limit\": cancel the pending order if it has not filled after this many minutes (1-1440)",
      +  "type": "integer"
      +}
    • addedInput schema / properties / action / properties / limitAt
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Only for type \"limit\": a RELATIVE limit price computed when the rule fires, instead of a fixed limitPrice",
      +  "properties": {
      +    "pips": {
      +      "description": "type \"offset\": pips below (buy) / above (sell) the trigger price",
      +      "type": "number"
      +    },
      +    "point": {
      +      "description": "type \"fvg\": near edge, midpoint (default) or far edge of the gap",
      +      "enum": [
      +        "near",
      +        "midpoint",
      +        "far"
      +      ],
      +      "type": "string"
      +    },
      +    "type": {
      +      "description": "offset: N pips better than the price when the rule fires; fvg: inside the gap found by fvg_retest / fvg_formed",
      +      "enum": [
      +        "offset",
      +        "fvg"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type"
      +  ],
      +  "type": "object"
      +}
    • addedInput schema / properties / action / properties / maxMinutes
      Added value: +{
      +  "description": "Entries: close the position this many minutes after it opens (1-10080), whatever the result — a time exit; with it the take profit is optional",
      +  "type": "integer"
      +}
    • addedInput schema / properties / action / properties / stopAt
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Entries: a RELATIVE stop loss computed when the rule fires, instead of a fixed stopLoss (use with tpRrRatio)",
      +  "properties": {
      +    "bufferPips": {
      +      "description": "Extra pips beyond that level (default 0)",
      +      "type": "number"
      +    },
      +    "type": {
      +      "description": "fvg: beyond the far edge of the gap; signal_extreme: beyond the sweep wick or the gap",
      +      "enum": [
      +        "fvg",
      +        "signal_extreme"
      +      ],
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "type"
      +  ],
      +  "type": "object"
      +}
    • changedInput schema / properties / action / properties / stopLoss / description
      Previous value: -"Entries: stop loss price (required). modify_position: new stop loss price, or \"break_even\" to move it to the entry price"New value: +"Entries: stop loss price (required unless stopAt). modify_position: new stop loss price, or \"break_even\" to move it to the entry price"
    • changedInput schema / properties / conditions / items / properties / type / description
      Previous value: -"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when a closed candle returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without closing beyond its far edge. maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."New value: +"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when a closed candle returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without closing beyond its far edge. maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). fvg_formed {timeframe, direction, minGap}: fires as soon as a NEW fair value gap forms (the last closed candle completes it) — pair it with a LIMIT entry inside the gap (action.limitAt {\"type\":\"fvg\",\"point\":\"midpoint\"}) and an expiry, which is how FVG entries are usually traded. at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."
    • changedInput schema / properties / conditions / items / properties / type / enum
      Previous value: -[
      -  "price_above",
      -  "price_below",
      -  "crosses_above",
      -  "crosses_below",
      -  "close_above",
      -  "close_below",
      -  "range_breakout",
      -  "consecutive_closes",
      -  "sweep_above",
      -  "sweep_below",
      -  "fvg_retest",
      -  "at_time",
      -  "time_window",
      -  "days_of_week",
      -  "compare",
      -  "candle_direction"
      -]New value: +[
      +  "price_above",
      +  "price_below",
      +  "crosses_above",
      +  "crosses_below",
      +  "close_above",
      +  "close_below",
      +  "range_breakout",
      +  "consecutive_closes",
      +  "sweep_above",
      +  "sweep_below",
      +  "fvg_retest",
      +  "fvg_formed",
      +  "at_time",
      +  "time_window",
      +  "days_of_week",
      +  "compare",
      +  "candle_direction"
      +]
  7. Changed6 schema fields changed
    • changedInput schema / properties / conditions / items / properties / direction / description
      Previous value: -"range_breakout: up/down/any; candle_direction: bullish/bearish"New value: +"range_breakout: up/down/any; candle_direction and fvg_retest: bullish/bearish"
    • addedInput schema / properties / conditions / items / properties / entry
      Added value: +{
      +  "description": "fvg_retest: touch = price reaches the gap (default); midpoint = price reaches its 50%",
      +  "enum": [
      +    "touch",
      +    "midpoint"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / properties / conditions / items / properties / maxCandles / description
      Previous value: -"sweep_above/sweep_below: candles allowed to close back inside after the wick (1-10, default 3)"New value: +"sweep_above/sweep_below: candles allowed to close back inside after the wick (1-10, default 3); fvg_retest: how recent the gap must be, in candles (3-100, default 20)"
    • addedInput schema / properties / conditions / items / properties / minGap
      Added value: +{
      +  "description": "fvg_retest: minimum gap size in price units (default: any size)",
      +  "type": "number"
      +}
    • changedInput schema / properties / conditions / items / properties / type / description
      Previous value: -"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."New value: +"price_above/price_below {level}: current price beyond level. crosses_above/crosses_below {level}: price crosses the level after creation. close_above/close_below {level,timeframe}: a candle of that timeframe CLOSES beyond level. range_breakout {low,high,timeframe,direction}: a candle closes outside the range. consecutive_closes {level,side,count,timeframe}: N consecutive closes above/below level. sweep_above / sweep_below {level,timeframe,maxCandles}: LIQUIDITY SWEEP (stop hunt / fake breakout): price wicks beyond a known level (previous day high/low, Asian session high/low, equal highs…) coming from the other side, and a candle of that timeframe closes back inside within maxCandles candles (1-10, default 3; the wick candle itself counts). sweep_above → typically a SELL; sweep_below → typically a BUY. fvg_retest {timeframe, direction bullish|bearish, maxCandles, entry, minGap}: FAIR VALUE GAP (FVG / imbalance, ICT/SMC) retest: three consecutive candles where the 1st and 3rd do not overlap leave a gap (bullish: 3rd low above 1st high; bearish: 3rd high below 1st low); it fires when a closed candle returns to the gap for the FIRST time (entry \"touch\" = reaches its near edge, default; \"midpoint\" = its 50%) without closing beyond its far edge. maxCandles = how recent the gap must be (3-100 candles, default 20); minGap = minimum gap size in price (e.g. 1.5 on gold), default any. bullish → typically a BUY with the stop below the gap (backtest stop type \"wick\" uses the gap's far edge); bearish → typically a SELL. Combine with filters (time_window for London/New York, compare for trend). at_time {at}: at a given ISO datetime. time_window {start,end}: only between HH:MM–HH:MM UTC. days_of_week {days}: only on those days. Time filters alone never trigger an order. LEVELS CAN BE REFERENCES instead of numbers (recomputed every minute, same as backtest_strategy): Asian/London/New York session high/low, previous day high/low/close, day_high/low N days ago, a custom HH:MM range, or an indicator (SMA, EMA, RSI, ATR, highest/lowest of N candles on M1-D1, closed candles only). compare {left, op, right}: compares two values (numbers or references), op above / below / crosses_above / crosses_below — e.g. trend filters: price above the D1 EMA 50, H1 RSI below 30; crosses_* can be the trigger (moving-average crossover). candle_direction {timeframe, direction bullish|bearish, shift}: the last closed candle of that timeframe (shift 1) closed up/down — e.g. \"yesterday was bullish\". Test the same rule first with backtest_strategy: the conditions are the same."
    • changedInput schema / properties / conditions / items / properties / type / enum
      Previous value: -[
      -  "price_above",
      -  "price_below",
      -  "crosses_above",
      -  "crosses_below",
      -  "close_above",
      -  "close_below",
      -  "range_breakout",
      -  "consecutive_closes",
      -  "sweep_above",
      -  "sweep_below",
      -  "at_time",
      -  "time_window",
      -  "days_of_week",
      -  "compare",
      -  "candle_direction"
      -]New value: +[
      +  "price_above",
      +  "price_below",
      +  "crosses_above",
      +  "crosses_below",
      +  "close_above",
      +  "close_below",
      +  "range_breakout",
      +  "consecutive_closes",
      +  "sweep_above",
      +  "sweep_below",
      +  "fvg_retest",
      +  "at_time",
      +  "time_window",
      +  "days_of_week",
      +  "compare",
      +  "candle_direction"
      +]
  8. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes far beyond annotations (readOnlyHint=false, destructiveHint=false, openWorldHint=true) by disclosing the one-shot firing behavior, 24h entry / 7d exit expiry, automatic cancellation when the position closes, plan-based limits on active orders, broker-price evaluation with a fallback to the TraderWAI feed surfaced as lastPriceSource, and platform-specific trailing support. These are operational facts an agent cannot infer from the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The critical routing rule ('not for immediate trades') is front-loaded, but the description then runs to many hundreds of words with overlapping examples, em-dash asides and repeated restatements of the level-reference system. Much of the example content duplicates the schema's enum descriptions, and a tighter structure would preserve the guidance at half the length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a deeply nested schema, no output schema, and genuine complexity (entry vs exit actions, relative stop/limit, broker price sourcing, expiry and plan limits), the description covers everything an agent needs to call it correctly, including prerequisites like positionId from get_positions and the requirement that a stop loss be present for entries.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description earns more by supplying concrete worked examples for the hardest parameters — level-reference forms, stopAt {"type":"signal_extreme"}, limitAt with range_high plus pips offset and expiryMinutes, and the distinction between what goes in brokerConfigs versus get_positions fields for exits. It adds cross-parameter meaning the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a rule-based conditional order') plus its defining mechanics (monitored every minute, fires once, algorithmic not AI) and explicitly distinguishes itself from execute_trade, plain limit orders, and pending STOP orders. An agent can identify the tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use and when-not-to-use: 'Do NOT use this for immediate trades — use execute_trade', prefer execute_trade with executionType STOP for plain breakouts on TradeLocker/cTrader/MetaTrader, and use a plain LIMIT order for a bare price-level wait. It also routes exit-management cases ('watch my trade and close it if…') to this tool rather than promising to poll later.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources