Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1459

 

Добрый день!

При срабатывании ExpertRemove в MT5 происходит ли также закрытие позиции и удаление лимитных ордеров?

Или же нужно предварительно все закрыть?

Спасибо за предполагаемый ответ.

 
klycko #:

Добрый день!

При срабатывании ExpertRemove в MT5 происходит ли также закрытие позиции и удаление лимитных ордеров?

Или же нужно предварительно все закрыть?

Спасибо за предполагаемый ответ.

ExpertRemove - прекращает работу эксперта и выгружает его с графика.

Происходит то же самое, если вы вручную удалите советник с графика.

Если в советнике прописано удалять ордера и закрывать позиции при удалении эксперта,

то всё удалится и закроется, а если не прописано,

то и позиции и ордера останутся не закрытыми.

 
Aleksandr Slavskii #:

Если в советнике прописано удалять ордера и закрывать позиции при удалении эксперта,

то всё удалится и закроется

Маленькое дополнение: если это уложится в 2.5 секунды.

Выполнение функции OnDeinit() ограничивается 2.5 секундами. Если за это время функция не закончила свою работу, то ее выполнение завершается принудительно.
 

Не могу сообразить как сделать.

При наступлении события прокрутки колёсика мыши, выполняется код. 

Колёсико мыши можно прокрутить за раз на несколько щелчков, при этом мы получим не одно событие с dparam = количеству щелчков, а несколько событий с dparam = +/-120.

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

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

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      Print(delta);
     }
  }
//+------------------------------------------------------------------+
15:12:22.820    test (EURUSD,H1)        0.0
15:12:23.821    test (EURUSD,H1)        1.0
15:12:24.811    test (EURUSD,H1)        2.0
15:12:25.823    test (EURUSD,H1)        3.0
15:12:26.817    test (EURUSD,H1)        4.0
15:12:27.814    test (EURUSD,H1)        5.0
Колесо мыши прокрутилось в 15:12:22.820  и потом программа выполнялась ещё 5 раз, целых 5 секунд.


Вопрос: как выполнить код программы один раз, а не несколько.

То есть прокрутили колесо на 5 щелчков, delta = dparam / 120 * 5.

 
Aleksandr Slavskii #:

Не могу сообразить как сделать.

При наступлении события прокрутки колёсика мыши, выполняется код. 

Колёсико мыши можно прокрутить за раз на несколько щелчков, при этом мы получим не одно событие с dparam = количеству щелчков, а несколько событий с dparam = +/-120.

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

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

Колесо мыши прокрутилось в 15:12:22.820  и потом программа выполнялась ещё 5 раз, целых 5 секунд.


Вопрос: как выполнить код программы один раз, а не несколько.

То есть прокрутили колесо на 5 щелчков, delta = dparam / 120 * 5.

Попробуйте так

//+------------------------------------------------------------------+
void OnInit()
  {
   ChartSetInteger(0, CHART_EVENT_MOUSE_WHEEL, 0, true);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   bool flag = true;
   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      //--- какой то код
      delta += dparam / 120;
      Sleep(1000);
      //---
      if(flag)
       {
        Print(delta);
        flag = false;
       }
     }
  }
//+------------------------------------------------------------------+

Я не проверял, если что я не виноват…))) Придётся как-то мутить с флагом… и может придётся код вынести в пользовательскую функцию и там чудить с флагом.

 
Спасибо большое!
 

03 июня опубликовал свой скрипт для MT5 (https://www.mql5.com/ru/code/44732)... до сих пор висит в статусе " проверяется модератором".  Кто знает, как долго ждать проверки?

Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
  • www.mql5.com
Скачать бесплатно скрипт 'Quick Change MA (method, period)' от 'NotBuffett' для MetaTrader 5 в MQL5 Code Base
 
Alexey Viktorov #:

Попробуйте так

Я не проверял, если что я не виноват…))) Придётся как-то мутить с флагом… и может придётся код вынести в пользовательскую функцию и там чудить с флагом.

Проблема в том, что пользовательские функции запускаются только внутри событийных функций, а у меня в советнике всего две такие функции OnInit и OnChartEvent.

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

//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long & lparam, const double & dparam, const string & sparam)
  {
   static double delta = 0;
   static ulong timeWheel = 0;
   static bool mouse_wheel = false;

   if(id == CHARTEVENT_MOUSE_WHEEL)
     {
      delta += dparam / 120;
      mouse_wheel = true;
      timeWheel = GetMicrosecondCount();
     }

   if(mouse_wheel && GetMicrosecondCount() - timeWheel > 0)
     {
      Print(delta);
      //--- какой то код
      Sleep(1000);
      //---
      delta = 0;
      mouse_wheel = false;
     }
  }
//+------------------------------------------------------------------+
23:48:28.853    test (EURUSD,H1)        1.0
23:48:29.857    test (EURUSD,H1)        1.0
23:48:30.856    test (EURUSD,H1)        4.0
23:48:31.881    test (EURUSD,H1)        2.0
23:48:32.880    test (EURUSD,H1)        4.0
23:48:33.887    test (EURUSD,H1)        11.0
23:48:34.914    test (EURUSD,H1)        15.0
23:48:35.926    test (EURUSD,H1)        7.0
23:48:36.936    test (EURUSD,H1)        9.0
23:48:46.477    test (EURUSD,H1)        6.0
23:48:47.479    test (EURUSD,H1)        -1.0
 
Aleksandr Slavskii #:

Проблема в том, что пользовательские функции запускаются только внутри событийных функций, а у меня в советнике всего две такие функции OnInit и OnChartEvent.

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

Из  OnChartEvent тоже можно вызывать пользовательские функции без проблем.

Флаг объявлен на глобальном уровне. Вставить OnTick исключительно для сбрасывания флага никакого труда не составляет и не будет задерживать выполнение кода.

Если флаг открыт, вызвали пользовательскую функцию. Внутри закрыли флаг. В OnTick флаг снова открылся и ждёт следующего исполнения пользовательской функции.

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

 
Alexey Viktorov #:

Из  OnChartEvent тоже можно вызывать пользовательские функции без проблем.

Флаг объявлен на глобальном уровне. Вставить OnTick исключительно для сбрасывания флага никакого труда не составляет и не будет задерживать выполнение кода.

Если флаг открыт, вызвали пользовательскую функцию. Внутри закрыли флаг. В OnTick флаг снова открылся и ждёт следующего исполнения пользовательской функции.

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

Не совсем понял, точнее совсем не понял :)

А если нет тиков, OnTick  вроде как без тиков не срабатывает, что делать?


Собственно я и так из  OnChartEvent вызываю пользовательские функции. Просто проблемно было отследить последний щелчок мыши при прокрутке колёсика.

Задача была задержать выполнение пользовательской функции до момента остановки прокрутки колесика, при этом сосчитать количество щелчков при прокрутке.

В принципе получилось.