Skip to content

Place manually or by RFQ

This page is for the author of an ems plugin: it places a trade agreed by phone as a manual placement, and works an order by asking dealers for quotes and picking one. What each type means is in Placement types and RFQ quotes.

You need SDK 0.32.0 or later and a deployment (chart 0.1.309 or later).

A manual placement

A trade agreed by phone or chat names no connectivity plugin. It names its counterparty as its destination, and its evidence:

reply = await role.create_placement(
    order_id=order_id,
    placement_type="manual",
    destination="VEN-...",                      # the counterparty
    counterparty_contact="J. Smith, FX desk",
    agreed_at_ns=agreed_at_ns,
    agreed_precision="second",
    quantity=Decimal("1000000"),
    acting_for=request.caller.header,
)

Then enter its fills as the ems's manual executions, for the person, with the counterparty's execution ID where it gave one:

await role.report_execution(
    placement_id=reply.placement.placement_id,
    kind="manual",
    venue_execution_id="CP-4471",               # the counterparty's, if any
    quantity=Decimal("1000000"),
    price=Money(Decimal("1.0842"), "USD"),
    trade_time_ns=agreed_at_ns,
    trade_date="2026-10-22",
    settlement_date="2026-10-26",
    acting_for=request.caller.header,
)

An RFQ placement

Place with placement_type="rfq" at a connectivity plugin whose venue lists rfq for the account's code on its catalogue (read_venue_catalogue). The connectivity plugin asks its venue and records each dealer's quote on the placement; the ems hears them on the placement (placement_updated). Show the open quotes, best first, and let the person pick:

from meridian.roles import ems

quotes = ems.open_quotes(placement)              # best first for the firm's side
await role.pick_placement_quote(
    placement_id=placement.placement_id,
    quote_id=chosen.quote_id,                    # any open quote, not only the best
    reason="best all-in after the dealer's settlement terms",
    acting_for=request.caller.header,
)

The connectivity plugin accepts the pick at the venue and reports the fill as on any placement. If the quote expires before the venue accepts it, the pick is cleared: pick another. An agent's pick is refused on a connection that is not demo while the agents' guard is on, as an agent's placement is.

The ems suite's picks-a-quote-on-its-rfq-placement holds the pick. It carries no about, so every ems maps it to its own pick.

In a connectivity plugin

On meridian.roles.connectivity's Trader, the adapter states the types its venue takes beside DMA, placement_types(code), and where it takes RFQs, request_quotes, quotes and accept_quote; the Trader does the rest. See Placement types and RFQ quotes.