Flow - Visual Strategy Builder
Flow is OpenAlgo's visual workflow editor and synchronous execution engine. A workflow is a directed graph with exactly one trigger and a reachable chain of data, condition, trading, streaming, and notification nodes.
Current Capabilities
61 node types kept in parity across the editor, backend validator, executor, and tests.
Four triggers: Schedule, Price Alert, Webhook, and Order Update.
Regular, smart, options, basket, split, modify, cancel, and close-position actions.
Quote, depth, history, indicator, account, options, and calendar data nodes.
Branch conditions and AND/OR/NOT gates.
LTP/Quote/Depth subscriptions, logging, variables, math, HTTP requests, delays, wait-until, Telegram, and WhatsApp actions.
Strategy-level realized/unrealized P&L.
JSON import, export, and validated in-place replacement.
Execution history and per-node logs.
Flow does not provide loops, foreach/switch nodes, cross-run variables, automatic retry/error-handler nodes, built-in backtesting, or version-control history.
Build a Workflow
Open
/flowand create a workflow.Drag one trigger onto the canvas.
Add downstream nodes and connect them in execution order.
Configure each node. Give a producer an
outputVariablewhen a later node needs its result.Branch from conditions using the
true/falseoryes/nohandles.Save while editing. Incomplete graphs may be saved, but corrupt node types, duplicate IDs, and dangling edges are rejected.
Use Run Now to validate and test a complete graph.
Activate the workflow when its trigger should remain registered.
Trigger Types
Schedule (start)
Once, daily, weekly, or interval execution
IST time/day values and an optional market-hours gate driven by the exchange calendar, with optional exchange and HH:MM overrides
Price Alert (priceAlert)
Watches LTP for a level, cross, channel, or percentage move
Symbol/exchange, thresholds, once/every-time, expiration
Webhook (webhookTrigger)
Executes from a tokenized public POST
Optional symbol filter and payload or URL-secret authentication
Order Update (orderUpdateTrigger)
Executes on normalized live/sandbox order state
Order ID or symbol filter, optional exchange/status, once/every-time
Every complete workflow must contain exactly one trigger. Multiple triggers, cycles, unreachable executable nodes, invalid edges, missing required fields, and oversized graphs are rejected before a broker call.
Variables
Use {{path}} inside string fields:
Dotted dictionary keys and non-negative list indexes are supported. Most missing paths remain literal in the rendered string so the execution log exposes the mistake. A Variable Condition is stricter: an unresolved operand takes neither branch.
Example: Signal to Order
Configure order fields with payload values such as {{webhook.symbol}}, {{webhook.action}}, and {{webhook.quantity}}. Give the order an output variable such as order, then notify with {{order.orderid}}.
Webhook URLs are:
Tokens and secrets are generated by the server. Use HTTPS for an internet-facing webhook.
Import, Export, and Replace
Imported JSON uses this top-level shape:
Import creates a new workflow. Replace from JSON changes the graph of an existing workflow while preserving its ID, webhook token/secret, API key, and active flag. If active trigger configuration changes, deactivate and reactivate the workflow so the trigger is registered again.
See Flow Editor for the execution model, complete node reference, import behavior, tested tutorials, and current limitations.
Execution and Safety
One per-workflow lock prevents overlapping executions of the same workflow.
A graph is limited to 500 nodes, 1000 edges, depth 100, and 500 total node visits.
Schedule jobs use
coalesce=true,max_instances=1, and a 60-second misfire grace.Active price and order-update watches are removed on deactivation/deletion and restored after restart when persisted configuration permits it.
Order nodes use the same service layer and Analyzer/semi-auto routing rules as the REST API.
Delay nodes and external broker/HTTP calls keep execution synchronous; avoid long waits across many active workflows. A
delaynode is capped at 300 seconds, whilewaitUntilis uncapped and holds the workflow lock for its full duration.
Last updated