Brokerage-Anpassungsschicht und Integration
Dieses Kapitel richtet sich an Benutzer und Entwickler, die sich auf die Anbindung an ein neues Brokerhaus (oder zukünftig an QMT) vorbereiten: Wie sieht die Schicht „Unified Counter Interface“ über dem simulierten Brokerhaus aus und wie kann sie erweitert werden?
Hinweis für Leser: Wenn Sie noch keine Erfahrung mit simuliertem Handel haben, brauchen Sie nur die Abschnitte :doc:2-Konfiguration-und-Ausführung und :doc:3-Risiko-und-Auftragslebenszyklus zu lesen; dieses Kapitel kann vorerst übersprungen werden. Kehren Sie zu diesem Kapitel zurück, wenn Sie eine Verbindung zu einer realen Handelsplattform oder einem Broker herstellen möchten.
Liebe Nutzer, in qteasy ist der Broker für die Auftragsannahme, die Benachrichtigung über die Annahme und die asynchrone Ausführung zuständig. Der Standard-Simulator verwendet Live-Kurse, um all dies zu simulieren. Wir haben eine einheitliche Anpassungsschicht entwickelt, sodass beim zukünftigen Wechsel zu realen Handelsplattformen wie QMT die Hauptlogik des Traders möglichst wenig angepasst werden muss.
0. 适用场景
Sie möchten sich in das neue Brokerhaus integrieren und gleichzeitig die Kompatibilität mit der bestehenden Trader-Logik beibehalten.
Sie müssen zunächst den minimalen geschlossenen Kreislauf von „Einreichung → Annahmeergebnis → Transaktionsantwort → Statusaktualisierung“ einrichten.
1. 核心概念:分层结构
Typischer Ablauf eines Live-Anrufs (von extern nach intern):
Operator.run_live_trade()
→ Trader(日程、风控、账本)
→ BrokerFacade(券商适配外壳:统一 API)
→ SimulatorBroker / 您注册的 Broker
BrokerFacade (Adaptive Shell): Wie eine einheitliche Übersetzungsschicht für verschiedene Brokerage-Zähler – Händler müssen der Facade nur „connect / submit / poll_fills“ sagen, ohne sich darum kümmern zu müssen, ob die zugrunde liegende Schicht analog oder QMT ist.
Wichtigste Punkte:
Facade bietet externe Verbindungen wie connect, disconnect, submit with ack, poll fills und get remote.
In der CLI spiegelt
broker status|connect|disconnectden Statusis_connectedwider (im Simulator bedeutet dies „die Adapterschicht ist bereit“, nicht eine echte Broker-Anmeldung).Die Hauptschleife des Händlers verbraucht die Handelsbelohnungen über
poll_fills, anstatt direkt auf die interne Warteschlange zuzugreifen.
2. 核心接口(用户/开发者向)
Die Broker-Anpassungsschicht dient als einheitliche Schnittstelle zwischen Trader und bestimmten Brokern (Simulatoren, zukünftigen QMTs usw.). Unabhängig von der zugrunde liegenden Schicht verwendet Trader denselben Prozess: „Verbinden → Auftrag aufgeben → Annahme abwarten → Ausführung abfragen → ggf. Remote-Ledger prüfen.“ Die folgende Tabelle bietet einen Vergleich der Schnittstellennamen und ihrer täglichen Nutzung als praktische Referenz beim Lesen der Vergleichstabelle und der Integrationsliste weiter unten.
Bedeutung der einzelnen Spalten: Schnittstelle ist der Name der Methode der Anpassungsschicht; Was zu tun ist ist die Verantwortung in der Live-Verbindung; Sie können es sich als eine Metapher vorstellen, die Ihnen beim Merken hilft.
Anwendung: Bei der Integration eines neuen Brokers arbeiten Sie alle Punkte der Checkliste in §6 ab; für den täglichen Betrieb und die Wartung müssen Sie sich nur auf connect, submit_with_ack, poll_fills und den CLI-Befehl broker status konzentrieren.
Schnittstelle |
Was ist zu tun |
Man kann es so verstehen: |
|---|---|---|
|
Aufbau/Trennung der Adapterschichtsitzung |
Öffnen/Schließen des Thekenfensters |
|
Haben Sie eine Verbindung hergestellt? |
Ist das Fenster geöffnet? |
|
Senden Sie die Bestellung ab und erhalten Sie gleichzeitig eine Bestätigung über die Annahme oder Ablehnung. |
Achten Sie unmittelbar nach dem Absenden der Bestellung auf die Meldung „Annehmen/Ablehnen“. |
|
Stornierung |
Nicht ausgeführte Aufträge stornieren |
|
Empfangen Sie asynchrones Transaktionsfeedback |
Fragen Sie: „Gibt es neue Transaktionen?“ |
|
Bargeld/Positionen/Bestellungen aus der Ferne einsehen |
Die Konten werden mit den Hauptbüchern der Brokerfirmen abgeglichen (die Simulatoren dienen größtenteils als Platzhalter). |
2.1 Vergleich der Schnittstellenverantwortlichkeiten
Die Benutzeroberfläche verhält sich im Simulator und im echten QMT unterschiedlich: Im Simulator werden Live-Kurse für die Simulation verwendet, während im echten QMT eine Verbindung zum Frontend hergestellt wird. Die folgende Tabelle hilft Ihnen, die Erwartungen zu klären – so vermeiden Sie, die Verbindung im Simulator mit einem echten Login zu verwechseln, und erleichtern die Planung zusätzlicher Funktionen bei der Integration mit QMT.
Bedeutung der einzelnen Spalten: Schnittstelle entspricht §2; Semantik ist die abstrakte Verantwortung; Im Simulator sehen Sie ist das aktuelle Standardverhalten der Simulation; Reales QMT (geplant) ist ein zukünftiges Ziel (in der aktuellen Version noch keine Verpflichtung).
Anwendungshinweise: Prüfen Sie bei der Fehlersuche zunächst, ob die Spalte „Simulator“ die Kriterien „Abnahme + Bericht“ erfüllt; wählen Sie bei der Planung des QMT die Zielfunktionen in der letzten Spalte aus.
Schnittstelle |
Semantik |
Im Simulator werden Sie sehen |
Real QMT (in Planung) |
|---|---|---|---|
|
Gespräch |
Internes Flag gesetzt; kein gültiger Login. |
Echte Anmeldung und Wiederverbindung |
|
Gleichzeitige Verarbeitung |
Retouren werden akzeptiert, simuliert broker_order_id usw. |
柜台真实受理结果(见 :doc: |
|
Asynchrone Belohnungen |
Simulierte Transaktionswarteschlange |
Echtzeit-Transaktions-Push/Polling |
|
Remote-Ledger |
Normalerweise leer oder keine Angabe |
Datenquelle für Abgleich, Zugriffskontrolle und Synchronisierung |
|
Stornierung |
Simulationsimplementierung |
Zuordnung realer Stornierungsnummern |
Es wird empfohlen, die Priorität anhand des „kleinsten geschlossenen Regelkreises“ zu bestimmen:
Verbindung:
connect/is_connectedTransaktion:
submit_with_ack/cancelBelohnung:
poll_fillsAbfrage:
get_remote_*(Hat erst nach der Verbindung mit einem realen Zähler volle geschäftliche Bedeutung)
3. submit_with_ack 与本地订单
Im Gegensatz zur Ablehnung von Risikokontrollaufträgen: Risikokontrollaufträge haben Priorität und werden nicht in die Auftragsliste aufgenommen (siehe :doc:3-risk-and-order-lifecycle).
submit_with_ack gibt synchron zurück, ob das Brokerhaus den Auftrag angenommen hat. Die folgende Tabelle beschreibt lediglich die Zuordnung zwischen lokalen Aufträgen und broker_order_id während der Annahmephase; Informationen zum Transaktionsfortschritt finden Sie in der Statustabelle in :doc:3-risk-and-order-lifecycle.
Bedeutung der einzelnen Spalten: Akzeptiertes Ergebnis: Dies entspricht der akzeptierten Semantik in ACK; Lokaler Auftrag: Dies gibt den Status der Auftragstabelle an; broker_order_id: Dies gibt an, ob die Brokerauftragsnummer zurückgeschrieben wurde.
Anwendung:: Wenn eine Order abgelehnt wird und die Brokernummer leer ist, prüfen Sie die Zeile mit „accepted=False“; wenn eine Brokernummer vorhanden ist, die Transaktion aber seit längerer Zeit nicht abgeschlossen wurde, prüfen Sie die Statustabelle und poll_fills.
Akzeptanzergebnisse |
Lokale Anordnungen |
Broker-Auftrags-ID |
|---|---|---|
|
Weiter verbreiten |
Bitte zurückschreiben: Maklerfirmennummer und -name |
|
Oft abgelehnt |
Leer halten |
Einen detaillierten Vergleich finden Sie unter :doc:6-trader-snapshot-gate.
Vor der Übermittlung werden die Auftragsstruktur und die Prämienfelder vertraglich geprüft. Bei Formatfehlern wird umgehend eine Fehlermeldung ausgegeben, um zu vermeiden, dass fehlerhafte Daten in die Buchhaltung gelangen.
4. 扩展新 Broker 类型
XtQuant / MiniQMT:配置项 live_trade_broker_type='xtquant' 已在 2.5.2 白名单中;实现细节与禁止双重下单等规则见英文契约 :doc:4a-xtquant-broker-adapter-contract-v1(协作方 PR 评审基准)。
Fabrik registrieren (Beispiel):
from qteasy.broker import register_broker_factory
register_broker_factory('my_broker', MyBrokerFactory)
# qt.configure(live_trade_broker_type='my_broker')
独立扩展包(推荐用于 QMT):
import qteasy_xtquant
qteasy_xtquant.register()
# qt.configure(live_trade_broker_type='xtquant')
CLI sync (Alias pull-state): Derzeit reserviert, die Ausführung gibt [NOT_IMPLEMENTED] ... aus, was darauf hinweist, dass der eigentliche „Pull-State vom Broker“ noch nicht implementiert ist; er wird nach der Integration mit QMT durch eine verfügbare Implementierung ersetzt.
5. 边界行为(接入时请注意)
Das Absenden oder Abfragen ohne Verbindungsaufbau sollte zu einer expliziten Fehlermeldung führen, nicht zu einem stillen Fehlschlagen.
cancelUnbekannte Delegationsnummer: Sollte immer „Abgebrochen“ zurückgeben.poll_fills-Timeout: Es sollte eine leere Liste zurückgegeben werden, keine geänderten Daten.Im Simulator stellt **
connectkeine echte Brokerage-Sitzung dar; es zeigt lediglich an, dass die Anpassungsschicht damit umgehen kann.
6. 最小接入清单
Implementieren Sie
connect/disconnect/is_connectedVerbinde
submit_with_ackmitpoll_fillsDas Rückgabefeld erfüllt die Vertragsvalidierung.
Implementieren Sie
cancel- und Ausnahmepfade.(Falls Zugriffskontrolle/Abgleich/Synchronisierung erforderlich ist) Implementieren Sie
get_remote_*Überprüfen Sie in der CLI Folgendes:
broker status,reconcileund Order Mapping.
7. 最小验收标准
is_connected=Truenachconnect, kannsubmit_with_ackverwendet werden.Erfolgreich verarbeitet: Lokaler Auftrag enthält
broker_order_idAuftragsablehnung:
rejectedund das Broker-Feld ist leer.Die Rückgabewerte von
poll_fillssind überprüfbar.Keine Verbindung / Unbekannte Reihenfolge / Timeout-Verhalten ist stabil
CLI
broker/reconcileObservable
8. 相关跳转
Lebenszyklus- und Risikokontrolle: 3-Risiko- und Auftragslebenszyklus
Produkte und Fehlerbehebung: :doc:
5-artifacts-and-troubleshootingSnapshot/Zugriffskontrolle: :doc:
6-trader-snapshot-gateCLI-Referenz: :doc:
8-cli-trader-capability-matrixDesignbeschreibung: design/10-live-trading-s1.3-architecture.md