Strasmore Research
Onderzoeken Matt ConnorDoor Matt Connor

Self-match prevention en wash trades uitgelegd

Self-match prevention voorkomt dat uw eigen orders onderling worden uitgevoerd. Ontdek hoe deze matching engine techniek werkt en waar de juridische grens met wash trades ligt.

Self-match prevention is een functionaliteit van de matching engine die voorkomt dat twee orders van hetzelfde bedrijf met elkaar worden uitgevoerd. Orders bevatten bij invoer een identificatiecode; wanneer twee orders met diezelfde code elkaar zouden kruisen, annuleert de engine één of beide orders voordat er een trade tot stand komt. Self-match prevention is technische infrastructuur van de beurs die u inschakelt, terwijl het verbod op wash trades wettelijk is vastgelegd; deze twee zaken dekken niet hetzelfde gebied.

Zodra een tweede strategie een instrument noteert dat uw eerste strategie al noteert, is deze regel voor u van kracht. Een grid-bot met twee ladders op één symbool voldoet aan dezelfde voorwaarden als een bank-desk.

Hoe self-match prevention werkt bij de matching engine

Elke order die een beurs ontvangt, bevat velden die de engine leest vóór de matching: side, price, size en time in force. Self-match prevention voegt daar twee velden aan toe. Het eerste is een identificatiecode, een nummer of reeks tekens die aangeeft bij welk bedrijf, welke rekening of welke strategiegroep de order hoort. Het tweede is een instructie die de engine vertelt wat te doen wanneer twee actieve orders met die identificatiecode met elkaar zouden handelen.

De controle vindt plaats op het moment dat een agressieve order de prijs bereikt van een resting order waarmee deze zou matchen. Er zijn vier uitkomsten die veel worden gebruikt:

  • Annuleer de resting order. De inkomende order gaat door in het orderboek en kan matchen met wat er achter de geannuleerde order op die prijs staat.
  • Annuleer de inkomende order. De resting order behoudt zijn positie in de wachtrij en de agressor verdwijnt.
  • Annuleer beide orders, de strengste instelling.
  • Decrement en annuleer. De grotere order wordt verkleind met de omvang van de kleinere, de kleinere wordt geannuleerd en het restant blijft actief.

In geen van de vier gevallen vindt een trade plaats. Er wordt niets naar de tape gestuurd, er verschijnt niets in een fill log, en in plaats daarvan ontvangt u een ongevraagde annulering op één of beide zijden.

De positie in de wachtrij is de stille kostenpost. Een resting order die wordt geannuleerd onder een 'cancel-oldest'-instructie verliest alles wat door het wachten was opgebouwd. Onder price-time priority is dat verlies totaal: opnieuw invoeren plaatst de order achter iedereen die zich in de wachtrij aansloot terwijl de order daar stond. Onze gids over estimating queue position behandelt wat die plek in de rij waard is.

Eén instrument, meerdere orderboeken

De controle vindt per beurs plaats. Een engine vergelijkt alleen de orders die hij zelf vasthoudt. Twee van uw orders die in twee verschillende boeken staan, zijn onzichtbaar voor elkaar, en er is geen mechanisme voor Amerikaanse aandelen dat over deze boeken heen reikt. Een enkel Amerikaans aandeel noteert in veel boeken tegelijk. Het onderstaande paneel telt het aantal afzonderlijke noterende en uitvoerende beurzen voor zes bekende namen gedurende een venster van vijftien minuten op de ochtend van 10 juni 2026.

QueryVenues die hetzelfde aandeel noteren en verhandelen binnen een venster van 15 minuten
De exacte SQL achter elk getal
SELECT
    q.ticker          AS ticker,
    q.quoting_venues  AS quoting_venues,
    t.printing_venues AS printing_venues
FROM
(
    SELECT
        ticker,
        countDistinct(bid_exchange) AS quoting_venues
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND sip_timestamp >= toDateTime('2026-06-10 14:00:00', 'UTC')
      AND sip_timestamp <  toDateTime('2026-06-10 14:15:00', 'UTC')
      AND bid_price > 0
    GROUP BY ticker
) AS q
INNER JOIN
(
    SELECT
        ticker,
        countDistinct(exchange) AS printing_venues
    FROM global_markets.stocks_trades
    WHERE ticker IN ('AAPL', 'MSFT', 'NVDA', 'SPY', 'KO', 'JNJ')
      AND sip_timestamp >= toDateTime('2026-06-10 14:00:00', 'UTC')
      AND sip_timestamp <  toDateTime('2026-06-10 14:15:00', 'UTC')
    GROUP BY ticker
) AS t ON t.ticker = q.ticker
ORDER BY quoting_venues DESC, ticker
Run this yourself

AAPL trok biedingen aan van 16 afzonderlijke beurzen in dat kwartier, en trades werden uitgevoerd op 17 daarvan. De minst verhandelde naam in het paneel trok nog steeds 11 noterende beurzen aan. Een smart order router die child orders opsplitst, zal uw twee strategieën in de meeste gevallen in verschillende boeken plaatsen, waar geen controle op engine-niveau van toepassing is. Bedrijven dichten dat gat stroomopwaarts, in de order management-laag, voordat er iets het systeem verlaat. Uw eigen orders die aan tegenovergestelde zijden op dezelfde prijs in twee boeken staan, produceren ook een locked or crossed market, waarvoor eigen regels gelden.

Hoeveel matches één boek maakt in een sessie

De self-match controle bevindt zich in het pad van elke match die de engine maakt, en bij een liquide naam is dat pad de hele dag bezet. Het onderstaande paneel verdeelt een volledige sessie van één aandeel in segmenten van vijftien minuten en telt de trades in elk segment, waarbij alleen de segmenten met ten minste 200 trades worden getoond.

QueryPrints per 15-minuten bucket, één volledige sessie
De exacte SQL achter elk getal
SELECT
    formatDateTime(toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 15 MINUTE), '%H:%i') AS et_time,
    count() AS trade_count
FROM global_markets.stocks_trades
WHERE ticker = 'AAPL'
  AND sip_timestamp >= toDateTime('2026-06-10 08:00:00', 'UTC')
  AND sip_timestamp <  toDateTime('2026-06-11 04:00:00', 'UTC')
GROUP BY et_time
HAVING count() >= 200
ORDER BY et_time
Run this yourself

Om 04:00 ET noteerde die naam 9402 trades in vijftien minuten, en om 19:45 ET noteerde het 1345, verdeeld over 64 segmenten die de grens van 200 trades overschreden. Elke trade is één paar orders dat de engine bij elkaar bracht, en de controle leest de identificatiecodes aan beide kanten voordat ze elkaar mogen ontmoeten. Elke order die in het boek terechtkomt, is een kandidaat om later op de dag een andere order van dezelfde rekening te ontmoeten.

Wat de tape laat zien wanneer een self-trade wordt uitgevoerd

Een voorkomen self-match laat niets achter. De tape bevat alleen wat daadwerkelijk is uitgevoerd, en elke trade komt binnen met condition flags: codes die de rapporterende beurs toevoegt om te beschrijven hoe de trade tot stand kwam. Het onderstaande paneel splitst een volledige sessie van één aandeel uit naar deze flags.

QueryTrade condition flags gedurende één volledige sessie
De exacte SQL achter elk getal
SELECT
    condition_name,
    print_count,
    round(100 * print_count / sum(print_count) OVER (), 2) AS share_pct
FROM
(
    SELECT
        cc.id        AS condition_id,
        any(cc.name) AS condition_name,
        count()      AS print_count
    FROM
    (
        SELECT toInt32(arrayJoin(conditions)) AS condition_id
        FROM global_markets.stocks_trades
        WHERE ticker = 'AAPL'
          AND sip_timestamp >= toDateTime('2026-06-10 08:00:00', 'UTC')
          AND sip_timestamp <  toDateTime('2026-06-11 04:00:00', 'UTC')
    ) AS f
    INNER JOIN
    (
        SELECT
            toInt32(id)  AS id,
            any(name)    AS name
        FROM global_markets.stocks_condition_codes
        WHERE asset_class = 'stocks'
          AND has(data_types, 'trade')
        GROUP BY id
    ) AS cc ON cc.id = f.condition_id
    GROUP BY condition_id
)
ORDER BY print_count DESC
LIMIT 10
Run this yourself

Odd Lot Trade beslaat 48.34% van de trades met flags in die sessie, en het paneel somt de 10 meest voorkomende flags van de dag op. Lees de lijst en merk op wat ontbreekt. Geen code betekent dat twee orders van één bedrijf kwamen. Een self-trade die wel wordt uitgevoerd, ziet eruit als elke andere trade op die prijs, dus toezicht hierop vindt plaats via de tape, op basis van de deelnemerscodes die de beurs aanhoudt en de rekeningnummers die aan de orders zijn gekoppeld.

Waar self-match prevention eindigt en wash trade-wetgeving begint

Self-match prevention is een dienst van de beurs. U kiest ervoor, u configureert het, en de engine zal uw twee orders vrolijk matchen als u het niet instelt. Het verbod op wash trades is niet optioneel en hangt niet af van enige instelling.

Sectie 9(a)(1) van de Securities Exchange Act van 1934 heeft betrekking op transacties in effecten waarbij geen verandering in economisch eigendom plaatsvindt, aangegaan om een misleidende schijn van actieve handel te creëren. De Commodity Exchange Act bevat het equivalent voor futures, en CME Rule 534 herhaalt dit in het reglement van de beurs. FINRA Rule 5210 valt voor broker-dealers onder beide, en het aanvullende materiaal behandelt self-trades direct: trades tussen twee ongerelateerde algoritmen bij één bedrijf zijn op zichzelf niet verboden, maar van het bedrijf wordt verwacht dat het beleid voert om ze te controleren en te verminderen.

Er zijn twee gevolgen voor iedereen die meer dan één strategie draait. Een self-cross kan het verbod schenden op een beurs waar u helemaal geen self-match instructie heeft ingesteld, aangezien de regel betrekking heeft op de transactie en de intentie erachter. Een self-cross die door self-match prevention is gestopt, schendt niets: het stoppen ervan is precies het doel.

Hoe operators het configureren: CME, ICE, LME en MiFID II

Op CME Globex werkt self-match prevention op basis van een identificatiecode die bij orderinvoer wordt ingediend. Bedrijven registreren de codes die ze zullen gebruiken, elke order bevat er een, en een gekoppelde instructie bepaalt welke zijde de engine annuleert wanneer twee orders met die code elkaar ontmoeten. Orders die zonder code worden verzonden, matchen normaal, wat de valkuil is voor een nieuwe operator: de standaardinstelling is uitgeschakeld.

ICE hanteert Self-Trade Prevention Functionality, geconfigureerd op basis van een identificatiecode voor het handelsbedrijf in plaats van per order, met dezelfde reeks annuleringsuitkomsten. De London Metal Exchange biedt Self-Execution Prevention op LMEselect voor identificatiecodes van leden. In Europa legt MiFID II Artikel 17 de verantwoordelijkheid voor systemen en controles bij elke beleggingsonderneming die aan algoritmische handel doet, inclusief testen, kill-functionaliteit en het voorkomen van wanordelijke handel. Artikel 48 legt een vergelijkbare plicht op aan de beurs zelf, en preventietools aan de kant van de beurs werden daarmee standaarduitrusting.

Configuratie vindt plaats op rekening- of bedrijfsniveau in plaats van per symbool. De omvang van het optie-oppervlak van een enkel onderliggend aandeel laat zien waarom.

QueryOptiecontracten met volume op één underlying, juni 2026
De exacte SQL achter elk getal
SELECT
    toString(date)                 AS session_date,
    countDistinct(ticker)          AS contracts_traded,
    countDistinct(strike_price)    AS strikes_traded
FROM global_markets.options_greeks
WHERE underlying_symbol = 'AAPL'
  AND date >= '2026-06-01'
  AND date <= '2026-06-30'
  AND volume > 0
  AND iv_converged = 1
GROUP BY date
ORDER BY date
Run this yourself

Op 2026-06-01 bevatte één onderliggend aandeel 1579 afzonderlijk verhandelbare contracten met volume, verspreid over 112 uitoefenprijzen, en het paneel beslaat 21 sessies van vergelijkbare omvang. Het instellen van een regel per contract is bij dat aantal onbeheersbaar. De identificatiecode wordt in plaats daarvan aan de rekening gekoppeld en reist mee met elke order die die rekening verzendt.

De foutmodus die uw fill logs niet zullen verklaren

Dit is hoe dit in de praktijk uitpakt. Een 'cancel-newest'-instructie doodt de order die u zojuist heeft verzonden, bij aankomst, voordat deze kan matchen. Vanuit de bot gezien leest de reeks als een nieuwe order gevolgd door een annulering waar niemand om vroeg. Er is geen fill, geen reject en geen foutmelding met een reden, dus operators die dit voor het eerst tegenkomen, zoeken vaak naar een bug in hun eigen annuleringspad.

Twee gewoonten maken dit inzichtelijk. Log de orderstatusberichten van de beurs letterlijk in plaats van een genormaliseerde samenvatting, aangezien de reden voor de preventie meestal als veld in dat bericht staat. Stel een alert in op elke annulering die niet door uw eigen code is geïnitieerd. Die alert hoort bij uw automated trading circuit breakers, aangezien de fout van dezelfde klasse is: de beurs heeft uw orderstatus gewijzigd en uw proces ging door alsof er niets was gebeurd.

FAQ

Wat is self-match prevention?

Een controle door de matching engine die voorkomt dat twee orders met dezelfde bedrijfs- of rekeningidentificatiecode met elkaar handelen. Wanneer ze zouden matchen, annuleert de engine de resting order, de inkomende order of beide, volgens de instructie die aan de order is gekoppeld.

Is een self-trade hetzelfde als een wash trade?

Nee. Een self-trade is elke uitvoering tussen twee orders van dezelfde economische eigenaar. Een wash trade is een self-trade die is ingevoerd zonder reëel marktrisico en met de intentie om een misleidende schijn van activiteit te creëren. Onbedoelde self-trades tussen ongerelateerde algoritmen worden anders behandeld dan opgezette trades, en van bedrijven wordt nog steeds verwacht dat ze deze monitoren.

Werkt self-match prevention op verschillende beurzen?

Nee. Elke matching engine past de controle alleen toe op orders in zijn eigen boek. Twee orders van één bedrijf die op twee beurzen staan, kunnen met elkaar handelen, wat die taak overlaat aan de eigen pre-trade controles van het bedrijf boven de beurzen.

Waarom werd mijn order geannuleerd zonder fill en zonder reden?

Een 'cancel-newest' self-match instructie is een kandidaat: de beurs annuleerde de order bij aankomst, voordat deze kon matchen met een resting order die uw identificatiecode droeg. De reden verschijnt meestal als een veld in het annuleringsbericht van de beurs in plaats van als een afwijzing.

Welke beurzen vereisen een self-match prevention identificatiecode?

De vereisten variëren per beurs en product. CME vraagt om een identificatiecode bij orderinvoer, die vooraf moet worden geregistreerd, terwijl ICE en de London Metal Exchange hun eigen configuraties op bedrijfsniveau aanbieden en Europese beurzen onder MiFID II verplichtingen hebben voor systemen en controles. Het reglement van de beurs voor het product dat u verhandelt, is leidend.


Elk paneel hier bevat de SQL die het heeft geproduceerd, dus vouw er een uit en lees deze. Om het aantal beurzen te tellen dat een naam noteert die u verhandelt, of om een sessie op te splitsen in condition flags, stelt u de vraag in gewoon Nederlands op de Strasmore-terminal.