Обмен данными между советниками

 
Есть ли возможность обмена данными между двумя советниками, которые работают одновременно с двумя разными инструментами?
 

специально для этого есть "глобальные переменные".

Это ни говоря уже про файлы :-)

 
Maxim Kuznetsov:

специально для этого есть "глобальные переменные".

Это ни говоря уже про файлы :-)

Глобальные переменные терминала

 
Еще можно организовать передачу данных через события графика (OnChartEvent()). При передаче данных из DLL советнику это чуть ли не единственный способ.
 

Самое красивое и скоростное решение для обмена в одном терминале это через пользовательские сообщения. 

CHARTEVENT_CUSTOM+N

https://www.mql5.com/ru/docs/eventfunctions/eventchartcustom


Если же нужен обмен между терминала то файлы, маппинг файлов в памяти, Pipe но тут не у всех получиться без создания серверной части.

Документация по MQL5: Работа с событиями / EventChartCustom
Документация по MQL5: Работа с событиями / EventChartCustom
  • www.mql5.com
//|                                            ButtonClickExpert.mq5 | //|                        Copyright 2009, MetaQuotes Software Corp. | //|                                             https://www.mql5.com | //| Expert initialization function                                   |...
 
Ihor Herasko:
Еще можно организовать передачу данных через события графика (OnChartEvent()). При передаче данных из DLL советнику это чуть ли не единственный способ.

Нельзя ли коротенький пример?

Или хотя бы какой тип сообщения нужно отправлять. Пробовал WM_USER, реакции в OnChartEvent нет, хотя в Windows Detective вижу что сообщения есть.

 

Через ресурсы

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

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

Через комментарий

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

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

fxsaber, 2018.12.04 09:11

// Пример передачи/обмена данных между программами через поле комментария чартов

#include <fxsaber\HistoryTicks\Data_String.mqh> // https://www.mql5.com/ru/code/20298

void OnStart()
{
  int ArrayIn[] = {0, 1, 2, 3, 4, 5};  
  ChartSetString(0, CHART_COMMENT, DATA_STRING::ToString(ArrayIn));    // Записали данные в комментарий чарта

  int ArrayOut[];    
  DATA_STRING::FromString(ChartGetString(0, CHART_COMMENT), ArrayOut); // Прочли данные из комментария чарта
  
  ArrayPrint(ArrayOut);
}
 
Sergey Zhilinskiy:

Нельзя ли коротенький пример?

Или хотя бы какой тип сообщения нужно отправлять. Пробовал WM_USER, реакции в OnChartEvent нет, хотя в Windows Detective вижу что сообщения есть.

Передающий советник:

#define CUSTOM_EVENT     ushort(2363)    // Можно любое значение, но одинаковое для обоих советников

long lMyLongParam = 328476;              // Целочисленное передаваемое значение 
double fMyDoubleParam = 328.76;          // Вещественное передаваемое значение 
string sMyStringParam = "fkwerfheg";     // Строковое передаваемое значение
EventChartCustom(<ID чарта принимающего советника>, CUSTOM_EVENT, lMyLongParam, fMyDoubleParam, sMyStringParam);

Принимающий советник:

#define CUSTOM_EVENT     ushort(2363)    // Можно любое значение, но одинаковое для обоих советников

void OnChartEvent(const int id, const long& lparam, const double& dparam, const string& sparam)
{
   if (id != CHARTEVENT_CUSTOM + CUSTOM_EVENT)
      return;

   Print("Получены значения. Long: ", lparam, ", double: ", dparam, ", string: ", sparam);
}

Найти чарт нужного советника можно, перебрав в начале работы советника все имеющиеся чарты и отправив им первичный запрос вроде: "есть тут кто?" Если ответ получен, то в нем нужно сообщить ID чарта (параметр lparam).

 
Sergey Zhilinskiy:

Или хотя бы какой тип сообщения нужно отправлять. Пробовал WM_USER, реакции в OnChartEvent нет, хотя в Windows Detective вижу что сообщения есть.

Если же нужно из DLL обратиться, то на чарте советника эмулируется нажатие клавиши. Тогда код обработчика будет такой:

#define VK_SEND_ORDERS_INFO             0x97                                                                       
#define VK_SYMBOLNAME_COMPLETE          0x99                                                                               


void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   if (id != CHARTEVENT_KEYDOWN)
      return;
 
   switch((int)lparam)
   {
      case VK_SEND_ORDERS_INFO:        ReceiveOrdersData();          break;
      case VK_SYMBOLNAME_COMPLETE:     ReceiveSymbolsConcordance();  break;
   }
}

В качестве эмулируемых клавиш нужно использовать свободные коды, чтобы не получилось коллизий с реальными клавишами.

 
Ihor Herasko:

Если же нужно из DLL обратиться, то на чарте советника эмулируется нажатие клавиши. Тогда код обработчика будет такой:

В качестве эмулируемых клавиш нужно использовать свободные коды, чтобы не получилось коллизий с реальными клавишами.

в МТ5 такой код будет работать? проверяли?

я несколько месяцев назад слушал с помощью Spy++ события МТ5 - ничего не видит, в МТ4 все видно как в обычном Win приложении

 
Igor Makanu:

в МТ5 такой код будет работать? проверяли?

В 2011-ом году работало. Потом не проверял. По идее, с тех пор ничего кардинально не должно было измениться. Эмулировать нажатие нужно в окне чарта, не символа. Возможно, в этом загвоздка.