//+------------------------------------------------------------------+ //| 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 //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include "..\\Src\\JsonNode.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ 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" "%reg 1 = 1\n" "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 // 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... " 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(); vm.CompileAsm(); vm.LockValues(); vm.BaseNode(&node); //--- vm.Summary(); //--- 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 */ } //+------------------------------------------------------------------+