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

[Excluído]  

Essa biblioteca causa ERRO e eu confirmei isso

ERR_WRONG_STRING_PARAMETER
 
5040
 
Damaged parameter of string type
 

meu código

CJAVal  jv;
string text="abc";

jv.Deserialize(text);

Alguma ideia de como corrigi-lo?

Isso só acontece quando eu desarquivo qualquer string

 

Se o valor da cadeia de caracteres contiver o caractere ';', a desserialização falhará!

array out of range in 'JAson.mqh' (205,13)

 
Dmitry Zhakov

Tudo funciona. Encontrei o problema do meu lado.

 
Obrigado. Estou enviando WebRequests POST (http) do MT5 (MQL5) para o Chat GPT-4-o-mini API (openai.com). O OpenAI recebe dados JSON. O MQL não suporta JSON. Portanto, tive que converter a string em string e, em seguida, convertê-la em uma matriz Char[], para inserir como postData no WebRequest. Estou usando sua biblioteca.
 
Philip Kym Sang Nelson #:
Obrigado. Estou enviando WebRequests POST (http) do MT5 (MQL5) para a API do Chat GPT-4-o-mini (openai.com). O OpenAI recebe dados JSON. O MQL não oferece suporte a JSON. Portanto, tive que converter a string em string e, em seguida, convertê-la em uma matriz Char[], para inserir como postData no WebRequest. Estou usando a sua biblioteca, vou informá-lo sobre o resultado

Isso é fantástico
Eu estava pensando o mesmo para alimentar meu ML com a resposta do ChatGPT.
Você poderia compartilhar como fez isso? Quais são os desafios?

Obrigado!

 
Funciona perfeitamente Kudos :) Confira meu post sobre como usar a classe CJVAL para analisar dados json Extraindo dados específicos de respostas JSON no MetaTrader 5
Trading blogs and financial markets analysis
Trading blogs and financial markets analysis
  • www.mql5.com
Read blogs to find the latest news on various topics from all over the world — rumors about companies, country and industry reports, market analysis, latest developments in speculative trading and more. Start your own blog to share new ideas and trading achievements with the members of MQL5.community. Post interesting images and videos, enjoy unlimited possibilities!
 

Olá, existe alguma maneira de:

- Definir o valor de uma chave como nulo

- Definir o valor de uma chave como {} (objeto vazio)

Parece que esses valores não serão representados corretamente se você tentar defini-los.

Obrigado pela resposta

 

O que estou fazendo de errado?
Um exemplo real da prática. Uma string com mais de 21 mil caracteres. Diversas variáveis e 2 matrizes grandes b e a. Há 500 subarranjos de 2 elementos em cada um:

"b":[["0.0018659","8500"],["0.0018655","16800"],...],
"a":[["0.0018659","8500"],["0.0018655","16800"],...],


Encontrei uma discrepância entre os dados originais e os dados gerados pelo JASON:

["0.0019640","800"],["0.0019641","91500"],["0.0019644","96600"],["0.0019645","503900"],["0.0019646","101600"],
["0.0019649","500"],["0.0019650","300"],["0.0019651","1200"],["0.0019652","500"],["0.0019653","800"]],
n=2000
[ 0]      0.0018659,  8500.0000000,     0.0018655, 16800.0000000,     0.0018654,153000.0000000,     0.0018653,  3800.0000000,     0.0018650,   300.0000000
[10]      0.0018649,   900.0000000,     0.0018647,  2900.0000000,     0.0018645,  6700.0000000,     0.0018644, 33700.0000000,     0.0018640,  9600.0000000
[ 0]     0.0019640,  200.0000000,    0.0019641,25600.0000000,    0.0019644, 3000.0000000,    0.0019645, 3800.0000000,    0.0019646,  200.0000000
[10]     0.0019649, 3600.0000000,    0.0019650,  700.0000000,    0.0019651,  200.0000000,    0.0019652,  700.0000000,    0.0019653,  100.0000000

as duas primeiras linhas mostram o final da string original, que é analisada pelo JASON.
Ao analisar, todos os elementos são gravados na matriz. Ele obtém n=2000 elementos. Isso está correto.
Em seguida, 2 linhas são os primeiros 20 elementos da matriz e mais 2 linhas são os últimos 20 elementos.
No início da matriz, tudo coincide.
Mas, no final, o primeiro dígito dos pares coincide, mas o segundo não. Aparentemente, ele foi retirado de outro lugar.

Eu verifiquei. A segunda matriz a contém dados da primeira matriz b. Aqui está o final dos dados originais do array a:

,["0.0017785","200"],["0.0017784","3600"],["0.0017783","700"],["0.0017782","200"],["0.0017781","700"],["0.0017780","100"]],

Ou seja, o segundo array em subarrays nos primeiros elementos contém seu valor /direito, nos segundos elementos - valores do primeiro array.
O problema provavelmente está no código do analisador.

A substituição de dados é muito estressante - como testá-los mais tarde? Somente incorretamente! Foi uma sorte você ter notado isso. Esperamos que as variantes mais simples, sem matrizes aninhadas, funcionem corretamente. Mas você deve testar tudo antes de colocá-lo em prática.

O código é baseado nos exemplos da ramificação, apenas com a minha string de dados:

 void TestJAson(string msg) {
   CJAVal json; 
   json.Deserialize(msg);
   double bin[];int n=0;
   int s=ArraySize(json["data"]["b"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["b"][i][0].ToDbl(); n++;//preço
      bin[n]=json["data"]["b"][i][1].ToDbl();; n++;//volume
   }

   s=ArraySize(json["data"]["a"].m_e);
   ArrayResize(bin, n+s*2, 100000);
   for(int  i=0; i<s; i++){
      bin[n]=json["data"]["a"][i][0].ToDbl(); n++;//preço
      bin[n]=json["data"]["b"][i][1].ToDbl(); n++;//volume
   }
   
   Print(StringSubstr(msg,StringLen(msg)-300,300));
   
   int tot=ArraySize(bin);
   Print("n=",tot);
   ArrayPrint(bin,7,",",0,20);
   ArrayPrint(bin,7,",",tot-20,20);
}

void OnStart(){
   ulong from=GetMicrosecondCount();
   TestJAson(message);
   ulong to=GetMicrosecondCount();
   PrintFormat("MQL %lu mcs/iteration",(to-from));
}

O código completo do script com essa string está anexado.
Biblioteca da versão mais recente "1.13" - baixada do GitHub.

Arquivos anexados:
3.mq5  53 kb
 

Acima também escrevem sobre problemas com o segundo elemento. Provavelmente o mesmo problema.

Eu mesmo fiz uma análise de dados para um modelo específico, por meio da divisão por aspas " com a seleção subsequente de elementos por número.

Menos - para cada modelo, será necessário gastar tempo e escrever seu próprio analisador e contar o número de elementos...
Mais - JASON universal e conveniente 3 vezes mais rápido. Em vez de 40 segundos, 13 nos dados iniciais de ~400 Mb.

Passei metade de um dia trabalhando nisso.
Mais precisamente em três versões:
1) primeiro, procurei substrings específicas na matriz de caracteres e, em seguida, montei cadeias de caracteres a partir de seus valores - presumi que esse seria o código mais rápido
Eu queria trabalhar diretamente com a matriz de caracteres, porque tenho a matriz original do WebRequest ou FileOpen e não queria montá-la em uma grande cadeia de caracteres para aumentar a velocidade.
2) em seguida, a partir de char[], criei cadeias de caracteres somente com matrizes b e a - e as dividi
3) e, finalmente, o código mais simples - cada cadeia de caracteres foi reunida em uma grande cadeia de texto (com todos os dados, inclusive os desnecessários) e a dividi

Verificou-se que todas as três variantes têm aproximadamente a mesma velocidade. Por isso, optei pela mais simples, a terceira variante. Será mais fácil modificá-la posteriormente para outros modelos com outros dados.

Por alguma razão, pensei que trabalhar com uma matriz de caracteres seria mais rápido do que montá-la em uma string e dividi-la em uma matriz de string por meio de ". Aparentemente, a divisão é bem otimizada em termos de velocidade.

Seria bom se os desenvolvedores do MQ adicionassem alguns dos analisadores JSON padrão à linguagem. O JASON não analisa todas as variantes corretamente e, aparentemente, o desenvolvedor não está mais aqui e não há esperança de uma correção.
 
Forester #:
Biblioteca da versão mais recente "1.13" - baixada do GitHub

Há uma bifurcação reescrita do código deste tópico (1.12). Você verificou com o original?

PS: Tenho a versão 1.12 original e bastante corrigida. Não me lembro de onde vieram as correções, provavelmente desta ramificação.