21.4 C
New York
Friday, July 4, 2025

CCXT Utility Server Showcase: entry crypto exchanges by way of 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 by way of Node.js and CCXT Utility Server constructed on prime of CCXT.

Newest beta-version of CcxtAppServer library contains optimized caching of change “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, embrace the headers.

#embrace "ccxtjsmtlib.mqh" 
#embrace "ccxtutil.mqh"

Within the inputs, the Node server setup must be achieved (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 change you wish to work with. Go away the enter empty to view a printout with a listing of all supported exchanges.

enter string Trade = ""; 

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

enter string Ticker = "BCH/USDT";

For watching exams (subscriptions by way of websockets) specify their period:

enter uint WatchingDuration = 10; 

The script demonstrates the way to setup credentials for personal APIs, however won’t use any personal operate.

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

Further settings assist you to management the logging degree, dumping of all obtained information, and timeouts.

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

Then the principle occasion handler OnStart comes into play. The imported features, lessons and strategies from the library are highlighted in yellow. Some elements 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 working very first time, it can ask to unpack (manually) CCXT Utility 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(Trade))
   {
      Print("Full listing of exchanges:");
      Print(ListExchanges().stringify());
      Print("Professional listing 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(Trade, credentials, false);
   AutoPtr<CcxtJsExchangeProIntf> 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<JsValue> f = ccxt.get("amenities"); 
      Print("Services: ", f[].stringify());
   }

   

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

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

   

   
   
   

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

   JsValue *trades = ccxt.fetchTrades(Ticker, t ? t - 10000 : 0, 10);
   if(Dumping) DumpJsonToFile("CCXT/trades-" + Trade + "-" + Escape(Ticker), trades);
   
   if(!!*ccxt["has"]["fetchBidsAsks"]) 
   {
      string array[] = {Ticker};
      JsValue *bidsasks = ccxt.fetchBidsAsks(array);
      if(Dumping) DumpJsonToFile("CCXT/bidsasks-" + Trade + "-" + 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 dwell 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 < WatchingDuration * 1000))
      {
         AutoPtr<JsValue> 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<JsValue> j = ccxt.readMessage();
         if(j[])
         {
            Remark(j[].stringify());
         }
         else
         {
            break;
         }
      }
      
      Print("Closing...");
      
      ccxt.shut();
      
      whereas(!IsStopped()) 
      {
         AutoPtr<JsValue> j = ccxt.readMessage();
         if(j[])
         {
            Remark(j[].stringify());
         }
         else
         {
            break;
         }
      }
   }
}

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

Watching a crypto-exchange via CCXT Application Server Library

The CCXT Utility Server Library is at the moment in beta-stage and accessible for testing upon request.

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Latest Articles