Обмен данными между программами

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Vladimir Pastushak
90161
Vladimir Pastushak  
Интересует возможность обмениваться данными между программами. Как можно быстро передать класс или структуру между советниками ???
fxsaber
16737
fxsaber  

Либо так, либо сяк.


И есть еще такой вариант

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

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

Automated-Trading, 2018.03.29 11:09

  • В исходниках есть кроссплатформенные функции (файл Data_String.mqh), которые позволяют помещать/извлекать любые данные в/из строки. Например, это дает возможность производить удобный обмен произвольными данным между любыми MQL-программами за счет string-параметра (sparam) пользовательских событий;

Но в этом варианте действует ограничение на длину передаваемой структуры.

fxsaber
16737
fxsaber  

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

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

fxsaber, 2018.11.21 10:15

// Отправка данных
#property indicator_chart_window
#property indicator_plots 0

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

const RESOURCEDATA<MqlTick> Resource("::" + __FILE__); // Ресурс для передали данных (тики)

void OnInit()
{
  _GlobalVariableSet("ResourceName", Resource.GetFullName()); // Записали в глобальную переменную полное имя ресурса (read-only)
}

void OnDeinit( const int )
{
  _GlobalVariableDel("ResourceName");
}

int OnCalculate( const int, const int, const int, const double &[] )
{
  MqlTick Ticks[];
  
  CopyTicks(_Symbol, Ticks, COPY_TICKS_ALL, 0, 5); // Сформировали данные
  
  Resource = Ticks; // Записали данные
    
  return(0);
}


// Получение данных
#property indicator_chart_window
#property indicator_plots 0

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

int OnCalculate( const int, const int, const int, const double &[] )
{
  static const RESOURCEDATA<MqlTick> Resource(_GlobalVariableGet<string>("ResourceName")); // Создали ресурс на основе переданного в глобальной переменной полного имени
  
  MqlTick Ticks[];

  Resource.Get(Ticks); // Считали данные из ресурса.
  
  ArrayPrint(Ticks);   // Распечатали полученные данные
  
  return(0);
}
Реter Konow
8671
Реter Konow  

Дикий лес, fxsaber.  Все проще.

Реализовал полноценную связь между программами через EventChartCustom(); Передаю сообщения и массивы между индикаторами и советниками.


Вот пример сборки и отправки сообщения с массивом данных в другую программу:

int OnInit()
  {
   //-------------------------------
   string Данные[1000], Строка = NULL,  Подстрока = NULL;
   int    Счетчик_подстрок = 0,Позиция = 0;
   //-------------------------------
   for(int a1 = 0; a1 < 30000; a1++)
     {
      //--------------------------
      //Формируем строку сообщения:
      //--------------------------
      Строка += source[a1] + "`";
      //--------------------------
      //Даем комманду второй стороне подготовить массив для приема сообщения.
      //--------------------------
      if((int)source[a1] == _STOP)
        {
         if(EventChartCustom(0,RESIZE_CONTENT,a1 + 1,0,NULL))Alert(__FUNCTION__,"  Сообщение source_size_message  было отправлено! ");   
         //--------------------------------------- 
         //Разбиваем строку сообщения по блокам из 127-ми символов и записываем их в массив.
         //---------------------------------------
         for(int b1 = 0; b1 < 900; b1++)
           {
            Подстрока = StringSubstr(Строка,Позиция,127);
            if(Подстрока == NULL)break;
            //---------------------
            Данные[Счетчик_подстрок]     = Подстрока;
            Счетчик_подстрок++;
            Позиция += 127;
           }
         //---------------------------------------
         break;
        } 
     }
   //-------------------------------
   //Пересылаем сообщения частями.
   //-------------------------------
   for(int a2 = 0; a2 <= Счетчик_подстрок; a2++)
     {
      EventChartCustom(0,DOWNLOADING_CONTENTS,a2,0,Данные[a2]);  
     } 
   return(INIT_SUCCEEDED);
  }
 //+------------------------------------------------------------------+


Прием сообщения на другой стороне внутри OnChartEvent():

 if(id == CHARTEVENT_CUSTOM + DOWNLOADING_CONTENTS)
   {
    Строка += sparam; 
   } 

Далее, сообщение распаковывается и делать с ним можно все что угодно.


Я советую разрабатывать это направление. За ним будущее.

fxsaber
16737
fxsaber  
Реter Konow:

Дикий лес, fxsaber.  Все проще.

Реализовал полноценную связь между программами через EventChartCustom()

Этот вариант был сразу описан во втором сообщении этой ветки.

Реter Konow
8671
Реter Konow  
Можно конечно и через файл, и через ресурс, и через г.переменные реализовать связь. Но это универсальный способ. А пересылать короткие сообщения, вообще очень легко.
Реter Konow
8671
Реter Konow  
fxsaber:

Этот вариант был сразу описан во втором сообщении этой ветки.

Это теория. Я предоставил практический пример. Пользуюсь этим способом постоянно, поэтому, знаю о чем говорю.

fxsaber
16737
fxsaber  
Реter Konow:

Это теория. Я предоставил практический пример. Пользуюсь этим способом постоянно, поэтому, знаю о чем говорю.

Это не теория, а цитата из рабочего решения из КБ. Что же касается Ресурсов, то это наилучший способ передачи данных, т.к. прошел несколько жестких проверок.

Реter Konow
8671
Реter Konow  
fxsaber:

Это не теория, а цитата из рабочего решения из КБ. Что же касается Ресурсов, то это наилучший способ передачи данных, т.к. прошел несколько жестких проверок.

Как вариант для передачи больших массивов данных, да. Но маленькие сообщения? Тоже через ресурсы передавать? Не уверен, что хорошее решение.

fxsaber
16737
fxsaber  
Реter Konow:

Как вариант для передачи больших массивов данных, да. Но маленькие сообщения? Тоже через ресурсы передавать? Не уверен, что хорошее решение.

Первый ответ в этой ветке содержит все варианты передачи данных без DLL. К чему этот разговор?

Реter Konow
8671
Реter Konow  

Суть в том, что если передавать маленькие сообщения через ресурсы, то сигнал о передачи все равно нужно передавать через EventChartCustom.

Спрашивается, а зачем нам две операции внутри одной передачи, если можно использовать одну?

Поэтому, EventChartCustom. мне видится более универсальным способом, нежели остальные варианты.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий