120 lines
4.7 KiB
MQL5
120 lines
4.7 KiB
MQL5
//+------------------------------------------------------------------+
| |
//| 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\\Json.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
| |
*/
| |
}
| |
//+------------------------------------------------------------------+
|