Smart Order Routing in Crypto: Eén Order, Twaalf Venues, Geen NBBO
Je moet 400 BTC kopen. Binance heeft de meeste diepte. OKX en Bybit tonen elk een behoorlijke omvang, één tick breder. Coinbase noteert een betere hoofdprijs, maar in USD, niet in USDT. De beste bied- en laatprijs van Kraken ziet er fantastisch uit en is 400 milliseconden verouderd. Upbit is nog beter, maar je compliance-goedkeuring voor Korea bestaat niet, en je KRW ook niet. Een aandelenhandelaar die naar deze chaos kijkt, zou grijpen naar een smart order router en er verder niet meer bij nadenken, want in aandelen zijn de lastige onderdelen van routering twintig jaar geleden al in de regelgeving verankerd. In crypto ben jij de leidingen. Er is geen geconsolideerde tape, geen order-protection-regel, geen fee-cap, geen netto afwikkeling — en, meest fundamenteel, geen mogelijkheid om te handelen waar je kapitaal nog niet aanwezig is.
Dit artikel gaat over het toch bouwen van de router: het geconsolideerde orderboek en waarom naïeve best-price-routering daartegen geld verliest, het allocatieprobleem als een convex programma dat je daadwerkelijk kunt oplossen binnen een deadline voor child-orders, de kapitaalbeperking die crypto-SOR onlosmakelijk verbindt met treasury management, maker-bewuste routering over venues heen, en de TCA-feedbacklus die vertelt of dit alles werkt. Het is de technische tegenhanger van Complex Arbitrage Execution in Rust — dat artikel behandelt de nanoseconden; dit artikel behandelt de beslissingen.
Wat aandelen-SOR gratis krijgt
Het is de moeite waard om precies te zijn over wat Amerikaanse aandelenroutering erft van regelgeving, want elk punt op de lijst is iets dat jij moet herbouwen of bewust zonder moet stellen.
Regulation NMS (SEC, 2005) deed drie dingen die hier van belang zijn. Rule 611, de Order Protection Rule, verbiedt uitvoering tegen een prijs die slechter is dan een beschermde koers op een andere beurs — een "trade-through" — waardoor elke broker gedwongen wordt om ofwel naar de beste getoonde prijs te routeren, ofwel deze te vegen met intermarket sweep orders. Rule 610 begrenst de toegangsvergoeding die een venue mag rekenen voor het nemen van een beschermde koers op $0.003 per aandeel, zodat getoonde prijzen tussen venues vergelijkbaar zijn tot op 30 mils nauwkeurig. En de geconsolideerde tape (de SIP's) publiceert een National Best Bid and Offer, één officieel antwoord op de vraag "wat is de markt."
Het academische oordeel over deze architectuur is dat het verrassend goed werkt. O'Hara and Ye (2011), "Is market fragmentation harming market quality?" (Journal of Financial Economics 100(3), 459–474), onderzochten Amerikaanse aandelen over verschillende fragmentatieniveaus en vonden dat sterker gefragmenteerde aandelen lagere transactiekosten en snellere uitvoeringen hadden, met prijzen die dichter bij een random walk lagen. Hun samenvatting is de kernzin: Amerikaanse aandelen gedragen zich als "één virtuele markt met meerdere toegangspunten." Fragmentatie is onschadelijk wanneer smart routers plus trade-through-bescherming de fragmenten weer aan elkaar naaien. Foucault and Menkveld (2008), "Competition for Order Flow and Smart Order Routing Systems" (Journal of Finance 63(1), 119–158), toonden het mechanisme aan in de Nederlandse markt: toen een tweede limietorderboek (LSE's EuroSETS) de concurrentie aanging met Euronext, nam de geconsolideerde diepte toe, en het liquiditeitsaanbod op een venue werd direct gedempt door de trade-through-ratio ervan — routers die een venue negeren, doden de prikkel om daar te quoten.
Zelfs in deze gereguleerde wereld is het geconsolideerde beeld een leugen op korte horizonten. Ding, Hanna, and Hendershott (2014), "How Slow Is the NBBO? A Comparison with Direct Exchange Feeds" (Financial Review 49(2), 313–332), maten de SIP-NBBO tegen een NBBO opgebouwd uit directe beursfeeds in hetzelfde datacenter en vonden meerdere keren per seconde ontsporingen bij actieve namen, doorgaans één tot twee milliseconden lang — pure aggregatie- en transportlatentie. Onthoud dat getal: het is de aandelenversie van een probleem dat in crypto één tot twee ordes van grootte erger is.
Schrap nu dat alles. Crypto heeft geen NBBO omdat er geen SIP is. Geen trade-through-regel: een venue print je met plezier tegen een prijs vijf ticks door de koers van een andere venue heen, en niemand dient daar iets over in. Geen fee-cap: taker fees lopen uiteen van onderhandelde tiers van minder dan een basispunt tot retailschema's van 10 bps, dus rangschikking op getoonde prijs en rangschikking op netto prijs zijn het routinematig oneens. En geen geconsolideerde clearing: elke beurs is zijn eigen silo met voorgefinancierde saldi. Jij bent tegelijk de SIP, de router en de clearingfirma.
Het geconsolideerde orderboek bouwen, en waarom naïeve best-price-routering faalt
De technische basis is onopvallend: N WebSocket-L2-feeds, per-venue afhandeling van gaten in sequentienummers, normalisatie van symbool en ticksize, en normalisatie van de quote-valuta (een BTC-USD-boek en een BTC-USDT-boek verschillen door de USDT/USD-koers, die niet identiek 1.0 is en soms behoorlijk ver daarvandaan zit). Voeg de genormaliseerde boeken samen tot één op prijs gesorteerde ladder, waarbij elk niveau wordt gemarkeerd met zijn venue en — cruciaal — de leeftijd van de snapshot waar het vandaan komt. Als je samengevoegde orderboek de leeftijd van de quote per venue niet als eersterangs veld bevat, heb je een screensaver gebouwd, geen router.

De naïeve router loopt deze samengevoegde ladder gulzig af: eerst de beste netto prijs. Dat faalt om drie afzonderlijke redenen, en het loont om ze uit elkaar te houden omdat de oplossingen verschillend zijn.
Verouderde quotes en latentiescheefheid. Je venues leveren data niet met dezelfde latentie. Een gecolokeerde feed kan 3 ms oud zijn wanneer je erop handelt; een publieke WebSocket van een venue op een ander continent kan 300 ms oud zijn. De samengevoegde beste bied- en laatprijs is daarom een samenstelling van verschillende verledens. Wanneer BTC 10 bps beweegt in 200 ms — routine — lijken de quotes van de verouderde venue systematisch aantrekkelijk aan precies de verkeerde kant. Ernaartoe routeren betekent dat je meedoet aan een race die je al hebt verloren: de quote is verdwenen, je IOC komt leeg of gedeeltelijk gevuld terug, en tegen de tijd dat je opnieuw routeert, hebben de verse venues de prijs al aangepast. Dit is Ding–Hanna–Hendershotts probleem van 1–2 ms SIP-ontsporing, behalve dat jouw ontsporingen honderden milliseconden duren en niemand verplicht is om ook maar iets gestand te doen.
Spookliquiditeit. Het optellen van getoonde omvang over venues heen telt dubbel, omdat dezelfde marketmaker-inventaris op meerdere plekken tegelijk wordt gequote. Van Kervel (2015), "Competition for Order Flow with Fast and Slow Traders" (Review of Financial Studies 28(7), 2094–2127), documenteerde dit in gefragmenteerde aandelenmarkten: een trade op de ene venue wordt binnen milliseconden gevolgd door aanzienlijke annuleringen van limietorders op concurrerende venues, precies zoals voorspeld door een model waarin snelle liquiditeitsverschaffers overal dubbele omvang quoten en de kopieën terugtrekken zodra er één wordt geraakt. Crypto-marketmakers hanteren hetzelfde draaiboek op Binance/OKX/Bybit, dus de toegankelijke geconsolideerde diepte is wezenlijk kleiner dan de getoonde geconsolideerde diepte, en het tekort groeit naarmate je de venues meer sequentieel (in plaats van gelijktijdig) raakt. Als je router child-orders één voor één naar venues stuurt en op elke fillbevestiging wacht, ben je jezelf aan het uitmelken: elke fill signaleert de rest van de straat om te annuleren.
Fees herschikken de ladder. Een venue die de beste ruwe prijs toont met een taker fee van 7.5 bps is vaak de slechtste netto prijs in het boek. Dit klinkt te vanzelfsprekend om te vermelden, en toch is "routeren naar de beste getoonde prijs" precies wat de meeste eerste-generatie crypto-routers (en verschillende leverancierproducten) implementeren. Netto-van-fee-vergelijking is de ondergrens; het bijbehorende artikel over maker-taker fees en rebates behandelt de fee-wiskunde per venue, de dynamiek van VIP-tiers, en waarom je marginale fee-tier — niet het prijskaartje — thuishoort in de router.
De routeringsoptimalisatie
Formaliseer het child-order-probleem. Je moet nu hoeveelheid kopen, verhandelbaar, over venues . Laat de marginale laatprijs van venue zijn nadat eenheden van zijn boek zijn opgegeten (een niet-dalende trapfunctie uit de L2-snapshot), zijn taker fee, en een straf per eenheid voor veroudering en adverse selection op venue (hieronder gekalibreerd, uit je eigen markouts). De allocatie lost op
Elke is convex (integraal van een niet-dalende functie, plus een lineaire term), dus het probleem is convex, en de KKT-voorwaarden vertellen het hele verhaal: er bestaat een drempel zodanig dat
en voor venues die niets ontvangen. In woorden: giet de order over venues heen zoals water, en breng de marginale all-in kosten overal waar je handelt in evenwicht. Een venue wordt precies dan uitgesloten wanneer zijn eerste eenheid — beste prijs, plus fee, plus veroudingsstraf — slechter is dan de marginale eenheid elders.

Voor boeken met trapfuncties wordt de water-filling-oplossing berekend door een gulzige wandeling over de voor fee en straf gecorrigeerde samengevoegde ladder — de gulzige diepte-wandeling is dus op zich niet fout; het is de exacte oplossing mits je gulzig door netto marginale kosten wandelt met afgeknotte omvang, niet met ruwe getoonde prijzen. Dat onderscheid is het volledige verschil tussen een router en een screensaver.
De klassieke behandeling van het algemene probleem is Cont and Kukanov, "Optimal order placement in limit order markets" (Quantitative Finance 17(1), 21–39, 2017; arXiv:1210.1625). Zij formuleren orderplaatsing over venues heen — inclusief de verdeling tussen limiet- en marktorders, fees en rebates, en een straf voor uitvoeringsrisico — als een convexe optimalisatie, leiden een expliciete gesloten vorm af voor de limiet/markt-verdeling op een enkele venue, en geven een stochastisch-benaderingsalgoritme voor het multi-venue-geval dat een allocatie over twaalf beurzen berekent in minder dan 200 ms. Het raamwerk dateert van vóór crypto maar draagt bijna ongewijzigd over, omdat het nooit een NBBO veronderstelde — het veronderstelde alleen boeken per venue, fees per venue, en onzekerheid over fills, wat precies de crypto-situatie is.
Een minimale, eerlijke schets van de verhandelbare kant (de convexe water-fill met veroudingscorrecties):
import math
from dataclasses import dataclass
@dataclass
class Venue:
name: str
asks: list[tuple[float, float]] # (price, displayed size), sorted
taker_fee: float # fractional, e.g. 0.0002 = 2 bps
quote_age_ms: float
kappa: float # phantom-liquidity decay rate, 1/ms
lam: float # staleness/toxicity penalty, $ per unit
def allocate(venues: list[Venue], Q: float):
ladder = [] # (marginal all-in cost, accessible qty, venue)
for v in venues:
surv = math.exp(-v.kappa * v.quote_age_ms) # P(level still there)
for price, size in v.asks:
cost = price * (1.0 + v.taker_fee) + v.lam
ladder.append((cost, size * surv, v.name))
ladder.sort()
fills, remaining = {}, Q
for cost, qty, name in ladder:
take = min(qty, remaining)
fills[name] = fills.get(name, 0.0) + take
remaining -= take
if remaining <= 1e-12:
break
return fills, remaining # remaining > 0 => book too thin: slice parent
Zestien regels logica; alle intelligentie zit in de invoer. (hoe snel getoonde omvang verdampt naarmate de quote ouder wordt) wordt gekalibreerd uit je eigen IOC-fillratio's als functie van de quote-leeftijd op het moment van verzenden. komt uit markouts per venue (laatste sectie). Beide worden gemeten, niet geraden.
Een uitgewerkt voorbeeld. Koop BTC over drie venues:
| Venue | Taker fee | Quote-leeftijd | Asks (prijs × omvang) |
|---|---|---|---|
| A (diep, vers) | 2.0 bps | 10 ms | 87,000 × 3.0; 87,010 × 4.0; 87,025 × 6.0 |
| B (goedkope fee, verouderd) | 1.0 bps | 250 ms | 86,995 × 1.5; 87,015 × 2.0 |
| C (beste hoofdprijs, dikke fee) | 7.5 bps | 20 ms | 86,990 × 2.0; 87,000 × 3.0 |
De ruwe tape zegt dat C de beste ask heeft (86,990), dan B. Corrigeer voor fees en de ladder herschikt volledig: het topniveau van C komt netto uit op , de slechtste liquiditeit op het scherm. De top van B komt uit op 87,004, die van A op 87,017. Pas een veroudingscorrectie van 30% toe op de getoonde omvang van B () en water-fill: 1.05 BTC van het eerste niveau van B, 3.0 van het eerste van A, 1.4 van het tweede van B, 4.0 van het tweede van A, 0.55 van het derde van A. All-in gemiddelde: **87,038.8: 1.9 bps slechter, ongeveer $166 op één child-order van 10 BTC, wat de hele dag samengevoegd wordt over elke child van elke parent. En let op de clou: de venue met de beste getoonde prijs op de tape ontving nul flow van de geoptimaliseerde router. In crypto dwingt niemand je om daar te handelen — routeren via een "beschermde koers" is geen bestaand concept — en de correcte allocatie negeert vaak de schijnbaar beste prijs volledig.
Wat het convexe programma nog steeds negeert: gelijktijdigheid (vuur alle venue-children af binnen dezelfde milliseconde, of Van Kervels annuleringen zullen venues midden in de uitvoering herprijzen), discrete lotgroottes en minimumnotionals (rond de continue oplossing af, corrigeer gulzig), en de optie om de spread helemaal niet te kruisen — wat het onderwerp is van sectie 5. Voor de diepere vraag hoe grote parents over de tijd moeten worden opgeknipt voordat al deze venue-logica draait, zie Almgren–Chriss optimale uitvoering; SOR bepaalt waarheen een child gaat, niet wanneer children plaatsvinden.
De kapitaalbeperking: SOR is treasury management
Alles hierboven ging er stilzwijgend van uit dat je kunt verhandelen op venue . In aandelen is die aanname gratis: één prime broker, netto afwikkeling, nu handelen en later geld verplaatsen. In crypto is het de bindende beperking van het hele systeem. Beurzen eisen voorgefinancierde saldi — je kunt de ask van Kraken niet opnemen met USDT die op Binance staat. Het echte probleem is dus
waarbij je beschikbare saldo op venue is (in het quote-asset voor aankopen, base voor verkopen). De KKT-voorwaarden luiden nu met de multiplier op het saldoplafond. Op venues met een plafond geldt : de marginale dollar daar wordt goedkoper uitgevoerd dan het marktbrede waterniveau, en je wordt gedwongen om flow naar duurdere venues te duwen. Die multiplier is geen abstractie — is letterlijk het bedrag per eenheid dat je zou besparen als er nu direct één eenheid extra saldo op venue zou bestaan. Opgeteld over je verwachte flow is het je bereidheid om te betalen voor een herbalanceringsoverboeking, en de herbalanceringsbeslissing wordt een vergelijking die elk treasury-systeem kan uitvoeren: verplaats inventaris wanneer
De rechterkant is niet klein en niet constant. On-chain BTC heeft 2–6 bevestigingen nodig (20–60 minuten) voordat beurzen het crediteren; ERC-20-overboekingen duren minuten plus gas dat precies piekt wanneer markten druk zijn; TRC-20- en Solana-rails zijn sneller en goedkoper maar niet universeel ondersteund; en elke beurs voegt zijn eigen verwerkingswachtrij voor opnames toe, die uitloopt van minuten tot uren, precies tijdens volatiliteitsgebeurtenissen, wanneer je router het meest wil dat de inventaris wordt verplaatst. De volledige rekenkunde van overboekingskosten — fees, latentieverdelingen, en het prijsrisico dat je onderweg draagt — wordt uitgewerkt in het artikel over funding-rate-arbitrage, en het draagt woordelijk over: een SOR-herbalancering is hetzelfde object als een overboeking van een arbitrage-poot, kostenkant inbegrepen.
Daarom is het academische resultaat om hier te internaliseren geen uitvoeringspaper maar Makarov and Schoar (2020), "Trading and Arbitrage in Cryptocurrency Markets" (Journal of Financial Economics 135(2), 293–319). Zij documenteerden prijsafwijkingen tussen beurzen die dagen tot weken aanhouden — inclusief de Koreaanse "kimchi-premie" die begin 2018 boven de 40% uitkwam — en toonden aan dat transactiekosten deze niet kunnen verklaren; traag bewegend, aan kapitaalcontroles onderworpen arbitragekapitaal wel. Crypto-venues zijn niet O'Hara–Ye's "ene virtuele markt met meerdere toegangspunten." Het zijn deels gesegmenteerde poelen verbonden door trage, kostbare leidingen, en jouw router leeft binnen die segmentatie. Een crypto-SOR zonder treasury-model is een aandelen-SOR die zich verkleedt.

In de praktijk wordt dit een controller op twee tijdschalen. De snelle lus (milliseconden) lost de beperkte water-fill op binnen de huidige saldi, bij elke child-order. De trage lus (minuten tot uren) houdt de tijdreeks van schaduwprijzen en verwachte flow in de gaten, en plant overboekingen wanneer de aanhoudende component van de drempel van de overboekingskosten overschrijdt — met hysterese, want inventaris heen en weer laten pingpongen tussen venues op ruis is hoe je je edge cadeau doet aan het Tron-netwerk. Institutionele desks comprimeren het probleem met off-exchange settlement (Copper ClearLoop, Ceffu MirrorX): onderpand staat bij een bewaarder en wordt gespiegeld naar venues, wat de overboekingslatentie voor ondersteunde venues drastisch verkleint — het vernauwt de beperking, maar schrapt haar niet, en het introduceert zijn eigen tegenpartij-kostenpost.
Maker-bewuste routering en cross-venue-wachtrijspellen
Een router die alleen spreads kruist, laat de goedkoopste liquiditeit ongekocht liggen: die van jezelf. Het Cont–Kukanov-raamwerk bevat het antwoord al — hun gesloten vorm voor een enkele venue verdeelt een order tussen posten en nemen op basis van fees, wachtrijpositie en aversie tegen uitvoeringsrisico — en de multi-venue-versie generaliseert dit: post passief op venues waar (maker fee, wachtrijlengte, kans op fill binnen de child-deadline) domineren, neem op venues waar directheid goedkoop is, en behandel het niet-gevulde passieve restant als flow die op de deadline opnieuw de taker-optimalisatie ingaat.
Twee crypto-specifieke complicaties maken dit rijker dan de aandelenversie.
Fee-jagen is een bewezen valkuil. Battalio, Corwin, and Jennings (2016), "Can Brokers Have It All? On the Relation between Make-Take Fees and Limit Order Execution Quality" (Journal of Finance 71(5)), toonden aan dat Amerikaanse brokers die limietorders naar de venues met de hoogste rebate routeerden, meetbaar slechtere uitvoeringen leverden — lagere fillratio's, slechtere gerealiseerde kwaliteit — omdat de rebate-venue nu net de plek is waar de order van elke andere rebate-zoeker ook ligt: de langste wachtrij, de meest ongunstige fills. De crypto-analogie is exact. De venue die de beste maker-rebate betaalt, trekt de passieve quotes van elke marketmaker aan; jouw order sluit aan in een diepe wachtrij en wordt voornamelijk gevuld wanneer de prijs op het punt staat er doorheen te breken. Netto-van-markout maker-economics per venue (volgende sectie) rangschikken venues routinematig tegenovergesteld aan hun fee-schema's.
Latentiescheefheid is een spel met twee kanten. Diezelfde cross-venue-informatiestroom die Van Kervel documenteerde als defensieve annuleringen, is vanuit de andere kant een offensief signaal: een trade op de beste bied- en laatprijs van Binance voorspelt trades en annuleringen op het overeenkomstige niveau van OKX binnen milliseconden. Een maker-bewuste router moet daarom (a) zijn rustende orders herprijzen op basis van gebeurtenissen op andere venues — pegging op een cross-venue-microprice, niet op de lokale mid — anders wordt hij de trage tegenpartij die cross-venue-arbitrageurs eruit pikken; en (b) hij kan het spel bewust spelen: post op de venue die achterloopt, hedge op de venue die vooroploopt op het moment van de fill. Dat is cross-venue-wachtrijarbitrage, en het is dezelfde latentiestructuur die wordt uitgebuit in cross-exchange arbitrage-uitvoering, alleen ingebed in een uitvoeringsmandaat in plaats van een stat-arb-boek. De operationele vereiste is identiek: de fill-gebeurtenis op venue A en de hedge-order naar venue B moeten in hetzelfde codepad van enkele milliseconden leven, of de edge behoort aan iemand anders toe.
Routeringskwaliteit meten: markouts en ranglijsten
Aandelenrouters worden gedisciplineerd door Rule 605/606-openbaarmaking. Niets disciplineert de jouwe behalve je eigen TCA — het raamwerk uit implementation shortfall en TCA is het scorebord; hier is het routerspecifieke deel ervan.
De atomaire meting is de markout per venue: registreer voor elke fill de (geconsolideerde, voor latentie gecorrigeerde) mid op voor , met een teken zodat negatief betekent dat de markt tegen je fill in bewoog. Aggregeer tot een all-in ranglijst:
| Venue | Aandeel taker-fills | Eff. spread (bps) | Fee (bps) | Markout 1s (bps) | All-in kosten (bps) |
|---|---|---|---|---|---|
| A | 46% | 1.4 | 2.0 | −0.6 | 4.0 |
| B | 31% | 1.9 | 1.0 | −2.1 | 5.0 |
| C | 23% | 1.2 | 7.5 | −0.4 | 9.1 |
De fee-kolom zegt dat B de goedkope venue is. De all-in-kolom zegt dat B de dure venue is: de verouderde quotes vullen je selectief precies wanneer de markt er al doorheen beweegt, en de markout van 1 seconde int de rekening. Deze omkering — fee-rangschikking versus rangschikking op effectieve kosten — is de meest consistente bevinding wanneer desks deze tabel voor het eerst bouwen, en het is precies het getal dat thuishoort in de router: de -straf van het convexe programma is het aanhoudende markout-tekort per venue, gemeten, afgevlakt, en bijgewerkt. De router en de TCA vormen een gesloten lus, of geen van beide werkt.
Eén methodologische valkuil: ranglijsten die zijn opgebouwd uit een levende router zijn vertekend door selectiebias. Als de router de moeilijke, geïnformeerde flow al naar de diepe venue stuurt en de makkelijke flow naar de goedkope, dan zien de markouts van de diepe venue er onterecht slecht uit. De schone oplossing is bewuste randomisatie — route een paar procent van de children uniform willekeurig (een -greedy router, wat quants zullen herkennen als een bandit met een convexe-optimalisatie-prior) — zodat er een contrafeitelijke situatie bestaat. Het kost basispunten op het gerandomiseerde deel, en het is de enige manier om aantoonbaar te weten dat de overige 95% van de flow goed wordt gerouteerd.
De stapel is dan: een op latentie eerlijk geconsolideerd orderboek; een convexe water-fill over netto marginale kosten met gemeten verdampings- en toxiciteitsparameters; een aan saldi gebonden snelle lus waarvan de schaduwprijzen een op overboekingskosten gerichte trage lus aansturen; passieve plaatsing die wachtrijen en cross-venue-informatiestroom respecteert; en gerandomiseerde, op markouts gebaseerde TCA die elke parameter terugvoedt. Geen van deze onderdelen is op zichzelf diepgaand. Het systeem is dat wel — omdat in crypto, anders dan in aandelen, geen enkele toezichthouder ook maar één laag ervan voor je heeft gebouwd, en de markt rekent 2 bps per child-order, voor altijd, totdat jij dat doet.
Auteurs
Trading-systems engineer
Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.