//+------------------------------------------------------------------+ //| BinanceFeedBridge.mq5 | //| Feeds Binance prices into custom symbols *.BIN | //+------------------------------------------------------------------+ #property strict // === INPUTS ======================================================= // Same list as in Create_Binance_Symbols.mq5 input string InpSymbolsList = "0GUSDT,1000000BOBUSDT,1000000MOGUSDT,1000BONKUSDT,1000CATUSDT,1000CHEEMSUSDT,1000FLOKIUSDT,1000LUNCUSDT,1000PEPEUSDT,1000RATSUSDT,1000SATSUSDT,1000SHIBUSDT,1000WHYUSDT,1000XECUSDT,1000XUSDT,1INCHUSDT,1MBABYDOGEUSDT,2ZUSDT,42USDT,4USDT,A2ZUSDT,AAVEUSDT,ACEUSDT,ACHUSDT,ACTUSDT,ACXUSDT,ADAUSDT,AERGOUSDT,AEROUSDT,AEVOUSDT,AGIXUSDT,AGLDUSDT,AGTUSDT,AI16ZUSDT,AIAUSDT,AINUSDT,AIOTUSDT,AIOUSDT,AIUSDT,AIXBTUSDT,AKEUSDT,AKTUSDT,ALCHUSDT,ALGOUSDT,ALICEUSDT,ALLOUSDT,ALLUSDT,ALPACAUSDT,ALPHAUSDT,ALPINEUSDT,ALTUSDT,AMBUSDT,ANIMEUSDT,ANKRUSDT,APEUSDT,API3USDT,APRUSDT,APTUSDT,ARBUSDT,ARCUSDT,ARIAUSDT,ARKMUSDT,ARKUSDT,ARPAUSDT,ARUSDT,ASRUSDT,ASTERUSDT,ASTRUSDT,ATAUSDT,ATHUSDT,ATOMUSDT,ATUSDT,AUCTIONUSDT,AUSDT,AVAAIUSDT,AVAUSDT,AVAXUSDT,AVNTUSDT,AWEUSDT,AXLUSDT,AXSUSDT,B2USDT,B3USDT,BABYUSDT,BADGERUSDT,BAKEUSDT,BALUSDT,BANANAS31USDT,BANANAUSDT,BANDUSDT,BANKUSDT,BANUSDT,BARDUSDT,BASUSDT,BATUSDT,BBUSDT,BCHUSDT,BDXNUSDT,BEAMXUSDT,BEATUSDT,BELUSDT,BERAUSDT,BICOUSDT,BIDUSDT,BIGTIMEUSDT,BIOUSDT,BLESSUSDT,BLUAIUSDT,BLURUSDT,BLZUSDT,BMTUSDT,BNBUSDT,BNTUSDT,BNXUSDT,BOMEUSDT,BONDUSDT,BRETTUSDT,BROCCOLI714USDT,BROCCOLIF3BUSDT,BRUSDT,BSVUSDT,BSWUSDT,BTCDOMUSDT,BTCSTUSDT,BTCUSDT,BTRUSDT,BULLAUSDT,BUSDT,C98USDT,CAKEUSDT,CARVUSDT,CATIUSDT,CCUSDT,CELOUSDT,CELRUSDT,CETUSUSDT,CFXUSDT,CGPTUSDT,CHESSUSDT,CHILLGUYUSDT,CHRUSDT,CHZUSDT,CKBUSDT,CLANKERUSDT,CLOUSDT,COAIUSDT,COMBOUSDT,COMMONUSDT,COMPUSDT,COOKIEUSDT,COSUSDT,COTIUSDT,COWUSDT,CROSSUSDT,CRVUSDT,CTKUSDT,CTSIUSDT,CUDISUSDT,CUSDT,CVCUSDT,CVXUSDT,CYBERUSDT,DAMUSDT,DARUSDT,DASHUSDT,DEEPUSDT,DEFIUSDT,DEGENUSDT,DEGOUSDT,DENTUSDT,DEXEUSDT,DFUSDT,DGBUSDT,DIAUSDT,DMCUSDT,DODOXUSDT,DOGEUSDT,DOGSUSDT,DOLOUSDT,DOODUSDT,DOTUSDT,DRIFTUSDT,DUSDT,DUSKUSDT,DYDXUSDT,DYMUSDT,EDENUSDT,EDUUSDT,EGLDUSDT,EIGENUSDT,ENAUSDT,ENJUSDT,ENSOUSDT,ENSUSDT,EPICUSDT,EPTUSDT,ERAUSDT,ESPORTSUSDT,ETCUSDT,ETHFIUSDT,ETHUSDT,ETHWUSDT,EULUSDT,EVAAUSDT,FARTCOINUSDT,FETUSDT,FFUSDT,FHEUSDT,FIDAUSDT,FILUSDT,FIOUSDT,FISUSDT,FLMUSDT,FLOCKUSDT,FLOWUSDT,FLUIDUSDT,FLUXUSDT,FOLKSUSDT,FORMUSDT,FORTHUSDT,FTMUSDT,FTTUSDT,FUNUSDT,FUSDT,FXSUSDT,GALAUSDT,GASUSDT,GHSTUSDT,GIGGLEUSDT,GLMRUSDT,GLMUSDT,GMTUSDT,GMXUSDT,GOATUSDT,GPSUSDT,GRASSUSDT,GRIFFAINUSDT,GRTUSDT,GTCUSDT,GUNUSDT,GUSDT,HAEDALUSDT,HANAUSDT,HBARUSDT,HEIUSDT,HEMIUSDT,HFTUSDT,HIFIUSDT,HIGHUSDT,HIPPOUSDT,HIVEUSDT,HMSTRUSDT,HOLOUSDT,HOMEUSDT,HOOKUSDT,HOTUSDT,HUMAUSDT,HUSDT,HYPERUSDT,HYPEUSDT,ICNTUSDT,ICPUSDT,ICXUSDT,IDEXUSDT,IDOLUSDT,IDUSDT,ILVUSDT,IMXUSDT,INITUSDT,INJUSDT,INUSDT,IOSTUSDT,IOTAUSDT,IOTXUSDT,IOUSDT,IPUSDT,JASMYUSDT,JCTUSDT,JELLYJELLYUSDT,JOEUSDT,JSTUSDT,JTOUSDT,JUPUSDT,KAIAUSDT,KAITOUSDT,KASUSDT,KAVAUSDT,KDAUSDT,KERNELUSDT,KEYUSDT,KGENUSDT,KITEUSDT,KLAYUSDT,KMNOUSDT,KNCUSDT,KOMAUSDT,KSMUSDT,LABUSDT,LAUSDT,LAYERUSDT,LDOUSDT,LEVERUSDT,LIGHTUSDT,LINAUSDT,LINEAUSDT,LINKUSDT,LISTAUSDT,LITUSDT,LOKAUSDT,LOOMUSDT,LPTUSDT,LQTYUSDT,LRCUSDT,LSKUSDT,LTCUSDT,LUMIAUSDT,LUNA2USDT,LYNUSDT,MAGICUSDT,MANAUSDT,MANTAUSDT,MASKUSDT,MAVIAUSDT,MAVUSDT,MBOXUSDT,MDTUSDT,MELANIAUSDT,MEMEFIUSDT,MEMEUSDT,MERLUSDT,METISUSDT,METUSDT,MEUSDT,MEWUSDT,MILKUSDT,MINAUSDT,MIRAUSDT,MITOUSDT,MKRUSDT,MLNUSDT,MMTUSDT,MOCAUSDT,MONUSDT,MOODENGUSDT,MORPHOUSDT,MOVEUSDT,MOVRUSDT,MTLUSDT,MUBARAKUSDT,MUSDT,MYROUSDT,MYXUSDT,NAORISUSDT,NEARUSDT,NEIROETHUSDT,NEIROUSDT,NEOUSDT,NEWTUSDT,NFPUSDT,NILUSDT,NKNUSDT,NMRUSDT,NOMUSDT,NOTUSDT,NTRNUSDT,NULSUSDT,NXPCUSDT,OBOLUSDT,OCEANUSDT,OGNUSDT,OGUSDT,OLUSDT,OMGUSDT,OMNIUSDT,OMUSDT,ONDOUSDT,ONEUSDT,ONGUSDT,ONTUSDT,ONUSDT,OPENUSDT,OPUSDT,ORBSUSDT,ORCAUSDT,ORDERUSDT,ORDIUSDT,OXTUSDT,PARTIUSDT,PAXGUSDT,PENDLEUSDT,PENGUUSDT,PEOPLEUSDT,PERPUSDT,PHAUSDT,PHBUSDT,PIEVERSEUSDT,PIPPINUSDT,PIXELUSDT,PLAYUSDT,PLUMEUSDT,PNUTUSDT,POLUSDT,POLYXUSDT,PONKEUSDT,POPCATUSDT,PORT3USDT,PORTALUSDT,POWRUSDT,PROMPTUSDT,PROMUSDT,PROVEUSDT,PTBUSDT,PUFFERUSDT,PUMPBTCUSDT,PUMPUSDT,PUNDIXUSDT,PYTHUSDT,QNTUSDT,QTUMUSDT,QUICKUSDT,QUSDT,RADUSDT,RAREUSDT,RAYSOLUSDT,RAYUSDT,RDNTUSDT,RECALLUSDT,REDUSDT,REEFUSDT,REIUSDT,RENDERUSDT,RENUSDT,RESOLVUSDT,REZUSDT,RIFUSDT,RIVERUSDT,RLCUSDT,RONINUSDT,ROSEUSDT,RPLUSDT,RSRUSDT,RUNEUSDT,RVNUSDT,RVVUSDT,SAFEUSDT,SAGAUSDT,SAHARAUSDT,SANDUSDT,SANTOSUSDT,SAPIENUSDT,SCRTUSDT,SCRUSDT,SCUSDT,SEIUSDT,SENTUSDT,SFPUSDT,SHELLUSDT,SIGNUSDT,SIRENUSDT,SKATEUSDT,SKLUSDT,SKYAIUSDT,SKYUSDT,SLERFUSDT,SLPUSDT,SNTUSDT,SNXUSDT,SOLUSDT,SOLVUSDT,SOMIUSDT,SONICUSDT,SOONUSDT,SOPHUSDT,SPELLUSDT,SPKUSDT,SPXUSDT,SQDUSDT,SSVUSDT,STABLEUSDT,STBLUSDT,STEEMUSDT,STGUSDT,STMXUSDT,STORJUSDT,STOUSDT,STPTUSDT,STRAXUSDT,STRKUSDT,STXUSDT,SUIUSDT,SUNUSDT,SUPERUSDT,SUSDT,SUSHIUSDT,SWARMSUSDT,SWELLUSDT,SXPUSDT,SXTUSDT,SYNUSDT,SYRUPUSDT,SYSUSDT,TACUSDT,TAGUSDT,TAIKOUSDT,TAKEUSDT,TANSSIUSDT,TAOUSDT,TAUSDT,THETAUSDT,THEUSDT,TIAUSDT,TLMUSDT,TNSRUSDT,TOKENUSDT,TONUSDT,TOSHIUSDT,TOWNSUSDT,TRADOORUSDT,TRBUSDT,TREEUSDT,TROYUSDT,TRUMPUSDT,TRUSTUSDT,TRUTHUSDT,TRUUSDT,TRXUSDT,TSTUSDT,TURBOUSDT,TURTLEUSDT,TUSDT,TUTUSDT,TWTUSDT,UAIUSDT,UBUSDT,UMAUSDT,UNFIUSDT,UNIUSDT,USDCUSDT,USELESSUSDT,USTCUSDT,USUALUSDT,UXLINKUSDT,VANAUSDT,VANRYUSDT,VELODROMEUSDT,VELVETUSDT,VETUSDT,VFYUSDT,VICUSDT,VIDTUSDT,VINEUSDT,VIRTUALUSDT,VOXELUSDT,VTHOUSDT,VVVUSDT,WALUSDT,WAVESUSDT,WAXPUSDT,WCTUSDT,WIFUSDT,WLDUSDT,WLFIUSDT,WOOUSDT,WUSDT,XAIUSDT,XANUSDT,XCNUSDT,XEMUSDT,XLMUSDT,XMRUSDT,XNYUSDT,XPINUSDT,XPLUSDT,XRPUSDT,XTZUSDT,XVGUSDT,XVSUSDT,YALAUSDT,YBUSDT,YFIUSDT,YGGUSDT,ZBTUSDT,ZECUSDT,ZENUSDT,ZEREBROUSDT,ZETAUSDT,ZILUSDT,ZKCUSDT,ZKJUSDT,ZKUSDT,ZORAUSDT,ZRCUSDT,ZROUSDT,ZRXUSDT"; // Suffix of custom symbols (must match script) input string InpSuffix = ""; // Update interval in seconds input int InpUpdateSec = 2; // === GLOBALS ====================================================== string g_urlFutures = "https://fapi.binance.com/fapi/v1/ticker/bookTicker?symbol="; string g_symbols[]; bool g_skip[]; int g_symbolCount = 0; int g_updateSec = 1; //------------------------------------------------------------------ // Helper: extract "field":"value" from JSON //------------------------------------------------------------------ double JsonGetPrice(const string json, const string field) { string key = "\"" + field + "\":\""; int start = StringFind(json, key); if(start == -1) return 0.0; start += StringLen(key); int end = StringFind(json, "\"", start); if(end == -1) return 0.0; string val = StringSubstr(json, start, end - start); return (double)StringToDouble(val); } //------------------------------------------------------------------ // Request price for one symbol from Binance Futures //------------------------------------------------------------------ bool GetBinanceBidAsk(const string baseSymbol, double &bid, double &ask, bool &invalidSymbol) { invalidSymbol = false; string url = g_urlFutures + baseSymbol; char data[]; // empty body for GET char result[]; string result_headers; ResetLastError(); int res = WebRequest("GET", url, "", 5000, data, result, result_headers); if(res == -1) { PrintFormat("WebRequest error for %s: %d", baseSymbol, GetLastError()); return false; } if(res <= 0) { PrintFormat("No data for %s (res=%d)", baseSymbol, res); return false; } string json = CharArrayToString(result, 0, res); // Binance explicit error if(StringFind(json, "\"code\":-1121") != -1 || StringFind(json, "Invalid symbol") != -1) { invalidSymbol = true; PrintFormat("Symbol %s is invalid on Binance Futures. Skipping from now on. JSON=%s", baseSymbol, json); return false; } bid = JsonGetPrice(json, "bidPrice"); ask = JsonGetPrice(json, "askPrice"); // 🔴 FIX: symbols like 1000XUSDT return 0 bid/ask – treat as inactive & skip forever if(bid <= 0.0 || ask <= 0.0) { invalidSymbol = true; PrintFormat("Symbol %s has zero bid/ask on Binance (inactive). Skipping from now on. JSON=%s", baseSymbol, json); return false; } return true; } //------------------------------------------------------------------ // Push one tick into a custom symbol //------------------------------------------------------------------ bool PushTickToCustom(const string customSymbol, double bid, double ask) { MqlTick tick; ZeroMemory(tick); datetime now = TimeCurrent(); tick.time = now; tick.time_msc = (ulong)now * 1000; tick.bid = bid; tick.ask = ask; tick.last = (bid + ask) / 2.0; tick.volume = 0; tick.flags = TICK_FLAG_BID | TICK_FLAG_ASK | TICK_FLAG_LAST; MqlTick ticks[1]; ticks[0] = tick; int added = CustomTicksAdd(customSymbol, ticks); if(added != 1) { PrintFormat("CustomTicksAdd failed for %s (added=%d)", customSymbol, added); return false; } return true; } //------------------------------------------------------------------ // OnInit: split list and set timer //------------------------------------------------------------------ int OnInit() { ushort sep = ','; g_symbolCount = StringSplit(InpSymbolsList, sep, g_symbols); if(g_symbolCount <= 0) { Print("No symbols in InpSymbolsList."); return(INIT_PARAMETERS_INCORRECT); } ArrayResize(g_skip, g_symbolCount); ArrayInitialize(g_skip, false); g_updateSec = (InpUpdateSec < 1 ? 1 : InpUpdateSec); EventSetTimer(g_updateSec); for(int i = 0; i < g_symbolCount; i++) { string base = g_symbols[i]; if(base == "") continue; string custom = base + InpSuffix; PrintFormat("Will feed custom symbol %s from Binance %s", custom, base); } Print("BinanceFeedBridge initialized. Timer: ", g_updateSec, " seconds."); return(INIT_SUCCEEDED); } //------------------------------------------------------------------ // OnDeinit //------------------------------------------------------------------ void OnDeinit(const int reason) { EventKillTimer(); Print("BinanceFeedBridge deinitialized."); } //------------------------------------------------------------------ // OnTimer: update all valid symbols //------------------------------------------------------------------ void OnTimer() { for(int i = 0; i < g_symbolCount; i++) { if(g_skip[i]) continue; // already marked invalid/inactive string base = g_symbols[i]; if(base == "") continue; string custom = base + InpSuffix; double bid = 0.0, ask = 0.0; bool invalid = false; if(!GetBinanceBidAsk(base, bid, ask, invalid)) { if(invalid) g_skip[i] = true; // mark & never request again continue; } PushTickToCustom(custom, bid, ask); } }