Por favor, ayúdame, estoy atascado en un punto. Hice 2 EAs, uno guarda los datos, el otro los lee. Tengo un problema con el descubrimiento de recursos.
Este código guarda los datos y desde él puedo acceder a ellos y leerlos:
const RESOURCEDATA<uint> Resource("\Terminal\99A739E3DB06068691C851DE1765F329\MQL5\Experts\ZC\Conections\Draft4.ex5::ResoC"); // Ресурс для доступа к данным (только для чтения) из другой программы
CONTAINER<uint> Container4; // Сюда будем получать данные
Resource.Get(Container4.Data); // Считали данные из ресурса.
for (int i = 0; i < Container4.GetAmount(); i++)
Print("i==",i);
string Str4;
Container4[0].Get(Str4); // Получили массив
Print("Test!!!"+Str4);
Print(Str4);
//---
}
Parece que hago todo por analogía, pero por alguna razón no veo ninguna información de lo que escribí, ni un array de tipo cadena, ni una sola cadena que obtengo de mi estructura
Parece que hago todo por analogía, pero por alguna razón no se muestra ninguna información de la que escribí, ni un array de tipo cadena, ni una sola cadena que obtengo de mi estructura.
No lo he ejecutado, pero supongo que este es el caso.
Probado de inmediato, ya que se ha escrito aquí antes. Fui a través de las opciones de fijación tanto en el nombre a la dirección, también se corrige en "ResourceData.mqh". Desafortunadamente no ayudó. No he encontrado la causa todavía
He comprobado el nombre del recurso usando Print("Full Name: ",Resource.GetFullName()); Tomo el nombre correcto, he probado ambas variantes de ruta TERMINAL_PATH y TERMINAL_DATA_PATH - el resultado es el mismo.
Cuando uso ResourceReadImage(FullNameCorrect,Arr,width,height)) directamente, puedo aceptar datos de un recurso creado por otro EA, todo funciona correctamente. Cuando se accede al mismo nombre de recurso a través de funciones de biblioteca (similar a la adjunta arriba) - los datos no son aceptados.
Informaré más adelante cuando encuentre cuál era el problema.
Un recurso creado a través de la biblioteca no se encuentra ni manualmente ni a través de la biblioteca
Un recurso creado manualmente se localiza y se lee manualmente, pero no se localiza a través de la biblioteca.
Funciona a través de la biblioteca.
#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/es/code/22166#define PRINT(A) Print(#A + " = " + (string)(A));
voidOnStart()
{
// Datos arbitrarios para el ejemplostring Str[] = {"123", "Hello World!"};
double Num = 5;
MqlTick Tick = {0};
Tick.bid = 1.23456;
const RESOURCEDATA<uint> Resource("::ResoC"); // Recurso para compartir datos
CONTAINER<uint> Container; // Crear un contenedor - todo será almacenado en un array de un tipo simple (uint es el elegido en el ejemplo)// Llenar el contenedor con datos diferentes
Container[0] = Str;
Container[1] = Num;
Container[2] = Tick;
// Imprimir los tipos de datos almacenados en el contenedorfor (int i = 0; i < Container.GetAmount(); i++)
PRINT(Container[i].GetType())
Resource = Container.Data; // Enviar los datos para su intercambio
CONTAINER<uint> Container2; // Aquí es donde obtendremos los datosconst RESOURCEDATA<uint> Resource2(Resource.GetFullName()); // Recurso para compartir datos
Resource2.Get(Container2.Data); // Tengo los datos// Obtener los datos en su forma originalstring Str2[];
Container2[0].Get(Str2); // Obtenido el arrayArrayPrint(Str2);
PRINT(Container2[1].Get<double>()) // Tenemos un número
PRINT(Container2[2].Get<MqlTick>().bid) // Tenemos la estructura
}
Usted creó un objeto en cada entrada a OnTimer y, en consecuencia, lo mató - en la salida. Es por eso que el recurso vivió durante microsegundos y no estaba en el lado.
class RESOURCE
{
public:
~RESOURCE( void)
{
::ResourceFree(this.Name);
}
Qué punto tan obvio, que pasé por alto durante 2 días sin darme cuenta)
¡Muchas gracias!
¡Todo funciona perfectamente, la posibilidad de intercambiar estructuras personalizadas entre algoritmos utilizando su biblioteca es una gran ayuda para mi comercio, me quito el sombrero!
El mismo error seguía apareciendo incluso después de hacer ese cambio, lo siento.
Descargar cada archivo por separado de la versión rusa de la base de código.
Hola,
Por favor, ayúdame, estoy atascado en un punto. Hice 2 EAs, uno guarda los datos, el otro los lee. Tengo un problema con el descubrimiento de recursos.
Este código guarda los datos y desde él puedo acceder a ellos y leerlos:
#include "ResourceData.mqh" // https://www.mql5.com/es/code/22166
#define PRINT(A) Print(#A + " = " + (string)(A));
struct ExampleStruct
{
string ea_name;
string symbol;
string direction;
string time_for_command;
};
ExampleStruct qexamplestruct[2];
int OnInit(void)
{
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
void OnTimer()
{
// Произвольные данные для примера
string Str[] = {"123", "Hello World!"};
qexamplestruct[0].direction="buy";
qexamplestruct[0].ea_name="TestEAname";
qexamplestruct[0].symbol="EURUSD";
qexamplestruct[0].time_for_command="01.01.2021";
string stringtosend = Serialize(qexamplestruct[0]);
const RESOURCEDATA<uint> Resource("::ResoC"); // Ресурс для обмена данными
CONTAINER<uint> Container; // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)
Container[0] = Str;
Container[1] = stringtosend;
const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_PATH)) + 5) + "::ResoC";
Print(NameOut); // Вывели полное имя ресурса.
Resource = Container.Data; // Отправили данные на обмен
//---
}
string Serialize(const ExampleStruct &s)
{
return s.ea_name + "\n" + s.symbol + "\n" + s.direction + "\n" + s.time_for_command;
}
ExampleStruct Deserialize(const string &line)
{
string parts[];
StringSplit(line, '\n', parts);
ExampleStruct s;
if(ArraySize(parts) > 0) s.ea_name = parts[0];
if(ArraySize(parts) > 1) s.symbol = parts[1];
if(ArraySize(parts) > 2) s.direction = parts[2];
if(ArraySize(parts) > 3) s.time_for_command = parts[3];
return s;
}
Y este código lee los datos y cada vez escribe que no hay nada:
#include "ResourceData.mqh" // https://www.mql5.com/es/code/22166
#define PRINT(A) Print(#A + " = " + (string)(A));
int OnInit(void){return(INIT_SUCCEEDED);}
void OnTick()
{
const RESOURCEDATA<uint> Resource("\Terminal\99A739E3DB06068691C851DE1765F329\MQL5\Experts\ZC\Conections\Draft4.ex5::ResoC"); // Ресурс для доступа к данным (только для чтения) из другой программы
CONTAINER<uint> Container4; // Сюда будем получать данные
Resource.Get(Container4.Data); // Считали данные из ресурса.
for (int i = 0; i < Container4.GetAmount(); i++)
Print("i==",i);
string Str4;
Container4[0].Get(Str4); // Получили массив
Print("Test!!!"+Str4);
Print(Str4);
//---
}
Parece que hago todo por analogía, pero por alguna razón no veo ninguna información de lo que escribí, ni un array de tipo cadena, ni una sola cadena que obtengo de mi estructura
Parece que hago todo por analogía, pero por alguna razón no se muestra ninguna información de la que escribí, ni un array de tipo cadena, ni una sola cadena que obtengo de mi estructura.
No lo he ejecutado, pero supongo que este es el caso.
Pruébalo de esta forma.
No lo he probado, pero supongo que es así.
Pruébelo usted mismo.
Hola, gracias por escribir
Probado de inmediato, ya que se ha escrito aquí antes. Fui a través de las opciones de fijación tanto en el nombre a la dirección, también se corrige en "ResourceData.mqh". Desafortunadamente no ayudó. No he encontrado la causa todavía
He hecho algunos progresos más -
Cuando uso ResourceReadImage(FullNameCorrect,Arr,width,height)) directamente, puedo aceptar datos de un recurso creado por otro EA, todo funciona correctamente. Cuando se accede al mismo nombre de recurso a través de funciones de biblioteca (similar a la adjunta arriba) - los datos no son aceptados.
Informaré más adelante cuando encuentre cuál era el problema.
Estoy creando un recurso
a - a través de la biblioteca
b - manualmente (ResourceCreate)
Accedo a los datos del recurso desde otro EA utilizando el mismo nombre de recurso:
a - a través de la biblioteca
b - manualmente(ResourceReadImage)
Resultado:
El recurso creado a través de la biblioteca no se encuentra ni manualmente ni a través de la biblioteca
Un recurso creado manualmente se encuentra y se lee manualmente, pero no se encuentra a través de la biblioteca.
Un recurso creado a través de la biblioteca no se encuentra ni manualmente ni a través de la biblioteca
Un recurso creado manualmente se localiza y se lee manualmente, pero no se localiza a través de la biblioteca.
Funciona a través de la biblioteca.
No sé por qué tu ejemplo original no funciona todavía.
Por qué tu ejemplo original no funciona, aún no lo sé.
Si todo lo demás está escrito correctamente, ayudará.
Foro sobre trading, sistemas automatizados de trading y testeo de estrategias de trading.
Bibliotecas: TradeTransactions
Alexander, 2025.09.15 21:09
Usted creó un objeto en cada entrada a OnTimer y, en consecuencia, lo mató - en la salida. Es por eso que el recurso vivió durante microsegundos y no estaba en el lado.
estático
Qué punto tan obvio, que pasé por alto durante 2 días sin darme cuenta)
¡Muchas gracias!
¡Todo funciona perfectamente, la posibilidad de intercambiar estructuras personalizadas entre algoritmos utilizando su biblioteca es una gran ayuda para mi comercio, me quito el sombrero!