специально для этого есть "глобальные переменные".
Это ни говоря уже про файлы :-)
Самое красивое и скоростное решение для обмена в одном терминале это через пользовательские сообщения.
https://www.mql5.com/ru/docs/eventfunctions/eventchartcustom
Если же нужен обмен между терминала то файлы, маппинг файлов в памяти, Pipe но тут не у всех получиться без создания серверной части.
- www.mql5.com
Еще можно организовать передачу данных через события графика (OnChartEvent()). При передаче данных из DLL советнику это чуть ли не единственный способ.
Нельзя ли коротенький пример?
Или хотя бы какой тип сообщения нужно отправлять. Пробовал WM_USER, реакции в OnChartEvent нет, хотя в Windows Detective вижу что сообщения есть.
Через ресурсы
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
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, 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); }
Нельзя ли коротенький пример?
Или хотя бы какой тип сообщения нужно отправлять. Пробовал 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).
Или хотя бы какой тип сообщения нужно отправлять. Пробовал 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; } }
В качестве эмулируемых клавиш нужно использовать свободные коды, чтобы не получилось коллизий с реальными клавишами.
Если же нужно из DLL обратиться, то на чарте советника эмулируется нажатие клавиши. Тогда код обработчика будет такой:
В качестве эмулируемых клавиш нужно использовать свободные коды, чтобы не получилось коллизий с реальными клавишами.
в МТ5 такой код будет работать? проверяли?
я несколько месяцев назад слушал с помощью Spy++ события МТ5 - ничего не видит, в МТ4 все видно как в обычном Win приложении
в МТ5 такой код будет работать? проверяли?
В 2011-ом году работало. Потом не проверял. По идее, с тех пор ничего кардинально не должно было измениться. Эмулировать нажатие нужно в окне чарта, не символа. Возможно, в этом загвоздка.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования