Thursday, October 16, 2025
HomeTradingCCXT Software Server Showcase: entry crypto exchanges through MQL5 library from MetaTrader...

CCXT Software Server Showcase: entry crypto exchanges through MQL5 library from MetaTrader 5 – Different – 3 July 2025


CCXT is a JavaScript library for working with all top-100 crypto exchanges. For additional particulars on CCXT, please, go to widespread CCXT documentation and extra superior CCXT PRO.
CcxtAppServerLib is a MQL5 library for working with the crypto exchanges through Node.js and CCXT Software Server constructed on high of CCXT.

Newest beta-version of CcxtAppServer library contains optimized caching of alternate “markets” (instrument specs and different buying and selling circumstances), much less reminiscence footprint throughout parsing of big json-files, higher error dealing with, and new examples.

This blogpost will current an introductory showcase with most necessary features from public APIs – the script CcxtAppSrvShowcase.mq5.

First, embody the headers.

#embody "ccxtjsmtlib.mqh" 
#embody "ccxtutil.mqh"

Within the inputs, the Node server setup must be carried out (by default, it is localhost and port 8124).

enter group "Connection settings"
enter string NodeServer = "http://127.0.0.1:8124";
enter string NodeAuth = ""; 

Subsequent, present a selected alternate you need to work with. Depart the enter empty to view a printout with an inventory of all supported exchanges.

enter string Change = ""; 

Additionally present a ticker you are considering. If you do not know the identify, run the script first time and take a look at MQL5/Information/CCXT/ folder the place all acquired information is dumped by default, so you could find json-files with full markets information.

enter string Ticker = "BCH/USDT";

For watching exams (subscriptions through websockets) specify their length:

enter uint WatchingDuration = 10; 

The script demonstrates find out how to setup credentials for personal APIs, however is not going to use any personal perform.

enter group "Change settings (Non-public API)"
enter string ApiKey = "";
enter string Secret = "";
enter string Uid = "";
enter string Login = "";
enter string Password = "";

Further settings mean you can management the logging degree, dumping of all acquired information, and timeouts.

enter group "Auxiliary settings"
enter ushort Logging = 1; 
enter bool Dumping = true;
enter uint Timeout = 5; 

Then the primary occasion handler OnStart comes into play. The imported features, courses and strategies from the library are highlighted in yellow. Some components are omitted for brevity (for particulars take a look at the total supply code, distributed with the library).

Inline feedback are self-explanatory, I feel.

If the script is operating very first time, it is going to ask to unpack (manually) CCXT Software Server (extracted as ccxtappsrvbundle.jsc from a built-in useful resource), and run Node.js with it.

void OnStart()
{
   
   
   
   PrintFormat("CCXT AppSrvLibrary model: %.2f", AppSrvLibraryVersion());
   const static string standing[] = {"Cannot deploy",
      "App server ZIP is deployed, however not extracted",
      "App server information are deployed"};
   const int d = DeployCcxtAppServer();
   Print(standing[d + 1]);
   if(d 0)
   {
      return; 
   }

   
   
   
   SetNodeServer(NodeServer, NodeAuth);

   CcxtLink::Settings settings = {Logging, Dumping, Testing, Timeout, 0};
   CcxtLink *hyperlink = GetLink();  
   hyperlink.applySettings(settings);
   
   
   if(!StringLen(Change))
   {
      Print("Full checklist of exchanges:");
      Print(ListExchanges().stringify());
      Print("Professional checklist of exchanges with websockets help:");
      Print(ListExchanges(true).stringify());

      Print("App Server Model: ", AppSrvVersion().stringify());
      Print("CCXT lib model: ", CcxtVersion()["version"].stringify());
      return;
   }

   
   
   
   CCXT::Credentials credentials = {ApiKey, Secret, Uid, Login, Password};
   
   
   CcxtJsExchangeProIntf *ccxt = CreateExchangePro(Change, credentials, false);
   AutoPtr auto(ccxt);
   
   
   
   
   
   if(hyperlink.getLastHttpCode() != 200) 
   {
      return;
   }

   
   const bool isPro = !!*ccxt["pro"];
   if(ShowExchangeProperties)
   {
      Print("Is professional: ", isPro);
      Print("Required Credentials:");
      ccxt["requiredCredentials"].print();
      Print("Supported options:");         
      ccxt["has"].print();
      AutoPtr f = ccxt.get("amenities"); 
      Print("Services: ", f[].stringify());
   }

   

   
   
   
   AutoPtr verify = ccxt.get();
   if(Dumping) DumpJsonToFile("CCXT/check-" + Change, verify[]);
   
   
   
   
   
   if(ccxt.name("now").t != JS_PRIMITIVE)
   {
      ccxt.loadMarkets(false , false );
      JsValue *information = ccxt.get("markets"); 
      if(Dumping) DumpJsonToFile("CCXT/onlymarkets-" + Change, information);

      
      
      
      
      
      
   }
   else
   {
      Print("Markets are already loaded on Node");
   }

   

   
   
   

   JsValue *orderbook = ccxt.fetchOrderBook(Ticker, 10);
   if(Dumping) DumpJsonToFile("CCXT/orderbook-" + Change + "-" + Escape(Ticker), orderbook);
   
   JsValue *ticker = ccxt.fetchTicker(Ticker);
   if(Dumping) DumpJsonToFile("CCXT/ticker-" + Change + "-" + Escape(Ticker), ticker);
   
   JsValue *ohlcv = ccxt.fetchOHLCV(Ticker, "1m", t ? t - 1000 * 60 * 10 : 0, 10);
   if(Dumping) DumpJsonToFile("CCXT/ohlcv-" + Change + "-" + Escape(Ticker), ohlcv);

   JsValue *trades = ccxt.fetchTrades(Ticker, t ? t - 10000 : 0, 10);
   if(Dumping) DumpJsonToFile("CCXT/trades-" + Change + "-" + Escape(Ticker), trades);
   
   if(!!*ccxt["has"]["fetchBidsAsks"]) 
   {
      string array[] = {Ticker};
      JsValue *bidsasks = ccxt.fetchBidsAsks(array);
      if(Dumping) DumpJsonToFile("CCXT/bidsasks-" + Change + "-" + Escape(Ticker), bidsasks);
   }

   
   
   
   ccxt.fetchAnything(NULL);
   ...

The requested URLs and corresponding names of saved information are proven within the log.

And now goes the CCXT PRO half based mostly on websockets and reside notification subscriptions.

   
  
   
   if(isPro && ccxt.improve())
   {
      
      ccxt.watchOrderBook(Ticker);
      ccxt.watchTrades(Ticker);
      string tickers[] = {Ticker};
      ccxt.watchBidsAsks(tickers);
      ccxt.watchTrades(Ticker); 
      const uint begin = GetTickCount();
      whereas(!IsStopped() && ccxt.isConnected() && (!WatchingDuration || GetTickCount() - begin 1000))
      {
         AutoPtr j = ccxt.readMessage(); 
         if(j[])
         {
            Remark(j[].stringify()); 
         }
         else
         {
            
         }
      }
   }
   else
   {
      if(isPro && ccxt.isConnected())
      {
         Print("Cannot improve to websockets");
         string headers[][2];
         if(ccxt.ws().getHeaders(headers))
         {
            
         }
         ccxt.ws().shut(); 
      }
   }

   
   if(ccxt.isConnected())
   {
      Print("Unsubscribing...");
      
      ccxt.un().watchOrderBook(Ticker);
      ccxt.un().watchTrades(Ticker);
      ccxt.un().watchBidsAsks(); 
      ccxt.un().watchTrades(Ticker); 

      const uint begin = GetTickCount(); 
      whereas(!IsStopped() && ccxt.isConnected() && (GetTickCount() - begin 5 * 1000))
      {
         Print("studying...");
         AutoPtr j = ccxt.readMessage();
         if(j[])
         {
            Remark(j[].stringify());
         }
         else
         {
            break;
         }
      }
      
      Print("Closing...");
      
      ccxt.shut();
      
      whereas(!IsStopped()) 
      {
         AutoPtr j = ccxt.readMessage();
         if(j[])
         {
            Remark(j[].stringify());
         }
         else
         {
            break;
         }
      }
   }
}

When the script is operating, all incoming websocket information is proven as feedback on the chart (although the data can replace in a short time).

Watching a crypto-exchange via CCXT Application Server Library

The CCXT Software Server Library is presently in beta-stage and obtainable for testing upon request.

RELATED ARTICLES

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Most Popular

Recent Comments