Bibliotecas: TradeTransactions - página 8

 
ifffrt #:
O mesmo erro ainda foi lançado mesmo depois de eu ter feito essa alteração, desculpe.

Baixe cada arquivo separadamente da versão russa da base de código.

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

Olá,

Por favor, me ajude, estou preso em um ponto. Criei dois EAs, um salva os dados e o outro os lê. Tenho um problema com a descoberta de recursos.

Esse código salva os dados e, a partir dele, posso acessá-los e lê-los:

#include "ResourceData.mqh" // https://www.mql5.com/pt/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;

}

E esse código lê os dados e sempre escreve que não há nada:

#include "ResourceData.mqh" // https://www.mql5.com/pt/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 faço tudo por analogia, mas por algum motivo não vejo nenhuma informação do que escrevi, nem uma matriz do tipo string, nem uma única string que obtenho de minha estrutura

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

Parece que faço tudo por analogia, mas, por algum motivo, nenhuma informação é exibida a partir do que escrevi, nem uma matriz do tipo string, nem uma única string que obtenho de minha estrutura.

Não o executei, mas presumo que seja esse o caso.

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

Tente da seguinte forma.

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

Não o executei, mas presumo que seja esse o caso.

Tente você mesmo.

Olá, obrigado por escrever

Tentei imediatamente, pois isso já foi mencionado aqui antes. Passei pelas opções de correção tanto no nome quanto no endereço, e também corrigi em "ResourceData.mqh". Infelizmente, não ajudou. Ainda não encontrei a causa

 
Verifiquei o nome do recurso usando Print("Full Name: ",Resource.GetFullName()); pego o nome correto, tentei as variantes de caminho TERMINAL_PATH e TERMINAL_DATA_PATH - o resultado é o mesmo.
 

Fiz mais alguns progressos.

Ao usar ResourceReadImage(FullNameCorrect,Arr,width,height)) diretamente, posso aceitar dados de um recurso criado por outro EA, e tudo funciona corretamente. Ao acessar o mesmo nome de recurso por meio de funções de biblioteca (semelhante à anexada acima), os dados não são aceitos.

Farei um relatório mais detalhado quando descobrir qual é o problema.

 

Estou criando um recurso:

a - por meio da biblioteca

b - manualmente (ResourceCreate)

Eu acesso os dados do recurso de outro EA usando o mesmo nome de recurso:

a - por meio da biblioteca

b - manualmente(ResourceReadImage)

Resultado:

O recurso criado por meio da biblioteca não é encontrado nem manualmente nem por meio da biblioteca

Um recurso criado manualmente é encontrado e lido manualmente, mas não é encontrado por meio da biblioteca.

 
Alexander #:

Um recurso criado por meio da biblioteca não é encontrado nem manualmente nem por meio da biblioteca

Um recurso criado manualmente é localizado e lido manualmente, mas não é localizado por meio da biblioteca.

Ele funciona por meio da biblioteca.

#include <fxsaber\TradeTransactions\ResourceData.mqh> // https://www.mql5.com/pt/code/22166

#define  PRINT(A) Print(#A + " = " + (string)(A));

void OnStart()
{    
  // Dados arbitrários para o exemplo
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;

  const RESOURCEDATA<uint> Resource("::ResoC"); // Recurso para compartilhamento de dados
  CONTAINER<uint> Container;         // Crie um contêiner - tudo será armazenado em uma matriz de um tipo simples (no exemplo, foi escolhido uint)
  
  // Preencher o contêiner com dados diferentes
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
    
  // Imprimir os tipos de dados armazenados no contêiner
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Enviou os dados para troca
  
  CONTAINER<uint> Container2; // É aqui que obteremos os dados

  const RESOURCEDATA<uint> Resource2(Resource.GetFullName()); // Recurso para compartilhamento de dados
  
  Resource2.Get(Container2.Data); // Obteve os dados
      
  // Obter os dados em sua forma original
  string Str2[];
  Container2[0].Get(Str2);                // Obteve a matriz
  ArrayPrint(Str2);

  PRINT(Container2[1].Get<double>())      // Temos um número
  PRINT(Container2[2].Get<MqlTick>().bid) // Temos a estrutura 
}


Não sei por que seu exemplo original ainda não funciona.

 
fxsaber #:

Ainda não sei por que seu exemplo original não funciona.

Se todo o resto estiver escrito corretamente, ele ajudará.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Bibliotecas: TradeTransactions

Alexander, 2025.09.15 21:09

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

Você criou um objeto em cada entrada do OnTimer e, consequentemente, o eliminou - na saída. É por isso que o recurso viveu por microssegundos e não estava ao lado.

class RESOURCE
{
public:
  ~RESOURCE( void)
  {
    ::ResourceFree(this.Name);
  }
 
fxsaber #:
estática

Que ponto óbvio, que eu deixei passar por dois dias sem perceber)

Muito obrigado!


Tudo funciona perfeitamente, a capacidade de trocar estruturas personalizadas entre algoritmos usando sua biblioteca é uma grande ajuda para minhas negociações.