2026-07-24 14:20:14 -05:00 | | | //+------------------------------------------------------------------+
|
| | | //| JPath.mq5 |
|
| | | //| Copyright 2026, Niquel Mendoza |
|
| | | //| https://www.mql5.com |
|
| | | //+------------------------------------------------------------------+
|
| | | #property copyright "Copyright 2026, Niquel Mendoza"
|
| | | #property link "https://www.mql5.com"
|
| | | #property version "1.00"
|
| | | #property strict
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
2026-09-03 11:13:49 -05:00 | | | #include "..\\Src\\Json.mqh"
|
2026-07-24 14:20:14 -05:00 | | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| |
|
| | | //+------------------------------------------------------------------+
|
| | | void JsonPathSize(TSN::CSLDomQueryVm* state)
|
| | | {
|
| | | TSN::CDomNodeBase* ptr = state.FReadNode(0);
|
| | | state.FPushInteger(ptr.Size());
|
| | | }
|
| | |
|
| | | //+------------------------------------------------------------------+
|
| | | //| Script program start function |
|
| | | //+------------------------------------------------------------------+
|
| | | void OnStart()
|
| | | {
|
| | |
|
| | | //---
|
| | | const string json = "{\n"
|
| | | "\"libros\":{\n"
|
| | | "\"libro1\": {\"valor\":542,\"sumando\":[],\"comando\":30},\n"
|
| | | "\"libro2\": {\"valor\":19,\"sumando\":[30],\"comando\":2},\n"
|
| | | "\"libro3\": {\"valor\":452,\"sumando\":[20,50,65,89,419],\"comando\":7}\n"
|
| | | " }\n"
|
| | | "}";
|
| | |
|
| | | //---
|
| | | TSN::CJsonParser parser;
|
| | | parser.Assing(json);
|
| | | parser.CorrectPadding();
|
| | | parser.Parse();
|
| | |
|
| | | //---
|
| | | TSN::CDomNodeManager manager;
|
| | | TSN::CDomNodeBase node(&manager);
|
| | | parser.GetRoot().ToDom(&node, &manager);
|
| | |
|
| | | //---
|
| | | TSN::CSLDomQueryVm vm;
|
| | | vm.SetFunction("size", JsonPathSize);
|
| | |
|
| | | // $.libros[?(@.comando * 20 < @.valor && @.sumando.size()].sumando[*]
|
| | | const string asm =
|
| | | "%reg 0 = 20 \n"
|
2026-07-24 21:59:25 -05:00 | | | "%reg 1 = 1\n"
|
2026-07-24 14:20:14 -05:00 | | | "INS_ACCESO_KEY_F K\"libros\"\n"
|
| | | "INS_INICIAR_ITERACION 1 ; Solo se permiten objetos en esta iteracion\n"
|
| | | "@Iteracion: ; Jump aqui\n"
|
| | | " INS_ITER_ASSING 'Final' ; En caso falle salta a Final y terminamos .. \n"
|
| | | " INS_ACCESO_KEY 'Iteracion' K\"comando\" ; Accedemos a comando \n"
|
| | | " INS_SAVE 256 'Iteracion' ; Lo guardamos en el registro 256 si falla reset\n"
|
| | | " INS_M_MUL 256 0 256 'Iteracion' ; Mulñtiplicamos el registro 256 por el 0 y lo guardamos en 256\n"
|
| | | " INS_ACCESO_KEY 'Iteracion' K\"valor\" ; Accede a valor\n"
|
| | | " INS_SAVE 257 'Iteracion'; Guardamos su valor actual\n"
|
| | | " INS_COMPARE_MENOR 256 257 1 'Iteracion' ; Comparamos registros\n"
|
| | | " INS_ACCESO_KEY 'Iteracion' K\"sumando\" ; Accedemos a sumando \n"
|
| | | " INS_SAVE_NO_RESET 256 'Iteracion'; guadcamos en sumand\n"
|
| | | // Nota que aqui el resultado se pondra apartir del 258 reg dado qeu el 257 se pone auto
|
| | | // el numero de parametros escritos...
|
| | | " INS_CALL 256 1 'size'; LLamamos a la funcino size y sus parametros emppizan en 256 y tiene 1 parametro a leer\n"
|
| | | // Nota que esta verirficacion quizas no haga falta.. aunque si esperamos exactamentwe N parameotrs
|
| | | // o digamos 1 quizas si si no se nos desalinea... nuestra lecutra.. auqnue quizas nos podemos saltar a cierta
|
| | | // direccion daod que sabemos que tenemos n parmaeotrs en el reg 257
|
2026-07-24 14:24:42 -05:00 | | | // A futuro si veo que se requiere separar o casos mas complejos como iterar sobre los parametros obtenidos
|
| | | // ahi si si usariosm offsets... ahi quizas lo agrego no es complejo es cosa de cambiar layort y nueva sintaxis de asm
|
| | | // pero ya eso creo que tiraraimso ya a una vm casi de un lenguaje solo faltura stack frames y ya por que en teoria
|
| | | // ahora mismo podemos tener varaibles, bucles, con los ifs, etc...
|
2026-07-24 14:20:14 -05:00 | | | " INS_COMPARE_EQ 257 1 1 'Iteracion' ; Verificamos que el numero de retornanos es 1\n"
|
| | | " INS_COMPARE_IS 258 'Iteracion' 1 ; Usamos is para comprar su valor\n"
|
| | | " ; Si llegamos hasta aqui pasamos todo entonces copy all\n"
|
| | | " INS_COPY_ALL 'Iteracion' \n"
|
| | | " INS_JUMP 'Iteracion'; Ahora nos dirigimos devuelva a iteracion \n"
|
| | | "@Final: \n"
|
| | | " INS_SALIDA ; salimos"
|
| | | ;
|
| | |
|
| | | //---
|
| | | vm.Assing(asm);
|
| | | vm.CorrectPadding();
|
2026-07-24 21:59:25 -05:00 | | | vm.CompileAsm();
|
| | | vm.LockValues();
|
| | | vm.BaseNode(&node);
|
| | |
|
| | | //---
|
2026-07-24 14:20:14 -05:00 | | | vm.Summary();
|
2026-07-24 21:59:25 -05:00 | | |
|
| | | //---
|
| | | TSN::CDomNodeBase* elements[];
|
| | | vm.Run(elements);
|
| | |
|
| | | //---
|
| | | const int t = vm.m_el_s;
|
| | | for(int i = 0; i < t; i++)
|
| | | {
|
| | | Print(elements[i].ToInt(0));
|
| | | }
|
| | |
|
| | | //---
|
| | | /*
|
| | | JPath (EURUSD,M1) 20
|
| | | JPath (EURUSD,M1) 50
|
| | | JPath (EURUSD,M1) 65
|
| | | JPath (EURUSD,M1) 89
|
| | | JPath (EURUSD,M1) 419
|
| | | */
|
2026-07-24 14:20:14 -05:00 | | | }
|
| | | //+------------------------------------------------------------------+
|