diff --git a/examples/04_mql5_signal_reader.py b/examples/04_mql5_signal_reader.py new file mode 100644 index 0000000..5031b07 --- /dev/null +++ b/examples/04_mql5_signal_reader.py @@ -0,0 +1,108 @@ +""" +04_mql5_signal_reader.py +======================== + +Read MQL5 indicator signals (e.g. Alpha Trend) from MT5 GlobalVariables +through the mt5bridge-ccxt wrapper, and react to them in Python. + +This is the recommended pattern when you want to use complex MQL5 +indicators in your Python strategies without re-implementing them. +""" + +import time +from datetime import datetime + +import mt5bridge_ccxt + + +def main(): + exchange = mt5bridge_ccxt.mt5bridge({ + "apiKey": "your-api-key", + "host": "http://localhost:8080", + "symbols": {"XAU/USD": "XAUUSDc"}, + }) + + # ─── 1. List all GlobalVariables on MT5 ─────────────────────── + print("All GlobalVariables on MT5:") + for gv in exchange.mql5.list(): + print(f" {gv['name']:60s} = {gv['value']}") + + # ─── 2. Read Alpha Trend signal (H1) ────────────────────────── + print("\nAlpha Trend signal (XAUUSDc H1, length=14, ATR=1.0):") + signal = exchange.mql5.alpha_trend_signal( + symbol="XAUUSDc", + timeframe="H1", + length=14, + atr_mult=1.0, + use_volume=0, # 0=RSI mode, 1=MFI mode + show_signals=1, # 0=no, 1=yes + ) + for k, v in signal.items(): + print(f" {k:8s} = {v}") + + # ─── 3. Read custom indicator signal ────────────────────────── + print("\nCustom signal from MY_SIGNAL_XAUUSDc_PERIOD_H1:") + custom = exchange.mql5.get("MY_SIGNAL_XAUUSDc_PERIOD_H1") + print(f" value = {custom}") + + # ─── 4. Combine indicator signal with order placement ───────── + print("\n--- Live trading loop (CTRL+C to stop) ---") + last_trend = None + while True: + try: + sig = exchange.mql5.alpha_trend_signal("XAUUSDc", "H1") + trend = sig.get("trend") + if trend is None or trend == last_trend: + time.sleep(30) + continue + + print(f"\n[{datetime.now():%H:%M:%S}] Trend changed: {last_trend} -> {trend}") + last_trend = trend + + # Get current positions + positions = exchange.fetch_positions(["XAU/USD"]) + has_long = any(p["side"] == "long" for p in positions) + has_short = any(p["side"] == "short" for p in positions) + + ticker = exchange.fetch_ticker("XAU/USD") + bid, ask = ticker["bid"], ticker["ask"] + + if trend == 1 and not has_long: + # Trend turned long + if has_short: + print(" Closing short position") + for p in positions: + if p["side"] == "short": + exchange.mql5.send_close_command(int(p["id"])) + print(f" Opening LONG: {ask} sl={ask-5:.2f} tp={ask+10:.2f}") + exchange.create_order( + "XAU/USD", "market", "buy", 0.01, + price=ask, + params={"sl": ask - 5, "tp": ask + 10, "magic": 999, "comment": "alpha-trend"}, + ) + + elif trend == -1 and not has_short: + # Trend turned short + if has_long: + print(" Closing long position") + for p in positions: + if p["side"] == "long": + exchange.mql5.send_close_command(int(p["id"])) + print(f" Opening SHORT: {bid} sl={bid+5:.2f} tp={bid-10:.2f}") + exchange.create_order( + "XAU/USD", "market", "sell", 0.01, + price=bid, + params={"sl": bid + 5, "tp": bid - 10, "magic": 999, "comment": "alpha-trend"}, + ) + + except KeyboardInterrupt: + print("\nStopped.") + break + except Exception as e: + print(f" Error: {e}") + time.sleep(10) + time.sleep(30) + + +if __name__ == "__main__": + main()