Librerías: TradeTransactions - página 8

 
ifffrt #:
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.

TradeTransactions
TradeTransactions
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 

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

TradeTransactions
TradeTransactions
  • 2018.09.06
  • www.mql5.com
Доступ к данным OnTradeTransaction в любом месте программы
 
Alexander #:

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.

  string GetFullName( void ) const
  {
    // Debe ser TERMINAL_DATA_PATH вместо TERMINAL_PATH.
        return((this.GetName()[0] == ':') ? ::StringSubstr(::MQLInfoString(MQL_PROGRAM_PATH), ::StringLen(::TerminalInfoString(TERMINAL_PATH)) + 5) + this.GetName() : this.GetName());
  }

Pruébalo de esta forma.

const string NameOut = StringSubstr(MQLInfoString(MQL_PROGRAM_PATH), StringLen(TerminalInfoString(TERMINAL_DATA_PATH)) + 5) + "::ResoC";
 
fxsaber #:

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 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.
 

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.

 
Alexander #:

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));

void OnStart()
{    
  // Datos arbitrarios para el ejemplo
  string 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 contenedor
  for (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 datos

  const RESOURCEDATA<uint> Resource2(Resource.GetFullName()); // Recurso para compartir datos
  
  Resource2.Get(Container2.Data); // Tengo los datos
      
  // Obtener los datos en su forma original
  string Str2[];
  Container2[0].Get(Str2);                // Obtenido el array
  ArrayPrint(Str2);

  PRINT(Container2[1].Get<double>())      // Tenemos un número
  PRINT(Container2[2].Get<MqlTick>().bid) // Tenemos la estructura 
}


No sé por qué tu ejemplo original no funciona todavía.

 
fxsaber #:

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

void OnTimer()
{    
  // ....
  static const RESOURCEDATA<uint> Resource("::ResoC"); // Recurso para compartir datos
  // ....
}

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);
  }
 
fxsaber #:
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!