diff --git a/MALKHUT/README.md b/MALKHUT/README.md index 5a99dbe..880a40a 100644 --- a/MALKHUT/README.md +++ b/MALKHUT/README.md @@ -471,7 +471,7 @@ Re-measurement at correct fees is required for production deployment. | **Strategy DSL v2** | `training/dsl.py` | 69 | 40+ primitives, 40+ sensors, 16 builtins | | **Order Types** | `training/order_types.py` | (new) | Three-dimensional: OrderType × TimeInForce × Instructions (FIX-aligned) | | **Strategy Generator** | `training/generator.py` | 20 | Genetic programming: crossover, mutation, tournament | -| **Strategy Selector** | `training/selector.py` | 24 | Regime → strategy mapping, performance matrix | +| **Strategy Selector** | `training/selector.py` | 24 | Regime × strategy × venue matrix, cross-exchange comparison | | **Asset Classification** | `training/asset_classification.py` | 190 | Multi-label taxonomy + exchange registry, 13 assets, system-wide store | | **Asset Behavior DSL** | `training/asset_behavior.py` | (in classification) | 10 orthogonal dimensions, 3 templates, 13 behaviors, research-validated | | **Asset Compiler** | `training/asset_compiler.py` | (new) | Auto-fetch from Binance/BingX API, compile profiles, rate-limited | @@ -1238,6 +1238,32 @@ but semantics are identical. A `LIMIT` on BingX = `LIMIT` on Binance = `LIMIT` o (same fill behavior). Only the API string differs. The venue adapter translates normalized → exchange-native at submission time. +#### Cross-Exchange Learning + +ScenarioFactory is venue-aware: `ScenarioFactory(exchange_id='bingx')` tags every +scenario with its venue. Cross-exchange transfer re-tags for a different venue: +```python +factory = ScenarioFactory(exchange_id='bingx') +scenarios_bingx = factory.build_suite(symbols=['BTCUSDT', 'ETHUSDT']) +strategy = train(scenarios_bingx) # evolve on BingX + +scenarios_binance = factory.cross_exchange_transfer(scenarios_bingx, 'binance') +score = evaluate(strategy, scenarios_binance) # test on Binance +``` + +PerformanceMatrix keys are `(regime, strategy_id, venue)`: +- `get_best(regime, venue='bingx')` — per-venue best +- `get_venue_comparison(regime, strategy_id)` — `{venue: score}` +- `get_best(regime)` — venue-agnostic (backward compatible) + +#### Adversary Ecology + +Counterparties operate at the ActionKind level (CROSS_SPREAD, PLACE, CANCEL), +not at order-type level. The CWM translates ActionKind to venue-native order types: +- `CROSS_SPREAD` → fills aggressively → equivalent to MARKET +- `PLACE` → passive quote → equivalent to LIMIT +Fee calculation uses VenueRules (per-exchange fees). The ecology is venue-independent. + #### Standards Referenced - FIX 4.4: Tag 40 (OrdType), Tag 59 (TimeInForce), Tag 18 (ExecInst)