Bibliotecas: JSON Serialization and Deserialization (native MQL) - página 8

 
o_o:

La biblioteca funciona en MQL4 y MQL5

Se aceptan agradecimientos en forma de ejemplos de su trabajo práctico con los recursos web de MQL. ;)


¡Buenas tardes!

¡Gracias por la biblioteca!

He utilizado su biblioteca para supervisar el trabajo de los ordenadores conectados a una piscina para la minería cryptocurrency.

La piscina (su sitio web) en respuesta a una consulta de estado da una respuesta en la forma de:

/*

{"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. - Estos son los ordenadores, tenemos que controlar que su "currentHashrate" no caiga por debajo de un valor umbral.

El código es muy sencillo:

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)
{
//Print("No error");
//Imprimir(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("Error "+IntegerToString(GetLastError()));
Print(strRes);
}
}

salidas como:

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


 

Muchas gracias a los desarrolladores de la biblioteca, pero funcionaba muy lentamente, por lo general antes de poner cualquier producto o código, debe ser perfilado, pero en este caso, ya que la biblioteca es libre, no hay necesidad de quejarse, la biblioteca funciona muy lentamente, si usted no hace esto:

было:

        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]); } // añadir
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1); return GetPointer(m_e[c]); } // añadir

стало:

        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]); } // añadir
        virtual CJAVal* NewBase() { int c=ArraySize(m_e); ArrayResize(m_e, c+1, 50000); return GetPointer(m_e[c]); } // añadir

De lo contrario aquí está lo que era antes (la solicitud Web en sí en esta pantalla tomó 16.718.439 en el tiempo, todo el resto del procesamiento):

y después de ajustar (la flecha muestra la misma solicitud Web):

El aumento de velocidad fue casi 20 veces más rápido.

 
Daniil Kurmyshev:

¿Por qué 50.000?

¿y no 20.000.000 o 100.000?

--

¿qué tipo de datos de prueba utilizó?

 

en los datos, que en total resulta ser de 10000 - 30000, por esta razón elegí 50000 con una reserva), pero antes he utilizado esta biblioteca en los valores de alrededor de 280 en la matriz, en esta versión y 500 es suficiente, 50000 es sin duda para aquellos que tienen los recursos del sistema permiten.

 

según la documentación, el parámetro de reserva simplemente reduce el número de reasignaciones de memoria

por favor, compruebe en su muestra de prueba con el parámetro 100 (1000, 10000)

cuál será la ganancia de velocidad en este caso en la pantalla de perfiles

 
o_o:

según la documentación, el parámetro de reserva simplemente reduce el número de reasignaciones de memoria

por favor, compruebe en su muestra de prueba con el parámetro 100 (1000, 10000)

¿cuál será la ganancia de velocidad en la pantalla de perfiles?


Si es exactamente asi, yo personalmente cogi el parametro optimo de redistribucion, ahora la funcion mas larga de todas es la deserializacion..., pero esta claro en principio, aunque en idea segun tengo entendido en esta libreria todo se hace por metodos de busqueda y maxima universalidad, pero sigo pensando que en alguna parte de la deserializacion hay un matiz que se puede optimizar.... Adjunto pantallazo de perfilado, parámetros de reasignación de memoria 5000.


 

1.12

establecer paso 100 en ArrayResize

Archivos adjuntos:
JAson.mqh  31 kb
 
Tenga en cuenta que el perfilador trabaja sobre código no optimizado.

Por lo tanto, al recompilar en una release después de un optimizador muy bueno, los cuellos de botella irán a zonas completamente diferentes.

Intentaremos utilizar la optimización semiliberada para el perfilador un poco más adelante. Hay bastantes cuestiones problemáticas ahí.
[Eliminado]  
Hola, gracias por este MQL nativo y rápida biblioteca, será más útil si hay una documentación, especial cuando se trabaja con matrices JSON y objetos, cómo extraer datos de ellos:
Supongamos:
[[0.88678,true],[0.88668,false]]
¿Cómo puedo mapear esto a tipos MQL después de Deserializar?

 

Estimados especialistas Por favor, ayúdenme a entender la biblioteca. ( No soy bueno en la programación orientada a objetos todavía, así que no puedo entender el código de la biblioteca en sí y el artículo dedicado al intercambio BTC-E. Es por eso que pido un ejemplo sencillo como en el post ).

Necesito parsear dos api públicas del exchange WEX.NZ.

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": {
...

desde aqui, necesito obtener todos los pares disponibles (btc_usd, btc_rur, ...) en un array (solo nombres de pares, sin parametros, puedo obtener parametros por nombres conocidos...).


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
      ],
...
      ]
    ]
  }
}


y de aqui a dos arrays (asks y bids) para obtener el precio y valor de las ordenes.

¡¡¡Estaré muy agradecido por la ayuda!!! ¡Gracias de antemano!