trade.closed¶
Direction: server → modules. External Moleculer event name: trade.closed.
Source and occurrence¶
C++ payload: TradeRecord or TradeCalcRecord. Internal EventBus name: trade.push.
The trading runtime emits EV_RECORD_CLOSE_TRADE after a market-position close. TradeManager also emits this code for partial-close history records. Router formats the accepted record; it does not infer closure from DELETE.
Only BUY/SELL records are exported. parent_order identifies the original order for partial-close history; closed_volume preserves the source value. reason is creation source, whereas activation identifies SL = 1, TP = 2 or STOPOUT = 4 (NONE = 0). Deleting or expiring pending orders does not emit this event. profit is the record profit; commission/storage are not included.
JSON payload¶
The payload is flat; there is no data wrapper. All listed fields are emitted.
{
"event_id": "a89e743cf46a4855986aa6769e47a075",
"event_code": 6,
"occurred_at": 1789080000,
"schema_version": 1,
"order": 500101,
"login": 2000066,
"brand": "ion4",
"symbol": "EURUSD",
"cmd": 0,
"volume": 100,
"open_price": 1.0842,
"reason": 6,
"activation": 1,
"state": 3,
"close_price": 1.079,
"close_time": 1789080000,
"profit": -52,
"parent_order": 0,
"closed_volume": 0
}
| Domain field | JSON type |
|---|---|
order |
integer |
login |
integer |
brand |
string |
symbol |
string |
cmd |
integer |
volume |
integer |
open_price |
number |
reason |
integer |
activation |
integer |
state |
integer |
close_price |
number |
close_time |
integer |
profit |
number |
parent_order |
integer |
closed_volume |
integer |
Common fields: event_id (32-character random hex string), event_code (original integer code), occurred_at (Unix seconds), schema_version (integer, currently 1). Volume retains platform units (lots × 100). Brand is resolved through current in-memory account/group managers, and can be empty if the lookup fails. occurred_at uses the source timestamp; zero remains zero. Margin uses transition time.
Subscription and delivery¶
Subscribe through the module's normal Moleculer event handler for trade.closed.
Enabled with server nats.enable. Publication is asynchronous, fire-and-forget,
without ACK, retry or durable replay. Queue limit: 4096 business messages; JSON limit:
16 KiB. New messages can be dropped at either limit; order is not guaranteed.
event_id supports consumer deduplication, not exactly-once delivery.
See shared outbound rules for lifecycle, observability and trust limits. See outbound catalogue for other event families.