Logo
Help center

Run and configure the bot

The bot is a .NET 8 process that runs in Cloudflare Containers; it connects to the Spotware Open API over TCP+TLS, authenticates your account, listens to M5 bars and live ticks, generates signals according to your parameters and opens / closes orders.

This page is written for cTrader (forex) accounts specifically — the sections below on chains, pending-order distance and account-wide halts don't carry over to Binance one-for-one. See Crypto (Binance) mechanics further down this page, and for wizard fields specifically.

Toggle ON / OFF

/dashboard/accounts — each account card has a toggle switch. When you flip it on, the engine picks up the change within a few seconds, authenticates your account and starts the bot.

When you toggle it off while the bot holds a position or resting orders, you are asked what should happen to them: cancel the bot's resting orders and keep the position with its own TP/SL, or also close the position at market. Either way the bot stops sending new orders at once. Your own manual orders and positions are never touched. A bot that holds nothing simply stops.

The wizard's last step offers two buttons. Create and start saves the bot and starts it at once. Save without starting stores it switched off: review it, wait for the market, or keep it for later, then turn it on from its card.

Parameters

There are two levels:

  • Account-independent default — A user-level setting for Investion. Edit at /dashboard/algorithms/investion .
  • Account-specific override — on an account's detail page, Settings → Open account-specific parameters. These patches layer on top of the account-independent defaults; only the fields you change are saved.

The moment you hit Save the engine picks up the change within a few seconds, stops the bot and restarts it with the new parameters. In the log feed you'll see the"Restarting session — parameter overrides changed" line.

Which algorithms can I use?

  • Investion — our 19k-line main strategy; ~60 parameters, multiple filters, chain creation, trailing SL.

What happens after you turn a bot on

Turning a bot on does not place a trade. This is the order things happen in:

  1. It warms up. The bot loads recent history so its indicators have something to work from instead of starting blind.
  2. It waits for the first candle to close. The instance row shows the time of that first check. How long this takes is decided entirely by the timeframe: on M1 it is under a minute, on H1 it can be the best part of an hour. A bot that looks stuck on H1 is usually just early.
  3. Sometimes the first candle is skipped. While the indicators warm up the very first close can pass without an evaluation. The label keeps saying it is waiting rather than pretending otherwise — this is normal, not a fault.
  4. Then it checks every candle close. From that point on the bot evaluates each candle as it finishes, for as long as it is running.

What the label on the instance row means:

  • First bar check: ~HH:MM — the bot has not looked at a candle yet; this is when it will.
  • Waiting for a candle to close… — that moment has passed and it still has not evaluated one. Give it another candle.
  • Checking every candle close — the bot is working normally.

Checking is not trading. Whether the bot opens a position depends on your entry filters, and with conservative settings that can take dozens of candles — or not happen at all on a quiet day. A bot that has evaluated and not traded is a bot doing its job.

If it stays on "waiting" well past a couple of candles, check that the market is open and that the instance Log shows a session line.

The bot isn't trading

A few possibilities:

  1. No signal — Investion's defaults (min filter score 0.7) are conservative. Depending on market conditions, hours can pass without a signal.
  2. Session didn't come up /dashboard/history → is there a"Session ... started for Investion" line?
  3. Market closed — Forex shuts down for the weekend. The bot also waits for ticks. (Binance futures trade around the clock — this one doesn't apply to a crypto bot.)
  4. Volume too small — if it violates broker minimum-lot rules. Don't push the Initial Volume (Lot) parameter below 0.01.
  5. It just started. A bot evaluates on each candle close, not the moment you turn it on, and the first candle is sometimes skipped while its indicators warm up. See the section above for what each label on the instance row means.

Pending orders and how far they are

A martingale chain places its next steps as pending orders before the market reaches them. The Distance column says how many pips are left before each one triggers; sort by it and the order that fires next comes to the top.

It is measured against the price the order would actually fill at — the ask for a buy, the bid for a sell. That is the opposite side from the one an open position is valued at, where a long is marked to the bid because that is where it would be closed. So the same symbol can show two prices a spread apart, and both are correct. An order with no live quote yet shows a dash rather than zero.

Closing everything (Close All)

Close All closes every open position, and Cancel All removes every pending order. Each request is sent to the broker one at a time to keep them from interfering with one another, so on a large martingale grid (dozens of pending orders) the sweep takes a few seconds to finish — let it complete rather than clicking again. A big batch can run past the on-screen refresh, so a position or order may briefly still show until its confirmation arrives.

Pending orders are cancelled closest-to-price first — the rungs price could reach soonest are cleared before the far ones, which shrinks the chance one fills while the sweep is still running. cTrader (and every broker) has no instant "freeze", so a rung can still fill in the short window before its cancel lands; if that happens, close that position too.

While the cancellations are still finishing, the bot will not open a new chain — it waits until no pending orders remain, then may start fresh on the next candle. That short pause is expected, not a fault.

Closing from a bot's bar

Every bar on a bot card is one unit the bot manages — on cTrader a martingale chain of several rungs, on a crypto exchange the single merged position. Its close button closes that whole unit and cancels the chain's still-pending rungs along with it: leaving one behind would let it fill minutes later and rebuild the chain you had just closed. The button on the bot card itself does the same for every bar at once.

Closing is not stopping. The bot stays switched on, waits until no pending orders remain, and may open a fresh chain on the next candle — which is why the confirmation offers "Close and pause the bot" as a separate action. Choose that one if you want the bot to stay out of the market.

An order I see here doesn't exist in cTrader

cTrader is the source of truth. The engine keeps its own copy of your open positions and resting orders so the dashboard can render them instantly, and that copy is kept up to date from the broker's live events. If one of those events is missed — the connection drops for a moment, or an order is cancelled or expires while the engine is reconnecting — the copy can drift and show something the broker no longer has.

The engine now re-asks the broker what is actually open on a regular cycle and removes anything the answer doesn't list, so a stale row clears itself within a minute or so. Cancelling one also clears it immediately: if the broker replies that the order no longer exists, that answer is treated as proof the row was stale, not as a failed cancellation.

Nothing is removed on a guess. An entry created while the engine was asking the broker is never deleted by an answer that predates it, and each bot only ever prunes orders carrying its own label — so a running bot's live orders are untouched.

When the bot stops itself

Sometimes the broker refuses an order for a reason that applies to the whole trading account rather than to that one order — not enough free margin, the account's maximum exposure or position count reached, trading switched off on the account, or the cTrader authorisation having expired. Every order any bot on that account sends next will be refused for the same reason.

When that happens the engine stops every bot on the account instead of letting them keep firing orders into a wall. You get an error notification naming the cause, and the instance shows as stopped with the same reason — for example "Not enough balance — the broker is refusing new orders (NOT_ENOUGH_MONEY)". Open positions and resting pending orders are left untouched, exactly as with any other stop: they run out at their own take-profit / stop-loss.

Fix the underlying cause — deposit funds, close some positions, re-enable trading with your broker, or reconnect the account — and then switch the bot back on. Narrower refusals (an invalid volume, a closed market, a rate limit) do not stop anything; only the order in question fails.

This whole section is written in cTrader/broker terms (margin, position count, "NOT_ENOUGH_MONEY"). A crypto bot's exit path is different — see Crypto (Binance) mechanics below.

Reading the logs: user vs. technical

By default the Bot Instance Logs page (and the log panel under each instance) shows only user-facing lines — the events that actually affect your account: orders opened and closed, stop-loss/take-profit set, chain and martingale actions, risk warnings, and errors.

Technical lines — filter internals, historical-data warm-up, symbol resolution, and low-level broker/protocol messages — are not shown here at all; they're engine internals with no bearing on your account, so the log stays focused on what actually happened.

Technical lines aren't stored long-term either, which keeps things fast and your history clean. If you ever need them for support, they're available to the team on the admin side.

Crypto (Binance) mechanics

The crypto side isn't the forex bot with fields hidden — it's built around a different market model, so several sections above simply don't apply. Wizard-field-level detail lives on /help/crypto-settings; this is the account/instance-screen picture.

  • No chains, one merged position. Forex opens a new position per martingale rung and groups them into a chain; on Binance, same-side fills on a symbol merge into a single position at a weighted-average entry instead — so a position belongs to the account, not to one instance the way a chain does.
  • Different account-screen columns. There's no pip or swap column, and no per-position instance label, for the same reason: nothing to attach one to. In their place: liquidation price, position leverage, and the account's margin ratio — set up on the Leverage/Margin Mode wizard fields, documented on the crypto settings page above.
  • No funding shown yet. Binance charges/pays funding on a perpetual futures position periodically; this platform doesn't read or display it yet — it needs its own endpoint and its own per-position accounting, tracked as a separate piece of work rather than shown as zero.
  • No account-wide halt section like the one above — a crypto position's downside is bounded by liquidation (see Leverage/Margin Mode), not by a broker-level refusal reason shared across every bot on the account.

Controls on this step

What the app checks before letting you continue, and why.

  • Who owns a stop or a target you set yourselfA level you set from a position's edit box belongs to you, and two things follow from that. Setting one never hands the position to a bot: a position you opened yourself stays yours even after you put a target on it, and the bot goes on leaving it alone. And on a position the bot does own, your level wins — the bot will not move it or remove it, and it stops managing that side, saying so in the bot's log so you can see which side it is still running. Clearing the field hands that side back, and the bot resumes on its next bar. Only these two sides are separate: setting a target does not stop the bot managing the stop, or the other way round.
  • How to tell your own positions from the bot'sA position you opened yourself carries a Manual mark, and a bot running on that account will not touch it: it places no orders against it, moves no target on it and never closes it. The mark appears only while a bot is actually running — on an account nobody has automated, every position is yours and saying so on each row would tell you nothing. A stop or a target you set yourself wins, on your position and on the bot's alike: the bot will not move it or remove it, and it stops managing that side until you clear the field. Clearing it hands that side back to the bot. The note you see when editing a level on a bot's position says exactly this, and it is shown only where a bot is actually managing something. If you want to watch a position's profit and loss from here, you do not need to start a bot for it — a stopped bot's account still shows its positions live.
  • Why the history columns differ between forex and cryptoA closed trade is described in the terms its own market uses. On a cTrader account the distance a trade travelled is shown in pips, and a chain column names the martingale chain the trade belonged to. On a futures account neither exists: the venue nets every fill into one position, so there is no chain to name, and it has no pip at all — the move is shown as a percentage instead. Columns a market has no answer for are not drawn, rather than drawn empty, because an empty column invites you to wonder what is missing. On the dashboard's recent-trades panel, which mixes accounts from both markets in one list, there is no distance column for the same reason: the unit would change as you read down it. Where a distance cannot be worked out — the broker's pip size is unavailable, or an opening price never arrived — the cell shows a dash and the exported spreadsheet leaves it empty. That is deliberate: a zero there would read as “this trade broke even”, which is a claim, not a gap.
  • A stale liquidation price is not shownThe liquidation price on an open position is read from the exchange, not estimated — unlike the line the wizard draws before a bot starts, which is a projection. Because a grid averages down, the figure moves on every fill, so it is re-read whenever a position changes size and once a minute besides. If the last reading is too old to trust, the cell shows a dash instead of the old number. That is the whole point of the control: someone reading an out-of-date liquidation price believes there is room that may already be gone, and on a strategy that walks toward that price by design the belief is the expensive kind. Under Isolated margin the figure only moves when the position's size or its own margin does, and both of those arrive as events, so an Isolated reading does not expire.
  • When a setting of yours could not be appliedA bot always starts with the algorithm's own default for every setting, then your choices are laid over the top. If one of your values cannot be read, that setting keeps the default — the bot still runs, because one unreadable field should not stop a whole strategy. What the bot will not do is keep that to itself: the first lines in the log name every setting that did not survive, so you can see at a glance that the bot is running on a number you did not pick. Re-enter the named settings in the wizard and restart the bot. Empty is never read as zero — zero martingale orders is a real and completely different strategy, so it is only ever used when you actually choose it.
  • Confirmation before bulk actionsClose All, Close Group, Cancel All and deleting an instance each ask for confirmation first — these actions are irreversible and can affect real positions, so a single misclick can't trigger them.
  • Stopping a bot asks what happens to its ordersWhen you stop a bot that still holds a position or resting orders, you choose: cancel the bot's resting orders and keep the position with its own TP/SL, or also close the position at market. The dialog warns what each choice means before it happens, and afterwards says how many orders were cancelled and positions closed. Only the bot's own orders are touched — never your manual ones. A bot that holds nothing just stops. Deploys and restarts never cancel anything.