From a2571062d2d5490d6deca1090cdf7ff685aca097 Mon Sep 17 00:00:00 2001 From: gavindiaz Date: Wed, 8 Jul 2026 06:59:21 +0000 Subject: [PATCH] Add real-time tick example --- examples/05_realtime_tick.py | 82 ++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 examples/05_realtime_tick.py diff --git a/examples/05_realtime_tick.py b/examples/05_realtime_tick.py new file mode 100644 index 0000000..5724708 --- /dev/null +++ b/examples/05_realtime_tick.py @@ -0,0 +1,82 @@ +""" +05_realtime_tick.py +=================== + +Real-time tick monitoring with mt5bridge-ccxt. + +MT5Bridge uses polling-based "watching" (no WebSocket). The watch_ticker +method blocks until a new tick is detected, then returns it. This is +suitable for most strategies that need to react to price changes +within ~1 second. + +For high-frequency trading (< 100ms latency), upgrade MT5Bridge to +support WebSocket (see mql5/README.md and the WebSocket section in +the main README). +""" + +import asyncio +from datetime import datetime + +import mt5bridge_ccxt + + +async def main(): + exchange = mt5bridge_ccxt.mt5bridge({ + "apiKey": "your-api-key", + "host": "http://localhost:8080", + "symbols": {"XAU/USD": "XAUUSDc"}, + }) + + # ─── Option 1: Just call watch_ticker in a loop ────────────── + print("=== Watching XAU/USD ticks (poll-based) ===\n") + for i in range(10): # Watch 10 ticks + ticker = await exchange.watch_ticker( + "XAU/USD", + params={"poll_interval_ms": 500}, # poll every 500ms + ) + now = datetime.now().strftime("%H:%M:%S.%f")[:-3] + print(f"[{now}] #{i+1:2d} bid={ticker['bid']:.2f} " + f"ask={ticker['ask']:.2f} spread={ticker['ask']-ticker['bid']:.2f}") + + # ─── Option 2: Watch multiple symbols concurrently ────────── + print("\n=== Watching multiple symbols concurrently ===\n") + + async def watch_one(sym): + try: + while True: + t = await exchange.watch_ticker(sym, params={"poll_interval_ms": 1000}) + now = datetime.now().strftime("%H:%M:%S") + print(f"[{now}] {sym:8s} bid={t['bid']:.2f} ask={t['ask']:.2f}") + except asyncio.CancelledError: + pass + + tasks = [ + asyncio.create_task(watch_one("XAU/USD")), + asyncio.create_task(watch_one("EUR/USD")), + ] + + # Run for 10 seconds then stop + await asyncio.sleep(10) + for t in tasks: + t.cancel() + await asyncio.gather(*tasks, return_exceptions=True) + + # ─── Option 3: Watch new bars (K-line formation) ──────────── + print("\n=== Watching XAU/USD H1 bars (new bar formation) ===\n") + + bar_count = 0 + while bar_count < 3: # Watch for 3 new bars + ohlcv = await exchange.watch_ohlcv( + "XAU/USD", "1h", limit=3, + params={"poll_interval_ms": 5000}, # check every 5s + ) + if ohlcv: + latest = ohlcv[-1] + bar_time = datetime.fromtimestamp(latest[0] / 1000).strftime("%Y-%m-%d %H:%M") + print(f"New bar: time={bar_time} O={latest[1]:.2f} H={latest[2]:.2f} " + f"L={latest[3]:.2f} C={latest[4]:.2f}") + bar_count += 1 + + +if __name__ == "__main__": + asyncio.run(main())