Diskussion zum Artikel "Verwendung des JSON Data APIs in Ihren MQL-Projekten" - Seite 2

 
Sara Sabaghi #:

Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))

An dieser Tatsache können wir leider nichts ändern.

 
Edgar Akhmadeev #:

Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))

An dieser Tatsache können wir leider nichts ändern.

weil sie Kompatibilität brauchen.

 
Sara Sabaghi #:

In diesem Artikel geht es um API und wie man sie nutzt. Kennen Sie eine API, die Sie mit binären Forex-Daten versorgt? Dann stellen Sie sie vor.

Nächster Punkt: Sie kritisieren, warum man einen normalen Computer zum Spielen von FIFA2024 verwenden sollte, wenn ein Quantencomputer schneller ist. Die Antwort ist einfach: Ich brauche diese Art von Rechenleistung nicht.
Die Antwort auf dieses Argument lautet also, dass die meisten Daten, die in diesem Bereich in der API ausgetauscht werden, im Bereich von wenigen Megabyte liegen und es keinen Bedarf an Geschwindigkeit gibt. Außerdem verwenden alle Anbieter von Forex-Daten Standards wie XML, JSON...

Ich bin nicht gegen die Verwendung von JSON. Ich verwende es selbst, aber nur in der Entwicklungsphase, da man in PostMan oder WireShark immer eine gut lesbare Antwort sehen kann.
Ich wollte nur darauf hinweisen, dass in dem Artikel zu Unrecht das Binärformat nicht einmal erwähnt wurde. Außerdem ist das leistungsfähigere JSON-Binärformat (JSONB) jetzt auf dem Vormarsch.
Wenn ich Zugang zu einem Server habe, verwende ich für den Austausch zwischen Server und Client immer binäre Daten. Es gibt nur einen Grund, warum JSON überall verwendet wird: lesbar (für den Benutzer, aber nicht für den Computer). Damit es weniger dumme Fragen von Benutzern gibt.
Selbst bei Websockets, wo die übertragenen Daten in der Regel sehr klein sind, halte ich es für sinnvoll, binäre Daten zu verwenden. Zumindest weil es ein produktiveres System mit weniger Last auf der Server- und Client-Seite ist. Und wenn man Cloud-Technologien einsetzt, was in der heutigen, hart umkämpften Realität sinnvoll ist, spart man viel Geld für deren Bezahlung. Schließlich verbraucht die Serialisierung eine Menge Ressourcen und spart eine Menge Datenverkehr.
 
Nikolai Semko #:
Ich bin nicht gegen die Verwendung von JSON. Ich verwende es selbst, aber nur in der Entwicklungsphase, da man in PostMan oder WireShark immer eine gut lesbare Antwort sehen kann.
Ich wollte nur darauf hinweisen, dass in dem Artikel zu Unrecht das Binärformat nicht einmal erwähnt wird. Außerdem ist das leistungsfähigere JSON-Binärformat (JSONB) jetzt auf dem Vormarsch.
Wenn ich Zugang zu einem Server habe, verwende ich für den Austausch zwischen Server und Client immer binäre Daten. Es gibt nur einen Grund, warum JSON überall verwendet wird: lesbar (für den Benutzer, aber nicht für den Computer). Um weniger dumme Fragen von Benutzern zu haben.
Selbst in Websockets, wo in der Regel nur sehr kleine Daten übertragen werden, halte ich die Verwendung von Binärdaten für sinnvoll. Zumindest weil es ein produktiveres System mit weniger Last auf der Server- und Client-Seite ist. Und wenn man Cloud-Technologien einsetzt, was in der heutigen, hart umkämpften Realität sinnvoll ist, spart man viel Geld für deren Bezahlung. Schließlich verbraucht die Serialisierung eine Menge Ressourcen und spart eine Menge Datenverkehr.

Vielen Dank, dass Sie sich die Zeit genommen haben, Ihre Gedanken mit uns zu teilen. Ich verstehe Ihren Standpunkt voll und ganz, und die Punkte, die Sie über die Verwendung von Binärformaten und JSONB angesprochen haben, sind sehr berechtigt. Sie haben Recht, dass JSON im Vergleich zu Binärformaten nicht so sehr für die Systemleistung optimiert ist, und das ist etwas, dessen sich viele Entwickler bewusst sind.

In dem von uns verfassten Artikel haben wir uns in erster Linie auf JSON konzentriert, weil 99 % der Finanzdatenanbieter, insbesondere im Forex-Bereich, diesen Standard für den Datenaustausch verwenden und viele Plattformen und Dienste Daten in diesem Format bereitstellen. Aus diesem Grund haben wir uns nicht mit anderen Standards befasst.

Nochmals vielen Dank, dass Sie uns Ihre Sichtweise mitgeteilt und auf dieses wichtige Detail hingewiesen haben.

 
Edgar Akhmadeev #:

Die Forderungen richten sich natürlich nicht an Sie, sondern an die Inhaltsanbieter. Diese geben aus irgendeinem Grund keine Binärdaten, sondern Textdaten ))))

An dieser Tatsache können wir leider nichts ändern.

Ja, ich verstehe das vollkommen. Außerdem sind wir verpflichtet, diesen Standard zu verwenden, weil fast alle Finanzdatenanbieter diese Methode verwenden.

 
Hallo, hier ist es. Ich habe darum gebeten, dass ich es in der mql5-Community poste =
 //+------------------------------------------------------------------+
 //|ZIWOX API und technische Strategie.mq5 |
 //|Copyright 2024, ssabbaghi |
 //| https://www.mql5.com/de/users/ssabbaghi |
 //+------------------------------------------------------------------+
 #property   copyright    "Sara Sabbaghi"
 #property   link          "https://www.mql5.com/de/users/ssabbaghi"
 #property   version      "1.0"
 #property   strict

 //---- Eingabeparameter
 input      string       APIKey         =   "xxxxaquisuakey" ;       // Ihr eindeutiger API-Schlüssel
 input      string       SymbolPrefix   =   "" ;       // Ihr Broker-Kontosymbol Präfix
 input      string       SymbolSuffiex  =   "m" ;       // Ihr Broker-Kontosymbol Suffix
 input      int          shortMAPeriod  =   50 ;       // Langsamer MA-Zeitraum
 input      int          longMAPeriod   =   200 ;     // Schneller MA-Zeitraum
 input      double       Lots           =   0.01 ;     // Statisches Auftragsvolumen
 input      int          APICallInterval = 300 ;     // Intervall zwischen API-Aufrufen in Sekunden (5 Minuten)

 // Bibliotecas CatBoost
 #include <JAson.mqh>
CJAVal JsonValue;

 string    OBJPREFIX      =   "ZXAPI" ,
         SymbolRequest  =   "" ,
         APIJSON[];
 bool      APIOK =   false ;
 datetime LastAPICallTime = 0 ; // Armazena o tempo da última chamada à API

 //+------------------------------------------------------------------+
 //| Experten-Initialisierungsfunktion|
 //+------------------------------------------------------------------+
 int OnInit ()
{
   EventSetTimer ( 30 );
   ArrayResize (APIJSON, 15 );
   SymbolRequest = PureSymbol( Symbol (), SymbolSuffiex, SymbolPrefix); // Vorbereiten des tatsächlichen Symbolnamens 
   Comment ( "Wait a sec, to Get API data..." );
   return ( INIT_SUCCEEDED );
}

 //+------------------------------------------------------------------+
 //| Experten-Deinitialisierungsfunktion|
 //+------------------------------------------------------------------+
 void OnDeinit ( const int reason)
{
   Comment ( "" );
   ObjectsDeleteAll ( 0 );
}

 //+------------------------------------------------------------------+
 //| Experten-Tick-Funktion OnTick()|
 //+------------------------------------------------------------------+
 void OnTick ()
{
   if (!APIOK) return ;

   double shortMA, longMA;
   long ticket = - 1 ;

   if (IsNewCandle())
   {
      shortMA = iMA ( Symbol (), PERIOD_CURRENT , shortMAPeriod, 0 , MODE_SMA , PRICE_CLOSE );
      longMA = iMA ( Symbol (), PERIOD_CURRENT , longMAPeriod, 0 , MODE_SMA , PRICE_CLOSE );

       // Prüfung auf Crossover-Signale 
       if ( int (APIJSON[ 3 ]) >= 60 ) // wenn die Hausseprognose höher als 60% ist 
      {
         if (shortMA > longMA)   // BUY trend 
         {
             if ( OrdersTotal () == 0 ) {
               MqlTradeRequest request;
               MqlTradeResult result;
               request.action = TRADE_ACTION_DEAL ; // TRADE_ACTION_DEAL für Kauf verwenden 
               request.symbol = Symbol ();
               request.volume = Lots;
               request.type = ORDER_TYPE_BUY ; // ORDER_BUY für den Kauf verwenden 
               request.price = SymbolInfoDouble ( Symbol (), SYMBOL_ASK );
               request.sl = 0 ;
               request.tp = 0 ;
               request.deviation = 3 ;
               request.comment = "Buy Order" ;
               if (! OrderSend (request, result)) {
                   Print ( "Error opening buy order: " , GetLastError ());
               }
            }
         }
      }
       if ( int (APIJSON[ 4 ]) >= 60 ) // wenn die Baisseprognose höher als 60% ist 
      {
         if (shortMA < longMA)   // Trend verkaufen 
         {
             if ( OrdersTotal () == 0 )
            {
               MqlTradeRequest request;
               MqlTradeResult result;
               request.action = TRADE_ACTION_DEAL ; // TRADE_ACTION_DEAL für Verkauf verwenden 
               request.symbol = Symbol ();
               request.volume = Lots;
               request.type = ORDER_TYPE_SELL ; // ORDER_SELL für Verkauf verwenden 
               request.price = SymbolInfoDouble ( Symbol (), SYMBOL_BID );
               request.sl = 0 ;
               request.tp = 0 ;
               request.deviation = 3 ;
               request.comment = "Sell Order" ;
               if (! OrderSend (request, result)) {
                   Print ( "Error opening sell order: " , GetLastError ());
               }
            }
         }
      }
   }
}

 //+------------------------------------------------------------------+
 //| OnTimer-Funktion für Experten|
 //+------------------------------------------------------------------+
 void OnTimer ()
{
   // Überprüft, ob die Zeitspanne, die seit dem letzten Aufruf der API verstrichen ist, größer ist als das definierte Intervall. 
   if ( TimeCurrent () - LastAPICallTime >= APICallInterval)
   {
       string APIfilename = SymbolRequest + "_API_Data.json" ; // Dateiname des API-Speichers 
      APIOK = GetAPI(SymbolRequest, APIKey, APIfilename);   // Abrufen der API-Daten und Speichern unter APIfilename 
       if (APIOK) JsonDataParse(APIfilename, APIJSON);     // Lesen Sie die JSON-Daten und speichern Sie sie im Array API_DATA 
       Comment ((APIOK ? "API OK" : "API FAILED" ),
               "\nAPI:\n" ,
               "\nBullish Forecast: " , APIJSON[ 3 ],
               "\nBearish Forecast: " , APIJSON[ 4 ],
               "\nRetail traders Long: " , APIJSON[ 5 ],
               "\nRetail traders Short: " , APIJSON[ 6 ],
               "\nMarket Sentiment: " , APIJSON[ 14 ]
              );

       // Aktualisiert das Tempo des letzten API-Kontakts 
      LastAPICallTime = TimeCurrent ();
   }
}

 //+------------------------------------------------------------------+
 //| Neue Kerzenprüfungsfunktion|
 //+------------------------------------------------------------------+
 datetime NewCandleTime = TimeCurrent ();
 bool IsNewCandle()
{
   if (NewCandleTime == iTime ( Symbol (), 0 , 0 ))
       return false ;
   else 
   {
      NewCandleTime = iTime ( Symbol (), 0 , 0 );
       return true ;
   }
}

 //+------------------------------------------------------------------+
 //| Reine Symbolfunktion|
 //+------------------------------------------------------------------+
 string PureSymbol( string symbol, string suffiex, string prefix)
{
   string puresymbol = symbol;
   if (prefix != "" || suffiex != "" )
   {
       StringReplace (puresymbol, suffiex, "" );
       StringReplace (puresymbol, prefix, "" );
   }
   return puresymbol;
}

 //+------------------------------------------------------------------+
 //| Fondsdaten von ziwox abrufen|
 //+------------------------------------------------------------------+
 datetime LastWebRequest = 0 ; // Verwendung dieser Datetime-Variable für die Begrenzung fehlgeschlagener Anfragen API
 bool GetAPI( string symbolname, string apikey, string filename)
{
   Print ( "Get API Update" );
   bool NeedToUpdate = false ;

   // Prüfen, ob die API-Datendatei verfügbar ist 
   if ( FileGetInteger (filename, FILE_EXISTS , true ) >= 0 )
   {
       // Prüfen Sie die letzte Aktualisierungszeit anhand der Zeit des Änderungsdatums der Datei 
       if ( TimeLocal () - ( datetime ) FileGetInteger (filename, FILE_MODIFY_DATE , true ) > 900 ) // Aktualisierung der Daten alle 15 Minuten 
         NeedToUpdate = true ;
   }
   else 
      NeedToUpdate = true ;

   if (NeedToUpdate && TimeLocal () - LastWebRequest > 300 )   // Wiederholung einer fehlgeschlagenen API-Anfrage alle 5 Minuten 
   {
       string cookie = NULL , headers;
       char post[], result[];
       int res;
       string URL = "https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&amp;apikey=" + apikey + "&apitype=json&pair=" + symbolname;
       ResetLastError ();
       int timeout = 5000 ;
      res = WebRequest ( "GET" , URL, cookie, NULL , timeout, post, 0 , result, headers);
       if (res == - 1 )
      {
         LastWebRequest = TimeLocal ();
         int error = GetLastError ();
         if (error == 4060 )
             Print ( "API data Webrequest Error " , error, " Check your webrequest on Metatrader Expert option." );
         else if (error == 5203 )
             Print ( "HTTP request for " + symbolname + " Data failed!" );
         else 
             Print ( "Unknown HTTP request error(" + string (error) + ")! " + symbolname + " Data" );
         return false ;
      }
       else if (res == 200 )
      {
         LastWebRequest = TimeLocal ();
         string HTTPString = CharArrayToString (result, 0 , 0 , CP_UTF8 );
         Print ( "HTTP request for " + symbolname + " Data successful!" );
         Print (HTTPString);
         if ( StringFind (HTTPString, "invalid api key" , 0 ) != - 1 ) {
             Alert ( "Invalid API key" );
             return false ;
         }
         // Speichern Sie die API-Daten in einer gemeinsamen Ordnerdatei 
         int filehandle = FileOpen (filename, FILE_READ | FILE_SHARE_READ | FILE_WRITE | FILE_SHARE_WRITE | FILE_BIN | FILE_COMMON );
         if (filehandle != INVALID_HANDLE )
         {
             FileWriteArray (filehandle, result, 0 , ArraySize (result));
             FileClose (filehandle);
         }
      }
   }
   return true ;
}

 //+------------------------------------------------------------------+
 //| JSON Data Parse Funktion|
 //+------------------------------------------------------------------+
 void JsonDataParse( string filename, string &_APIJSON[])
{
   for ( int arraIn = 0 ; arraIn < ArraySize (APIJSON); arraIn++) APIJSON[arraIn] = "" ;

   if ( FileGetInteger (filename, FILE_EXISTS , true ) >= 0 )
   {
       int FileHandle = FileOpen (filename, FILE_READ | FILE_SHARE_READ | FILE_WRITE | FILE_SHARE_WRITE | FILE_BIN | FILE_COMMON );
       char jsonarray[];
       FileReadArray (FileHandle, jsonarray);
       FileClose (FileHandle);

      JsonValue.Clear();
      JsonValue.Deserialize( CharArrayToString (jsonarray, 0 , 0 , CP_UTF8 ));

      _APIJSON[ 0 ] = JsonValue[ 0 ][ "Symbol" ].ToStr();
      _APIJSON[ 1 ] = JsonValue[ 0 ][ "Fundamental Bias" ].ToStr();
      _APIJSON[ 2 ] = JsonValue[ 0 ][ "Fundamental Power" ].ToStr();
      _APIJSON[ 3 ] = JsonValue[ 0 ][ "AI Bullish Forecast" ].ToStr();
      _APIJSON[ 4 ] = JsonValue[ 0 ][ "AI Bearish Forecast" ].ToStr();
      _APIJSON[ 5 ] = JsonValue[ 0 ][ "Retail Long Ratio" ].ToStr();
      _APIJSON[ 6 ] = JsonValue[ 0 ][ "Retail Short Ratio" ].ToStr();
      _APIJSON[ 7 ] = JsonValue[ 0 ][ "Retail Short Lot" ].ToStr();
      _APIJSON[ 8 ] = JsonValue[ 0 ][ "Retail Short pos" ].ToStr();
      _APIJSON[ 9 ] = JsonValue[ 0 ][ "Base COT NET" ].ToStr();
      _APIJSON[ 10 ] = JsonValue[ 0 ][ "Base COT change" ].ToStr();
      _APIJSON[ 11 ] = JsonValue[ 0 ][ "Quote COT NET" ].ToStr();
      _APIJSON[ 12 ] = JsonValue[ 0 ][ "Quote COT change" ].ToStr();
      _APIJSON[ 13 ] = JsonValue[ 0 ][ "COT chng Ratio" ].ToStr();
      _APIJSON[ 14 ] = JsonValue[ 0 ][ "Risk Sentiment" ].ToStr();
   }
}
 //+------------------------------------------------------------------+

Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass es in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.

Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.

Brasilien - Goiás - Caldas Novas - Ney Borges

Sara Sabaghi
Sara Sabaghi
  • 2025.01.13
  • www.mql5.com
Trader's profile
 
Ney Borges #:
Falls nötig, können Sie die JAson.mqh-Bibliothek verwenden, die im Originalcode unseres Begleiters zu finden ist.

Was für eine schreckliche Art und Weise für den Google Übersetzer zu arbeiten.

Ohne die JAson-Bibliothek wird er natürlich nicht funktionieren.

Die Bibliothek ist nicht in seinem Code, sie ist hier, und der Autor hat das angegeben.

JSON Serialization and Deserialization (native MQL)
JSON Serialization and Deserialization (native MQL)
  • www.mql5.com
Сериализация и десериализация JSON протокола. Портированный код со скоростной библиотеки С++.
 
Sara Sabaghi #:

Ja, ich verstehe das vollkommen. Außerdem sind wir verpflichtet, diesen Standard zu verwenden, da fast alle Finanzdatenanbieter diese Methode anwenden.

Ney Borges #:
Hallo, hier ist es, also, worum ich gebeten habe, ist, dass ich es in der mql5-Community poste =

Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.

Version für MQL5 METATRADER 5 Ich habe Änderungen am Code vorgenommen, so dass er in Metatrader 5 funktionieren würde. Die Änderungen wurden auch in Bezug auf die Kodierung für bessere Bedingungen in der aktuellen kommerziellen Situation gemacht. Alle Änderungen dienten der Anpassung des Codes an Metatrader 5. Er ist funktionsfähig. Laden Sie einfach diese Datei herunter und führen Sie sie aus. Wenn nötig, die JAson.mqh Bibliothek, die im Originalcode unseres Begleiters zu finden ist. Mein Name ist Ney Borges. Ich komme aus Brasilien, Bundesstaat Goiás, Stadt Caldas Novas, mitten im Wald von Brasilien. Es war sehr schwierig, alleine zu lernen, ohne jemanden, der mir hilft, aber hier in der Gemeinschaft habe ich viel gelernt. Ich danke Ihnen.

Brasilien - Goiás - Caldas Novas - Ney Borges

Fiz algumas correçoes ao codigo para funcionar no MQL5 gostaria que por gentilesa verificasse e retornar, obrigado - Sara Sabaghi

//+------------------------------------------------------------------+
//| Ney Borges versão mql5 de ZIWOX API and Technical Strategy.mq5 |
//|Copyright 2024, ssabbaghi |
//| https://www.mql5.com/de/users/ssabbaghi |
//+------------------------------------------------------------------+
#property   copyright   "Sara Sabbaghi"
#property   link        "https://www.mql5.com/de/users/ssabbaghi"
#property   version     "1.0"
#property   strict
#property   description "Experte für Redaktionsfunktionen für ZIWOX API"

// Bibliotecas
#include <JAson.mqh>
CJAVal JsonValue;

// Propriedades do Expert para permitir funções de rede
//#property script_show_inputs
//#property script_show_confirm

//---- Eingabeparameter
input    string      APIKey         =  "sua Key aqui xxxxxxxx";      // Ihr eindeutiger API-Schlüssel
input    string      SymbolPrefix   =  "";      // Ihr Broker-Kontosymbol Präfix
input    string      SymbolSuffiex  =  "m";      // Ihr Broker-Kontosymbol Suffix
input    int         shortMAPeriod  =  50;      // Langsamer MA-Zeitraum
input    int         longMAPeriod   =  200;     // Schneller MA-Zeitraum
input    double      Lots           =  0.01;    // Statisches Auftragsvolumen
input    double      BullishThreshold = 60.0;   // Schwellenwert für Hausseprognose
input    double      BearishThreshold = 60.0;   // Schwellenwert für rückläufige Prognose
input    int         APICallInterval = 300;     // Intervall zwischen API-Aufrufen in Sekunden (5 Minuten)

string   OBJPREFIX      =  "ZXAPI",
         SymbolRequest  =  "",
         APIJSON[];
bool     APIOK          =  false;
datetime LastAPICallTime = 0; // Armazena o tempo da última chamada à API

//+------------------------------------------------------------------+
//| Funktion zum Testen der HTTP-Verbindung|
//+------------------------------------------------------------------+
bool TestHTTPConnection()
{
   string cookie=NULL,headers;
   char post[],result[];
   string url="https://www.ziwox.com";
   
   ResetLastError();
   int timeout=5000; 
   
   int res=WebRequest("GET",url,cookie,NULL,timeout,post,0,result,headers);
   
   if(res==-1)
   { 
      int error=GetLastError();
      string msg = "Falha ao conectar, erro "+IntegerToString(error);
      
      // Se for erro de permissão, mostra mensagem específica
      if(error==4014)
         msg = "Adicione "+url+" em Ferramentas -> Opções -> Expert Advisors -> Permitir WebRequest";
         
      Print("DEBUG: ", msg);
      return(false);
   }
   
   Print("DEBUG: Conexão HTTP testada com sucesso");
   return(true);
}

//+------------------------------------------------------------------+
//| Experten-Initialisierungsfunktion|
//+------------------------------------------------------------------+
int OnInit()
{
   Print("=== Iniciando Expert Advisor ===");
   
   // Verifica configurações básicas
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
   {
      Print("AVISO: Algorithmic Trading não está permitido");
      // Continua mesmo assim
   }
   
   if(!TerminalInfoInteger(TERMINAL_CONNECTED))
   {
      Print("AVISO: Das Terminal ist nicht mit dem Internet verbunden.);
      // Continua mesmo assim
   }
   
   // Konfiguration von EA
   EventSetTimer(30);
   ArrayResize(APIJSON, 15);
   SymbolRequest = PureSymbol(Symbol(), SymbolSuffiex, SymbolPrefix);
   
   // Die URL, die verwendet werden soll, wird vorbereitet und angezeigt.
   string cleanSymbol = SymbolRequest;
   StringReplace(cleanSymbol, "m", "");
   string apiUrl = StringFormat("https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&amp;apikey=%s&apitype=json&pair=%s", 
                              APIKey, cleanSymbol);
   
   Print("URL configurada: ", apiUrl);
   Print("IMPORTANTE: Adicione a URL https://www.ziwox.com em:");
   Print("Ferramentas -> Opções -> Expert Advisors -> Permitir WebRequest");
   
   Comment("Iniciando EA...\n",
           "URL que será usada:\n",
           apiUrl,
           "\n\nIMPORTANTE: Configure a URL nas opções do Expert Advisor");
   
   // Testa conexão HTTP, mas não falha se der erro
   if(!TestHTTPConnection())
   {
      Print("AVISO: Teste de conexão HTTP falhou");
      Print("O EA continuará tentando conectar...");
      // Continua mesmo assim
   }
   
   Print("=== Inicialização concluída ===");
   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Experten-Deinitialisierungsfunktion|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   Comment("");
   ObjectsDeleteAll(0);
}

//+------------------------------------------------------------------+
//| Experten-Tick-Funktion OnTick()|
//+------------------------------------------------------------------+
void OnTick()
{
   if (!APIOK) return;
   
   double shortMA, longMA;
   MqlTradeRequest request = {};
   MqlTradeResult result = {};
   
   if (IsNewCandle())
   {
      shortMA = iMA(Symbol(),PERIOD_CURRENT, shortMAPeriod, 0, MODE_SMA, PRICE_CLOSE);
      longMA = iMA(Symbol(),PERIOD_CURRENT, longMAPeriod, 0, MODE_SMA, PRICE_CLOSE);

      // Analyse von JSON-Daten für die Entscheidungsfindung bei Geschäftsabschlüssen
      double aiBullishForecast = StringToDouble(APIJSON[3]); // Previsão de alta
      double aiBearishForecast = StringToDouble(APIJSON[4]); // Previsão de baixa

      // Prüfung auf Crossover-Signale
      if (aiBullishForecast >= BullishThreshold && shortMA > longMA) // Se a previsão de alta for maior que o limite
      {
         if (OrdersTotal() == 0) {
            request.action = TRADE_ACTION_DEAL;
            request.symbol = _Symbol;
            request.volume = Lots;
            request.type = ORDER_TYPE_BUY;
            request.price = SymbolInfoDouble(_Symbol, SYMBOL_ASK);
            request.deviation = 3;
            request.magic = 123456;
            request.comment = "Buy Order";
            request.type_filling = ORDER_FILLING_FOK;
            
            if(!OrderSend(request, result))
               Print("Error opening buy order: ", GetLastError());
         }
      }
      if (aiBearishForecast >= BearishThreshold && shortMA < longMA) // Se a previsão de baixa for maior que o limite
      {
         if (OrdersTotal() == 0) {
            request.action = TRADE_ACTION_DEAL;
            request.symbol = _Symbol;
            request.volume = Lots;
            request.type = ORDER_TYPE_SELL;
            request.price = SymbolInfoDouble(_Symbol, SYMBOL_BID);
            request.deviation = 3;
            request.magic = 123456;
            request.comment = "Sell Order";
            request.type_filling = ORDER_FILLING_FOK;
            
            if(!OrderSend(request, result))
               Print("Error opening sell order: ", GetLastError());
         }
      }
   }
}

//+------------------------------------------------------------------+
//| Função para verificar se a URL está permitida |
//+------------------------------------------------------------------+
bool IsURLAllowed()
{
   string url = "https://www.ziwox.com";
   string cookie=NULL, headers;
   char post[], result[];
   ResetLastError();
   
   int res = WebRequest("GET", url, cookie, NULL, 5000, post, 0, result, headers);
   
   if(res == -1)
   {
      int error = GetLastError();
      if(error == 4014)
      {
         Comment("ATENÇÃO: URL não permitida\n",
                 "1. Vá em Ferramentas -> Opções -> Expert Advisors\n",
                 "2. Marque 'Permitir WebRequest para as URLs listadas abaixo'\n",
                 "3. Adicione a URL: ", url, "\n",
                 "4. Clique em OK");
         return false;
      }
   }
   return true;
}

//+------------------------------------------------------------------+
//| OnTimer-Funktion für Experten|
//+------------------------------------------------------------------+
void OnTimer()
{
   // Überprüfen Sie, ob eine URL zulässig ist, bevor Sie eine Bestellung aufgeben.
   if(!IsURLAllowed())
   {
      Print("DEBUG: URL não está permitida. Aguardando configuração...");
      return;
   }

   if (TimeCurrent() - LastAPICallTime >= APICallInterval)
   {
      string APIfilename = SymbolRequest + "_API_Data.json";
      
      // URL für die Anzeige in den Kommentaren vorbereiten
      string cleanSymbol = SymbolRequest;
      StringReplace(cleanSymbol, "m", "");
      string apiUrl = StringFormat("https://www.ziwox.com/terminal/services/API/V1/fulldata.php?expn=ziwoxuser&amp;apikey=%s&apitype=json&pair=%s", 
                                 APIKey, cleanSymbol);
      
      // Mostra que está fazendo a chamada
      Comment("Fazendo chamada à API...\n",
              "URL: ", apiUrl,
              "\n\nAguarde...");
      
      APIOK = GetAPI(SymbolRequest, APIKey, APIfilename);
      
      if (APIOK) {
         JsonDataParse(APIfilename, APIJSON);
         Comment("=== API OK ===\n",
                 "URL: ", apiUrl, "\n",
                 "Última atualização: ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n",
                 "\nDados recebidos:",
                 "\nSymbol: ", APIJSON[0],
                 "\nÚltimo Preço: ", APIJSON[1],
                 "\nViés Fundamental: ", APIJSON[2],
                 "\nPrevisão de Alta: ", APIJSON[3], "%",
                 "\nPrevisão de Baixa: ", APIJSON[4], "%",
                 "\nPosições Compradas: ", APIJSON[5],
                 "\nPosições Vendidas: ", APIJSON[6],
                 "\nTendência D1: ", APIJSON[7],
                 "\nRSI D1: ", APIJSON[8],
                 "\nPermitido Operar: ", APIJSON[9]
                 );
      } else {
         Comment("=== FALHA NA API ===\n",
                 "URL tentada: ", apiUrl, "\n",
                 "Hora: ", TimeToString(TimeCurrent(), TIME_DATE|TIME_SECONDS), "\n",
                 "\nVerifique:",
                 "\n1. Se a URL está permitida em Ferramentas -> Opções -> Expert Advisors -> WebRequest",
                 "\n2. Se sua conexão com a internet está funcionando",
                 "\n3. Se o símbolo está correto"
                 );
      }

      LastAPICallTime = TimeCurrent();
   }
}

//+------------------------------------------------------------------+
//| Função para verificar se é um novo candle |
//+------------------------------------------------------------------+
bool IsNewCandle()
{
   static datetime lastCandleTime = 0;
   datetime currentCandleTime = iTime(Symbol(), 0, 0);
   if (currentCandleTime != lastCandleTime)
   {
      lastCandleTime = currentCandleTime;
      return true;
   }
   return false;
}

//+------------------------------------------------------------------+
//| Reine Symbolfunktion|
//+------------------------------------------------------------------+
string PureSymbol(string symbol, string suffiex, string prefix)
{
   string puresymbol = symbol;
   if (prefix != "" || suffiex != "")
   {
      StringReplace(puresymbol, suffiex, "");
      StringReplace(puresymbol, prefix, "");
   }
   return puresymbol;
}

//+------------------------------------------------------------------+
//| Função para verificar configuração do WebRequest |
//+------------------------------------------------------------------+
bool CheckWebRequestSettings()
{
   if(!TerminalInfoInteger(TERMINAL_DLLS_ALLOWED))
   {
      Print("ERRO: DLLs não estão permitidas!");
      return false;
   }
   
   if(!TerminalInfoInteger(TERMINAL_TRADE_ALLOWED))
   {
      Print("ERRO: Algorithmic Trading não está permitido!");
      return false;
   }
   
   if(!MQLInfoInteger(MQL_DLLS_ALLOWED))
   {
      Print("ERRO: DLLs não estão permitidas para este Expert!");
      return false;
   }
   
   return true;
}

//+------------------------------------------------------------------+
//| Função para verificar conexão com o servidor |
//+------------------------------------------------------------------+
bool CheckServerConnection()
{
   int socket = SocketCreate();
   
   if(socket != INVALID_HANDLE)
   {
      // Verbinden Sie sich mit dem Server von ZIWOX (Port 80 für HTTP)
      if(SocketConnect(socket, "www.ziwox.com", 80, 1000))
      {
         Print("DEBUG: Conexão com servidor testada com sucesso");
         // Verifica se está realmente conectado
         if(SocketIsConnected(socket))
         {
            SocketClose(socket);
            return true;
         }
      }
      else
      {
         Print("DEBUG: Falha ao conectar com o servidor: ", GetLastError());
      }
      SocketClose(socket);
   }
   else
   {
      Print("DEBUG: Falha ao criar socket: ", GetLastError());
   }
   return false;
}

//+------------------------------------------------------------------+
//| Funktion zum Abrufen von Daten aus der API|
//+------------------------------------------------------------------+
bool GetAPI(string symbolname, string apikey, string filename)
{
   if(!TestHTTPConnection())
   {
      Print("DEBUG: Falha no teste de conexão HTTP");
      return false;
   }

   string headers = "Content-Type: application/json\r\nAccept: application/json\r\n";
   char post[], result[];
   string cookie=NULL;
   int res;
   
   // Entfernen Sie das Suffix 'm' aus dem API-Symbol.
   string cleanSymbol = symbolname;
   StringReplace(cleanSymbol, "m", "");
   
   string URL = "https://www.ziwox.com/terminal/services/API/V1/fulldata.php";
   string params = StringFormat("?expn=ziwoxuser&apikey=%s&apitype=json&pair=%s", 
                              apikey, cleanSymbol);
   
   Print("DEBUG: Preparando requisição...");
   Print("DEBUG: URL completa: ", URL + params);
   
   URL = URL + params;
   
   string body = StringFormat("{\"apikey\":\"%s\",\"pair\":\"%s\"}", apikey, cleanSymbol);
   StringToCharArray(body, post, 0, WHOLE_ARRAY, CP_UTF8);
   
   Print("DEBUG: Body da requisição: ", body);
   
   // Tenta fazer a requisição
   Print("DEBUG: Iniciando WebRequest...");
   res = WebRequest("GET", URL, cookie, NULL, 5000, post, 0, result, headers);
   Print("DEBUG: Código de resposta WebRequest: ", res);
   
   if(res == -1)
   {
      int error = GetLastError();
      Print("DEBUG: GetLastError retornou: ", error);
      return false;
   }
   
   if(res != 200)
   {
      Print("DEBUG: Resposta HTTP diferente de 200: ", res);
      return false;
   }
   
   string response = CharArrayToString(result, 0, WHOLE_ARRAY, CP_UTF8);
   
   // Entfernen Sie ein Tag <pre> da resposta
   StringReplace(response, "<pre>", "");
   StringReplace(response, "</pre>", "");
   
   Print("DEBUG: Resposta recebida (primeiros 500 caracteres): ", StringSubstr(response, 0, 500));
   Print("DEBUG: Tamanho total da resposta: ", StringLen(response));
   
   if(StringFind(response, "invalid api key") >= 0)
   {
      Print("DEBUG: API Key inválida encontrada na resposta");
      Alert("Invalid API key");
      return false;
   }
   
   // Tenta salvar a resposta
   Print("DEBUG: Tentando salvar resposta no arquivo: ", filename);
   int filehandle = FileOpen(filename, FILE_WRITE|FILE_BIN|FILE_COMMON);
   if(filehandle != INVALID_HANDLE)
   {
      // Konvertiert eine Antwort in ein Array von Merkmalen
      char responseArray[];
      StringToCharArray(response, responseArray, 0, StringLen(response));
      
      // Salva no arquivo
      FileWriteArray(filehandle, responseArray);
      FileClose(filehandle);
      Print("DEBUG: Arquivo salvo com sucesso");
      return true;
   }
   
   Print("DEBUG: Falha ao salvar arquivo");
   return false;
}

//+------------------------------------------------------------------+
//| Funktion zum Analysieren von JSON-Daten|
//+------------------------------------------------------------------+
void JsonDataParse(string filename, string &_APIJSON[])
{
   for (int arraIn = 0; arraIn < ArraySize(APIJSON); arraIn++) 
      APIJSON[arraIn] = "";

   if (FileGetInteger(filename, FILE_EXISTS, true) >= 0)
   {
      int FileHandle = FileOpen(filename, FILE_READ|FILE_BIN|FILE_COMMON);
      if(FileHandle != INVALID_HANDLE)
      {
         char jsonarray[];
         FileReadArray(FileHandle, jsonarray);
         FileClose(FileHandle);

         JsonValue.Clear();
         string jsonString = CharArrayToString(jsonarray, 0, WHOLE_ARRAY, CP_UTF8);
         Print("JSON Recebido: ", jsonString); // Fehlersuche
         
         if(JsonValue.Deserialize(jsonString))
         {
            _APIJSON[0] = JsonValue[0]["Symbol"].ToStr();
            _APIJSON[1] = JsonValue[0]["Last Price"].ToStr();
            _APIJSON[2] = JsonValue[0]["Base Fundamental Bias"].ToStr();
            _APIJSON[3] = JsonValue[0]["AI Bullish Forecast"].ToStr();
            _APIJSON[4] = JsonValue[0]["AI Bearish Forecast"].ToStr();
            _APIJSON[5] = JsonValue[0]["Retail Long Ratio"].ToStr();
            _APIJSON[6] = JsonValue[0]["Retail Short Ratio"].ToStr();
            _APIJSON[7] = JsonValue[0]["D1 Trend"].ToStr();
            _APIJSON[8] = JsonValue[0]["D1 RSI"].ToStr();
            _APIJSON[9] = JsonValue[0]["Allow To Trade"].ToStr();
            
            Print("Dados processados:");
            Print("Symbol: ", _APIJSON[0]);
            Print("Last Price: ", _APIJSON[1]);
Discussing the article: "Using JSON Data API in your MQL projects"
Discussing the article: "Using JSON Data API in your MQL projects"
  • 2025.01.17
  • Edgar Akhmadeev
  • www.mql5.com
Check out the new article: Using JSON Data API in your MQL projects . Author: Sara Sabaghi...
 
Ney Borges #:

Fiz algumas correçoes ao codigo para funcionar no MQL5 gostaria que por gentilesa verificasse e retornar, obrigado - Sara Sabaghi

Hallo Kumpel

Vielen Dank für das Teilen deines Codes. Ja, ich habe ihn getestet. Es funktioniert gut

Ziwox Forex Daten API

 
Nikolai Semko #:

Umstellung auf Binärformat. Die Größe der gleichen Daten beträgt jetzt 1,2 Mb. Das Parsen in die erforderlichen Arrays von Strukturen dauert jetzt 5 Millisekunden.

Das ist ein bisschen zu viel für Sie. Hier dauert es 12 ms, aber die Daten sind 80 MB groß.