Bibliotheken: JSON Serialization and Deserialization (native MQL) - Seite 8

 
o_o:

Die Bibliothek funktioniert in MQL4 und MQL5

Dankbarkeit wird in Form von Beispielen Ihrer praktischen Arbeit mit den Webressourcen von MQL angenommen ;)


Guten Tag!

Ich danke Ihnen für die Bibliothek!

Ich habe Ihre Bibliothek verwendet, um die Arbeit von Computern zu überwachen, die mit einem Pool für das Mining von Kryptowährungen verbunden sind.

Der Pool (seine Website) gibt als Antwort auf eine Statusabfrage eine Antwort in der Form:

/*

{"status": "OK",

"data":[

{"worker": "riga1", "lastSeen":1511432055, "currentHashrate":2746.6666666666665,"validShares":103,"invalidShares":0,"staleShares":null},

{"worker":"riga2","lastSeen":1511432068,"currentHashrate":3040,"validShares":114,"invalidShares":1,"staleShares":null},

{"worker":"riga3","lastSeen":1511432057,"currentHashrate":2426.6666666666665,"validShares":91,"invalidShares":0,"staleShares":null},

{"worker":"riga4","lastSeen":1511432055,"currentHashrate":2266.6666666666665,"validShares":85,"invalidShares":0,"staleShares":null},

{"worker":"riga5","lastSeen":1511432061,"currentHashrate":2666.6666666666665,"validShares":100,"invalidShares":0,"staleShares":null},

{"worker":"riga6","lastSeen":1511432050,"currentHashrate":2293.3333333333335,"validShares":86,"invalidShares":0,"staleShares":null},

{"worker":"riga7","lastSeen":1511432069,"currentHashrate":1013.3333333333334,"validShares":38,"invalidShares":0,"staleShares":null}]}

*/

riga1, riga2, etc. - Das sind Computer, bei denen wir überwachen müssen, dass ihre "currentHashrate" nicht unter einen Schwellenwert fällt.

Der Code ist sehr einfach:

void Fly_API_Monitor()
{

int res=0; string url;  string cook=""; string ref=""; string res_header=""; 
char result[]; 
char data[];
string strRes="";
// Тут вписывается свой кошелек
string wallet="t1L8S ............";
ResetLastError();
url="https://api-zcash.flypool.org/miner/" + wallet + "/workers/monitor"; 
res=WebRequest("GET", url, cook, ref, 5000, data,0, result, res_header);
strRes=CharArrayToString(result,CP_ACP);
if (res !=-1)
{
//Drucken("Kein Fehler");
//Drucken(strRes);
CJAVal dataM;
dataM.Deserialize(strRes);
string stat=dataM["status"].ToStr();
int i=0;
for(i=0; i< ArraySize(dataM["data"].m_e); i++) 
{ 
Print(dataM["data"].m_e[i]["worker"].ToStr()+" Hashrate: "+ dataM["data"].m_e[i]["currentHashrate"].ToStr());
}
}
else 
{
Print("Fehler"+IntegerToString(GetLastError()));
Print(strRes);
}
}

Ausgaben wie:

riga7 Hashrate: 826.6666

riga6 Hashrate: 2293.333

riga5 Hashrate: 3200.

riga4 Hashrate: 1866.666

riga3 Hashrate: 2800

riga2 Hashrate: 2853.333

riga1 Hashrate: 2933.333


 

Vielen Dank an die Entwickler der Bibliothek, aber es funktionierte sehr langsam, in der Regel, bevor Sie ein Produkt oder Code, sollte es profiliert werden, aber in diesem Fall, da die Bibliothek kostenlos ist, gibt es keinen Grund zu klagen, die Bibliothek arbeitet sehr langsam, wenn Sie dies nicht tun:

было:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // Hinzufügen
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1); return GetPointer(m_e[c]); } // Hinzufügen

стало:

        virtual CJAVal* AddBase(const CJAVal &item) { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); m_e[c]=item; m_e[c].m_parent=GetPointer(this); return GetPointer(m_e[c]); } // Hinzufügen
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); return GetPointer(m_e[c]); } // Hinzufügen

Ansonsten ist hier, was vorher war (die Web-Anfrage selbst auf diesem Bildschirm dauerte 16.718.439 in der Zeit, der ganze Rest der Verarbeitung):

und nach der Optimierung (der Pfeil zeigt die gleiche Web-Anfrage):

Der Geschwindigkeitszuwachs war fast 20 Mal schneller.

 
Daniil Kurmyshev:

Warum 50.000?

und nicht 20.000.000 oder 100.000?

--

Welche Art von Testdaten haben Sie verwendet?

 

auf die Daten, die insgesamt stellt sich heraus, von 10000 - 30000, aus diesem Grund wählte ich 50000 mit einer Reserve), aber früher habe ich diese Bibliothek auf Werte von etwa 280 in das Array, in dieser Version und 500 ist genug, 50000 ist sicherlich für diejenigen, die die Ressourcen des Systems ermöglichen.

 

Der Dokumentation zufolge reduziert der Reservierungsparameter lediglich die Anzahl der Neuzuweisungen von Speicherplatz.

Bitte prüfen Sie an Ihrem Testbeispiel mit dem Parameter 100 (1000, 10000)

wie hoch der Geschwindigkeitsgewinn in diesem Fall auf dem Profiling-Bildschirm sein wird

 
o_o:

Der Dokumentation zufolge reduziert der Reservierungsparameter lediglich die Anzahl der Neuzuweisungen von Speicherplatz.

Bitte prüfen Sie Ihr Testbeispiel mit dem Parameter 100 (1000, 10000)

wie hoch ist der Geschwindigkeitsgewinn auf dem Profiling-Bildschirm?


Ja, genau so ist es, ich habe persönlich den optimalen Parameter für die Umverteilung gefunden, jetzt ist die längste Funktion von allen die Deserialisierung..., aber es ist im Prinzip klar, obwohl in der Idee, wie ich in dieser Bibliothek verstehe, alles durch Methoden der Suche und der maximalen Universalität gemacht wird, aber ich denke immer noch, dass es irgendwo in der Deserialisierung eine Nuance gibt, die optimiert werden kann.... Ich habe einen Screenshot von Profiling, Speicher Reallocation Parameter 5000 beigefügt.


 

1.12

Schritt 100 in ArrayResize setzen

Dateien:
JAson.mqh  31 kb
 
Beachten Sie, dass der Profiler mit nicht optimiertem Code arbeitet.

Daher werden Engpässe bei der Neukompilierung in einem Release nach einer sehr guten Optimierung in ganz andere Bereiche verlagert.

Wir werden zu einem späteren Zeitpunkt versuchen, die Semi-Release-Optimierung für den Profiler zu nutzen. Hier gibt es eine ganze Reihe von Problemen.
[Gelöscht]  
Hallo, danke für diese native MQL und schnelle Bibliothek, es wird mehr hilfreich sein, wenn es eine Dokumentation, speziell bei der Arbeit mit JSON-Arrays und Objekte, wie man Daten aus ihnen zu extrahieren:
Angenommen:
[[0.88678,true],[0.88668,false]]
Wie kann ich dies auf MQL-Typen nach Deserialize abbilden?

 

Liebe Fachleute! Bitte helfen Sie mir, die Bibliothek zu verstehen. (Ich bin noch nicht gut in objektorientierter Programmierung, daher kann ich den Code der Bibliothek selbst und den Artikel, der dem BTC-E-Austausch gewidmet ist, nicht verstehen. Deshalb bitte ich um ein einfaches Beispiel wie im Beitrag ).

Ich muss zwei öffentliche Api der WEX.NZ-Börse parsen.

https://wex.nz/api/3/info

{
  "server_time": 1519120845,
  "pairs": {
    "btc_usd": {
      "decimal_places": 3,
      "min_price": 0.1,
      "max_price": 500000,
      "min_amount": 0.001,
      "hidden": 0,
      "fee": 0.2
    },
    "btc_rur": {
...

Von hier aus muss ich alle verfügbaren Paare (btc_usd, btc_rur, ...) in ein Array übertragen (nur die Namen der Paare, ohne Parameter, ich kann die Parameter durch bekannte Namen erhalten...).


https://wex.nz/api/3/depth/btc_usd

{
  "btc_usd": {
    "asks": [
      [
        11550,
        0.00998
      ],
      [
        11559.9,
        0.01731136
      ],
...
      ]
    ],
    "bids": [
      [
        11506.031,
        1.756
      ],
      [
        11506.03,
        1.23
      ],
...
      ]
    ]
  }
}


und von hier aus in zwei Arrays (asks und bids), um den Preis und den Wert der Aufträge zu erhalten.

Ich werde sehr dankbar für Hilfe sein!!! Vielen Dank im Voraus!