A signal tells you two things and only two things. Direction, and how much the model believes it. Long BTC, high conviction. Short EURUSD, marginal. That is genuinely useful, and it is also nowhere near enough to place an order. When I first started wiring alerts to execution I kept hitting the same wall. The signal fires, and then I am standing in front of a broker API that wants a size, an order type, a price, and a time-in-force, and the signal has opinions on none of it.
That gap is where most automated setups quietly leak money. Not in the alpha, in the plumbing. Two people can run the identical signal and one of them makes money while the other bleeds slippage, because one of them turned the signal into an order the same disciplined way every single time and the other one improvised at 3am. So the thing worth building is not a better signal. It is a boring, deterministic function that takes signal metadata in and produces a fully specified order out.
What the signal actually carries
Before you can map anything you need to be honest about what fields your signal actually has. Most signals I work with carry roughly the same shape, whether they come from whale flow, a political trade feed, or a backtested strategy. There is a direction. There is a conviction score, usually normalized to something like zero to one. There is often a horizon, meaning is this a scalp or a multi-week hold. And there is context, like current volatility or how far price already ran before the alert triggered.
If your signal only gives you direction, you can still build the map, you just fill the missing inputs with account-level defaults instead of per-signal ones. The important part is that every missing field has a rule, not a shrug. A shrug is how you end up sizing a marginal signal the same as a screaming one.
The five decisions, each with a rule
An executable order is really five decisions. Size the map so each decision reads a specific field and produces a specific output, no discretion left over.
- Size. Anchor to a fixed fraction of account risk, not a fixed notional. Decide the dollars you are willing to lose if the stop hits, then let the distance to your stop set the position size. Conviction scales this risk budget, but keep the scaling gentle. I cap it so the strongest signal risks maybe twice what the weakest tradeable one does, never ten times. Conviction scores are noisier than they look and you do not want one overconfident number to blow a hole in the account.
- Order type. This is a function of urgency and spread. Tight spread and a signal that decays fast, you cross the spread with a marketable limit and accept the cost. Wide spread or a slow horizon, you post a passive limit and let it fill. I almost never send a raw market order in anything but the deepest books, because a market order is a blank check to whoever is on the other side.
- Limit price. Derive it, do not eyeball it. For a marketable limit, take the current touch and add a slippage tolerance sized to recent volatility, a small multiple of the average bar range or the current spread. That gives the fill room to happen without handing away unlimited price. For a passive limit, anchor to the touch or a tick inside it and accept that some fills never come. A signal that only pays off if you get a perfect entry was probably never that strong.
- Stop and target. The stop is not a P and L preference, it is the price at which the signal's premise is wrong. Place it where the setup is invalidated, then, and only then, read backward to figure out size. People do this in the wrong order constantly. They pick a size they are comfortable with, then jam a stop wherever the loss feels tolerable, and now the stop has nothing to do with the trade being wrong.
- Time-in-force. Match it to the signal's horizon. A fast signal gets an immediate-or-cancel or a short good-till-time, because a fill that arrives ten minutes late is filling on stale information. A slow signal can rest as good-till-cancelled. The failure mode here is leaving a day order sitting after the reason for the trade has already evaporated.
Why the mapping has to be deterministic
The whole point is that the same alert produces the same order every time. If you can feed a past signal back through the map and reconstruct the exact order you would have sent, you have something you can actually backtest and audit. If the output depends on your mood or how the chart looked that morning, you have nothing you can measure, because you can never separate the signal's edge from your improvisation.
This is also what lets the map travel across asset classes, which matters more than people expect. Crypto perps, cash equities, and spot FX have different tick sizes, different session hours, different borrow rules, and wildly different overnight behavior. But the five decisions are the same everywhere. What changes is the parameters you feed them. FX respects sessions and rolls, so time-in-force gets stricter around the close. Equities have a hard bell and gap risk, so overnight holds need wider stops or none at all. Crypto never sleeps, so your good-till-time logic has to reason in real hours rather than trading days. Same function, different constants. Inside Blockcircle we keep those venue constants in one place so a signal can route to any of the connected venues without rewriting the logic each time.
A quick sanity check before it goes live
Before you let this run unattended, push a handful of historical signals through it by hand and read the orders it produces out loud. Does the marginal signal get a small position and the strong one a bigger but not insane one. Does the stop sit where the trade is actually wrong. Would the limit price have filled given the spread that day, or is it fantasy. Does the time-in-force expire before the edge does.
If any of those feels off, the bug is in the map, not the signal, and it is much cheaper to find it here than in a live drawdown. Most of the money I have watched people lose on automated setups was never a signal problem. It was a fully specified order that nobody ever specified, so the machine specified it badly and did so consistently. Getting the map right is unglamorous work, and it is the part that decides whether the same alert makes money twice.