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

 
Интересует возможность обмениваться данными между программами. Как можно быстро передать класс или структуру между советниками ???
 

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


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

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

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

Automated-Trading, 2018.03.29 11:09

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

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

 

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

Библиотеки: 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);
}
 

Дикий лес, 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; 
   } 

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


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

 
Реter Konow:

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

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

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

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

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

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

 
Реter Konow:

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

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

 
fxsaber:

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

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

 
Реter Konow:

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

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

 

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

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

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