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

[Eliminado]  

Esta librería causa ERROR y lo he confirmado

ERR_WRONG_STRING_PARAMETER
 
5040
 
Damaged parameter of string type
 

mi código

CJAVal  jv;
string text="abc";

jv.Deserialize(text);

¿Alguna idea de cómo solucionarlo?

Sólo se produce cuando desearilize cualquier cadena

 

Si el valor de la cadena contiene el carácter ';', la deserialización falla.

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

 
Dmitry Zhakov

Todo funciona. He encontrado el problema en mi lado.

 
Gracias . Estoy enviando POST WebRequests (http) de MT5 (MQL5) a Chat GPT-4-o-mini API (openai.com) . OpenAI recibe datos JSON . MQL no soporta JSON . Así que tuvo que cubrir a la cadena, a continuación, convertir la cadena a Char[] matriz, para insertar como postData en el WebRequest . Estoy usando su biblioteca, te haré saber cómo me va
 
Philip Kym Sang Nelson #:
Gracias . Estoy enviando POST WebRequests (http) de MT5 (MQL5) a Chat GPT-4-o-mini API (openai.com) . OpenAI recibe datos JSON . MQL no soporta JSON . Así que tuvo que cubrir a la cadena, a continuación, convertir la cadena a Char[] matriz, para insertar como postData en el WebRequest . Estoy usando su biblioteca, voy a hacerle saber cómo me va

Eso es impresionante
Yo estaba pensando lo mismo para alimentar mi ML con la respuesta de ChatGPT.
¿Te importa compartir cómo lo hiciste? ¿Cuáles son los retos?

¡Gracias!

 
Funciona perfectamente Kudos :) Y'll ir y comprobar mi post sobre cómo utilizar CJVAL clase para analizar datos json Extracción de datos específicos de las respuestas JSON en 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!
 

Hola, ¿hay alguna forma de:

- Establecer el valor de una clave a null

- Establecer el valor de una clave a {} (objeto vacío)

Parece que esos valores no se representan correctamente si intentas establecerlos.

Gracias por cualquier respuesta

 

¿Qué estoy haciendo mal?
Un ejemplo real de la práctica. Una cadena de más de 21 mil caracteres. Varias variables y 2 grandes matrices b y a. Hay 500 subarreglos de 2 elementos en cada uno:

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


He encontrado una discrepancia entre los datos originales y los datos JASON salidas:

["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

las 2 primeras líneas muestran el final de la cadena original, que es analizada por JASON.
Al analizar, todos los elementos se escriben en la matriz. Obtiene n=2000 elementos. Esto es correcto.
Luego 2 líneas son los primeros 20 elementos del array y 2 líneas más de los últimos 20 elementos.
Al principio del array todo coincide.
Pero al final el primer dígito de los pares coincide, pero el segundo no. Aparentemente fue tomado de otro lado.

Lo he comprobado. El segundo array a contiene datos del primer array b. Aquí está el final de los datos originales del array a:

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

Es decir, la segunda matriz en subarrays en los primeros elementos contiene su valor /right, en los segundos elementos - valores de la primera matriz.
El problema está probablemente en el código del analizador.

Sustitución de datos es muy estresante - ¿cómo probar en ellos más tarde? ¡Sólo incorrectamente! Suerte que te diste cuenta. Esperemos que para variantes más simples sin arrays anidados funcione correctamente. Pero usted debe probar todo antes de ponerlo a trabajar.

El código se basa en los ejemplos de la rama, sólo con mi cadena de datos:

 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++;//precio
      bin[n]=json["data"]["b"][i][1].ToDbl();; n++;//volumen
   }

   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++;//precio
      bin[n]=json["data"]["b"][i][1].ToDbl(); n++;//volumen
   }
   
   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));
}

Se adjunta el código completo del script con esta cadena.
Biblioteca de la última versión "1.13" - descargada de GitHub.

Archivos adjuntos:
3.mq5  53 kb
 

Arriba también escriben sobre problemas con el segundo elemento. Probablemente el mismo problema.

Me hice un análisis de datos para una plantilla en particular, a través de la división por comillas " con la posterior selección de elementos por número.

Menos - para cada plantilla tendrá que pasar el tiempo y escribir su propio analizador y contar el número de elementos ...
Plus - 3 veces más rápido universal y conveniente JASON. En lugar de 40 segundos 13 en los datos iniciales ~ 400 Mb.

Pasó la mitad de un día en él.
Más precisamente en 3 versiones:
1) primero busqué subcadenas específicas en char array y luego ensamblado cadenas de sus valores - Supuse que este sería el código más rápido
Yo quería trabajar directamente con char array, porque tengo el original de WebRequest o FileOpen y no quería montar en una cadena grande para la velocidad.
2) luego desde char[] creé cadenas sólo con arrays b y a - y las dividí
3) y finalmente el código más simple - cada cadena fue reunida en una gran cadena de texto (con todos los datos incluyendo los innecesarios) y la dividí

Resultó que las 3 variantes son casi iguales en velocidad. Es por eso que me decidí por el más simple - la 3 ª variante. Será más fácil modificarlo más tarde a otras plantillas con otros datos.

Por alguna razón pensé que trabajar con char array sería más rápido que ensamblarlo en un string y dividirlo en un string array mediante ". Aparentemente split está bien optimizado para la velocidad.

Sería bueno que los desarrolladores de MQ añadieran algunos de los analizadores JSON estándar al lenguaje. JASON no analiza todas las variantes correctamente y aparentemente el desarrollador ya no está y no hay esperanza de un arreglo.
 
Forester #:
Biblioteca de la última versión "1.13" - descargada de GitHub

Hay un fork reescrito del código de este topik (1.12). ¿Has comprobado con el original?

PD: Tengo la 1.12 original y muy corregida. No recuerdo de donde vinieron las correcciones, probablemente de esta rama.