Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 618

 
neverness:

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

Помощь должна быть "квалифицированной", а не от "фонаря" !

Опишите повторно задачу заново, что именно нужно.

 
Vitaly Muzichenko:

Опишите повторно задачу заново, что именно нужно.

Меня интересует возможность процедуры передачи данных в MT4/MT5 между различными модулями.

Например:

Как передать данные из одного индикатора в другой ?

Как передать данные из индикатора в скрипт ?

Как передать данные из индикатора в советник ?  … и так далее.

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

Но в этом случае возникает проблема синхронизации передаваемых/читаемых данных.

Интуитивно я предполагаю, что в терминале MT4/MT5 должна быть некая общая буферная зона памяти, и должны быть процедуры, которые регулируют обмен данными через эту зону.

Но в описании я ничего такого не нашел.

 
neverness:

Меня интересует возможность процедуры передачи данных в MT4/MT5 между различными модулями.

Например:

Как передать данные из одного индикатора в другой ?

Как передать данные из индикатора в скрипт ?

Как передать данные из индикатора в советник ?  … и так далее.

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

Но в этом случае возникает проблема синхронизации передаваемых/читаемых данных.

Интуитивно я предполагаю, что в терминале MT4/MT5 должна быть некая общая буферная зона памяти, и должны быть процедуры, которые регулируют обмен данными через эту зону.

Но в описании я ничего такого не нашел.

Ну так передача данных как писали ранее, может быть через файл, или глобальную переменную терминала

Если гл.пер.терм:

// записываем значение, помещаем это всё в OnTick()
GlobalVariableSet("Sname", 123.25);

// Получаем в любой программе эти значения, так-же внутри OnTick()
GlobalVariableGet("Sname"); // получим 123.25

Это самый простой способ обмена между всеми программами в одном терминале

 
Vitaly Muzichenko:

Ну так передача данных как писали ранее, может быть через файл, или глобальную переменную терминала

Если гл.пер.терм:

Это самый простой способ обмена между всеми программами в одном терминале

Хорошо. Пишем в индикаторе  выражение:

GlobalVariableSet("Sname", 123.25); Это событие наступает, например, при OnTick().

Но скрипты не работают с массивами данных, и у них нет события OnTick(). Откуда скрипт  узнает, что событие OnTick() наступило, и следует применить процедуру получения новых данных

GlobalVariableGet("Sname");

Можно вместо OnTick() воспользоваться событием OnTimer(). Но у скрипта свой OnTimer(), а у индикатора свой, и между собой они никак не связаны.

Возникает проблема:

Как обеспечить синхронность событий  GlobalVariableSet("Sname", 123.25); и GlobalVariableGet("Sname");?

Или существует процедура, которая следит за изменением значения "Sname" ?    Типа OnChange.

То есть, как скрипт узнает о том, что индикатор изменил значение "Sname", и это значение стало 125,35 ?

Где связующее звено между GlobalVariableSet("Sname", 123.25); и GlobalVariableGet("Sname"); ?

Они же в разных программах находятся.


 
neverness:

Хорошо. Пишем в индикаторе  выражение:

GlobalVariableSet("Sname", 123.25); Это событие наступает, например, при OnTick().

Но скрипты не работают с массивами данных, и у них нет события OnTick(). Откуда скрипт  узнает, что событие OnTick() наступило, и следует применить процедуру получения новых данных

GlobalVariableGet("Sname");

Можно вместо OnTick() воспользоваться событием OnTimer(). Но у скрипта свой OnTimer(), а у индикатора свой, и между собой они никак не связаны.

Возникает проблема:

Как обеспечить синхронность событий  GlobalVariableSet("Sname", 123.25); и GlobalVariableGet("Sname");?

Или существует процедура, которая следит за изменением значения "Sname" ?    Типа OnChange.

То есть, как скрипт узнает о том, что индикатор изменил значение "Sname", и это значение стало 125,35 ?

Где связующее звено между GlobalVariableSet("Sname", 123.25); и GlobalVariableGet("Sname"); ?

Они же в разных программах находятся.

Связующее звено - это жёсткий диск компьютера. Записать думаю проблем не составит, а вот получить можно по любому событию даже в скрипте, это ничем не отличается от того, как получаете текущие значения ASK и BID


P.S. Прилагаю индикатор и скрипт для примера, в индикаторе записываем тиковые объёмы

Индикатор

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(tick_volume,true);
  
  // записываем значение
   GlobalVariableSet("Sname", tick_volume[0]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Скрипт

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
    Alert(GlobalVariableGet("Sname"));
  }
//+------------------------------------------------------------------+
Файлы:
Set.mq5  4 kb
Get.mq5  1 kb
 
Vitaly Muzichenko:

Связующее звено - это жёсткий диск компьютера. Записать думаю проблем не составит, а вот получить можно по любому событию даже в скрипте, это ничем не отличается от того, как получаете текущие значения ASK и BID

Круто!

И как это сделать?

Приведите пример.

Например, как смоделировать такой случай.

Индикатор получает данные, вычисляет дисперсию этих данных, и подготавливает для скрипта координаты точек эллипса (4 глобальных переменных Q1,Q2,T1,T2, которые нужно передать скрипту).

Теперь индикатор должен дать команду скрипту, который по этим глобальным переменным построит эллипс.

Как индикатор это может сделать?

 
Vitaly Muzichenko:

Связующее звено - это жёсткий диск компьютера. Записать думаю проблем не составит, а вот получить можно по любому событию даже в скрипте, это ничем не отличается от того, как получаете текущие значения ASK и BID


P.S. Прилагаю индикатор и скрипт для примера, в индикаторе записываем тиковые объёмы

Индикатор

Скрипт

 Так у Вас, в Вашем примере скрипт работает только один раз - при запуске, то есть, при наступлении события OnStart().

А дальше как?

Где синхронизация?

Как скрипт заставить работать синхронно с индикатором?

Например, как включать скрипт всякий раз, когда объемы превышают некоторое значение?

 
neverness:

 Так у Вас, в Вашем примере скрипт работает только один раз - при запуске, то есть, при наступлении события OnStart().

А дальше как?

Где синхронизация?

Как скрипт заставить работать синхронно с индикатором?

Например, как включать скрипт всякий раз, когда объемы превышают некоторое значение?

Это уже ваша задача, как работать со скриптом. Может вам проще создать советник, а не скрипт?

Индикатор который даёт значения:

//+------------------------------------------------------------------+
//|                                                          Set.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   return(INIT_SUCCEEDED);

  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
  ArraySetAsSeries(time,true);
  ArraySetAsSeries(tick_volume,true);

  // записываем нужные значение
   GlobalVariableSet("Q1", tick_volume[0]);
   GlobalVariableSet("Q2", tick_volume[1]);
   GlobalVariableSet("T1", time[0]);
   GlobalVariableSet("T2", time[1]);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Простой пример, зацикленного скрипта:

//+------------------------------------------------------------------+
//|                                                          Get.mq5 |
//|                                                   Copyright 2018 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   while(!IsStopped())
    {
     double Q1 = GlobalVariableGet("Q1");
     double Q2 = GlobalVariableGet("Q2");
     datetime T1 = (datetime)GlobalVariableGet("T1");
     datetime T2 = (datetime)GlobalVariableGet("T2");
     Print("Q1 = ",Q1,", Q2 = ",Q2,", T1 = ",TimeToString(T1),", T2 = ",TimeToString(T2));
     Sleep(1000); // Пауза 1 секунда
    }
  }
//+------------------------------------------------------------------+

P.S. Исправил код.

 
Vitaly Muzichenko:

Это уже ваша задача, как работать со скриптом. Может вам проще создать советник, а не скрипт?

Индикатор который даёт значения:


Простой пример, зацикленного скрипта:

Я так понял, что в MQL нет возможности синхронизации разных модулей.

Ладно. Тогда такой вопрос. А если поставить кнопку на поле, и подсадить скрипт на эту кнопку. 

Такая возможность есть в MQL?  - Или такой возможности тоже нет?

Ведь как-то скрипт должен запускаться !!!

 
neverness:

Я так понял, что в MQL нет возможности синхронизации разных модулей.

Ладно. Тогда такой вопрос. А если поставить кнопку на поле, и подсадить скрипт на эту кнопку. 

Такая возможность есть в MQL?  - Или такой возможности тоже нет?

Ведь как-то скрипт должен запускаться !!!

Тема старая, но всё-же почитайте, или может кто подскажет что-то новое. Я не запускаю скрипты, и с ними вообще не работаю)

Как вызвать скрипт из индикатора
Как вызвать скрипт из индикатора
  • 2008.10.15
  • www.mql5.com
Подскажите можноли и как вызвать на выполнение скрипт из индикатора...
Причина обращения: