Bibliotecas: Serialização e desserialização de JSON (MQL nativo) - página 8

 
o_o:

A biblioteca funciona em MQL4 e MQL5

A gratidão é aceita na forma de exemplos de seu trabalho prático com recursos da web da MQL. ;)


Boa tarde!

Obrigado pela biblioteca!

Usei sua biblioteca para monitorar o trabalho de computadores conectados a um pool para mineração de criptomoedas.

O pool (seu site), em resposta a uma consulta de status, fornece uma resposta na 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. - Esses são computadores, precisamos monitorar se o "currentHashrate" deles não está abaixo de um valor limite.

O código é muito simples:

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");
//Print(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("Erro"+IntegerToString(GetLastError()));
Print(strRes);
}
}

saídas 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


 

Muito obrigado aos desenvolvedores da biblioteca, mas ela funcionou muito lentamente. Normalmente, antes de lançar qualquer produto ou código, ele deve ser avaliado, mas, nesse caso, como a biblioteca é gratuita, não há necessidade de reclamar, a biblioteca funciona muito lentamente, se você não fizer isso:

было:

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

стало:

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

Caso contrário, aqui está o que era antes (a própria solicitação da Web nessa tela levou 16.718.439 de tempo, todo o restante do processamento):

e após o ajuste (a seta mostra a mesma solicitação da Web):

O aumento de velocidade foi quase 20 vezes mais rápido.

 
Daniil Kurmyshev:

Por que 50.000?

e não 20.000.000 ou 100.000?

--

Que tipo de dados de teste você usou?

 

nos dados, que no total acabam sendo de 10.000 a 30.000, por isso escolhi 10.000 com uma reserva), mas anteriormente usei essa biblioteca em valores de cerca de 280 na matriz, nessa versão e 500 é suficiente, 10.000 é certamente para aqueles que têm os recursos do sistema permitidos.

 

De acordo com a documentação, o parâmetro de reserva simplesmente reduz o número de realocações de memória

Verifique em sua amostra de teste com o parâmetro 100 (1000, 10000)

qual será o ganho de velocidade nesse caso na tela de criação de perfil

 
o_o:

De acordo com a documentação, o parâmetro de reserva simplesmente reduz o número de realocações de memória

Verifique em sua amostra de teste com o parâmetro 100 (1000, 10000)

qual será o ganho de velocidade na tela de criação de perfil?


Sim, é exatamente assim, eu pessoalmente peguei o parâmetro ideal de redistribuição, agora a função mais longa de todas é a desserialização..., mas, em princípio, está claro, embora na ideia, pelo que entendi nessa biblioteca, tudo seja feito por métodos de pesquisa e universalidade máxima, mas ainda acho que em algum outro lugar na desserialização há uma nuance que pode ser otimizada.... Anexei uma captura de tela da criação de perfil, parâmetros de realocação de memória 5000.


 

1.12

Definir a etapa 100 em ArrayResize

Arquivos anexados:
JAson.mqh  31 kb
 
Observe que o criador de perfil funciona com código não otimizado.

Portanto, ao recompilar em uma versão após um otimizador muito bom, os gargalos irão para zonas completamente diferentes.

Tentaremos usar a otimização de semi-lançamento para o criador de perfil um pouco mais tarde. Há muitas questões problemáticas nesse caso.
[Excluído]  
Olá, obrigado por essa biblioteca MQL nativa e rápida, mas seria mais útil se houvesse uma documentação, especialmente ao trabalhar com matrizes e objetos JSON, sobre como extrair dados deles:
Suponha que:
[[0.88678,true],[0.88668,false]]
Como posso mapear isso para tipos MQL após a desserialização?

 

Prezados especialistas! Por favor, ajudem-me a entender a biblioteca. (Ainda não tenho muita experiência em programação orientada a objetos, por isso não consigo entender o código da biblioteca em si e no artigo dedicado à bolsa BTC-E. É por isso que peço um exemplo simples, como na postagem ).

Preciso analisar duas APIs públicas da bolsa 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": {
...

A partir daqui, preciso obter todos os pares disponíveis (btc_usd, btc_rur, ...) em uma matriz (apenas nomes de pares, sem parâmetros, posso obter parâmetros por nomes conhecidos...).


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


e daqui para duas matrizes (asks e bids) para obter o preço e o valor das ordens.

Ficarei muito grato pela ajuda!!! Desde já, obrigado!