Библиотеки: TradeTransactions - страница 8

 
ifffrt #:
Даже после внесения этого изменения ошибка не исчезла, извините.

Скачайте каждый файл отдельно от русской версии кодовой базы.

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

Здравствуйте, 

Подскажите пожалуйста, застрял на одном моменте. Сделал 2 советника, один сохраняет данные, второй их считывает. У меня проблема с обнаружением ресурса.

Этот код сохраняет данные и из него я могу обратиться к ним и прочесть их:

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

}

А этот код считывает данные и каждый раз пишет, что ничего нет:

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

//---

   }

Вроде все делаю по аналогии, но почему-то не отображается никакая информация из той, что записывал, ни массив string типа, ни единичный string который получаю из своей структуры

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

Вроде все делаю по аналогии, но почему-то не отображается никакая информация из той, что записывал, ни массив string типа, ни единичный string который получаю из своей структуры

Не запускал, но предполагаю, что дело в этом.

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

Попробуйте у себя так.

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

Не запускал, но предполагаю, что дело в этом.

Попробуйте у себя так.

Здравствуйте, спасибо, что написали

Сразу пробовал, тк об этом писалось здесь ранее. Перебрал варианты исправления как в имени для обращения, также поправил в "ResourceData.mqh". К сожалению не помогло. Пока не нашел причину

 
Сверил имя ресурса с помощью  Print("Full Name: ",Resource.GetFullName()); имя беру корректное, варианты пути TERMINAL_PATH и TERMINAL_DATA_PATH попробовал оба - итог пока тот-же
 

Создаю ресурс:

а - через библиотеку

б - вручную(ResourceCreate)

Обращаюсь к данным ресурса из другого советника с использованием одного и того-же имени ресурса:

а - через библиотеку

б - вручную(ResourceReadImage)

Итог:

Созданный через библиотеку ресурс не находится ни вручную ни через библиотеку

Созданный вручную ресурс находится и считывается вручную, но не находится через библиотеку.

 
Alexander #:

Созданный через библиотеку ресурс не находится ни вручную ни через библиотеку

Созданный вручную ресурс находится и считывается вручную, но не находится через библиотеку.

Через библиотеку работает.

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

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

void OnStart()
{    
  // Произвольные данные для примера
  string Str[] = {"123", "Hello World!"};
  double Num = 5;
  MqlTick Tick = {0};
  Tick.bid = 1.23456;

  const RESOURCEDATA<uint> Resource("::ResoC"); // Ресурс для обмена данными
  CONTAINER<uint> Container;         // Создаем контейнер - все будет храниться в массиве простого типа (в примере выбран uint)
  
  // Заполняем контейнер разными данными
  Container[0] = Str;
  Container[1] = Num;
  Container[2] = Tick;
    
  // Распечатаем типы хранимых в контейнере данных
  for (int i = 0; i < Container.GetAmount(); i++)
    PRINT(Container[i].GetType())

  Resource = Container.Data;  // Отправили данные на обмен
  
  CONTAINER<uint> Container2; // Сюда будем получать данные

  const RESOURCEDATA<uint> Resource2(Resource.GetFullName()); // Ресурс для обмена данными
  
  Resource2.Get(Container2.Data); // Получили данные
      
  // Получим данные в исходном виде
  string Str2[];
  Container2[0].Get(Str2);                // Получили массив
  ArrayPrint(Str2);

  PRINT(Container2[1].Get<double>())      // Получили число
  PRINT(Container2[2].Get<MqlTick>().bid) // Получили структуру  
}


Почему Ваш исходный пример не работает - пока не знаю.

 
fxsaber #:

Почему Ваш исходный пример не работает - пока не знаю.

Если все остальное правильно написано, то это поможет.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Библиотеки: TradeTransactions

Alexander, 2025.09.15 21:09

void OnTimer()
{    
  // ....
  static const RESOURCEDATA<uint> Resource("::ResoC"); // Ресурс для обмена данными
  // ....
}

Вы создавали объект на каждом входе в OnTimer и, соответственно, убивали его - на выходе. Поэтому ресурс жил микросекунды и не находился со стороны.

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

До чего-же очевидный момент, мимо которого я смотрел уже как 2 дня не замечая его в упор)

Спасибо Вам большое!


Все идеально работает, возможность обмениваться пользовательскими структурами между алгоритмами с помощью Вашей библиотеки - огромное подспорье для моей торговли, снимаю шляпу!