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
|
|
*/
|
|
}
|
|
//+------------------------------------------------------------------+
|