Обсуждение статьи "Рецепты MQL5 - Элементы управления в подокне индикатора - Кнопки" - страница 6

 
tol64:

Необязательно ежесекундно, там есть альтернатива по другому событию (уже обсуждалось). Приведите лучше пример, пожалуйста, как я сделал это вот здесь. ) Из условия, что эксперту нужно это событие, а индикатору нет. Так будет понятнее.

P.S. Поправка. Я ошибся. )) Ваш вариант не правильнее. Совсем не подходит. Поэтому лучше приведите пример исходя из условия выше. 

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

 
C-4:

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

Дело в том, что это событие можно не обрабатывать (тупо забить на него). Но это не означает, что очередь событий в функции OnChartEvent() не будет заполняться тем, что не нужно в определённый момент.

А это тысячи не нужных событий в минуту. А если программ на графике несколько? Не аргумент?

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

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

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

Зачем? )

То есть:

1. Зачем оставлять то, что не нужно (тысячи событий в минуту) ? 

2. (в другой формулировке) Зачем тратить больше ресурсов, если можно тратить меньше ?

Варианты типа, "если событие не нужно, то просто его не обрабатывать" мне лично совсем не нравится. Одно не отключить, второе не отключить и что из этого получится?

 

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

Итак, автор показал скользкие моменты, которые могут расстроить правильную работу его индикатора. Отлично, теперь "новичку" понятно, что:

  1. При удалении какой-либо программы с графика, нужно подумать о том, что бы не навредить другим программам.
  2. Ни в коем случае не надо на одном графике размещать конфликтные программы, а лучше их разместить в других окнах графика рассматриваемого символа. Если кто этого не знает, то по одному символу можно открыть достаточное количество окон графика.
  3. На каждом графике существуют свои, присущие только ему свойства. Поэтому, изменив их, вы можете нарушить правильную работу других программ. Ни в коем случае этого делать НЕльзя!
  4. Обязательно должна быть "защита от дурака". Т.е. если всё-таки какой-то вирус, в виде индикатора или другой программы, пытается изменить свойства графика, которые вы используете в своих программах, то обязательно это надо проверять. И если такое происходит регулярно - удалите вирус!
  5. Ошибки программ для финансовых рынков чаще всего приводят к огромным убыткам. Помните об этом!
 
tol64:

1. Зачем оставлять то, что не нужно (тысячи событий в минуту) ? 

2. (в другой формулировке) Зачем тратить больше ресурсов, если можно тратить меньше ?

Варианты типа, "если событие не нужно, то просто его не обрабатывать" мне лично совсем не нравится. Одно не отключить, второе не отключить и что из этого получится?

Получиться полностью контролируемый код.

Вот Вы упираете на производительность, однако так ли она падает с этим включенным событием? Для ответа на этот вопрос я специально написал простенький советник тестирующий это событие. Протестировав разные комбинации получил следующую таблицу:

Режим
% загрузки ЦП
EVENT_MOVE_MOUSE включен, обработка этого события в эксперте включена.                 9%
EVENT_MOVE_MOUSE включен, обработка этого события в эксперте выключена. 
                 6%
EVENT_MOVE_MOUSE выключен, обработка этого события в эксперте выключена. 
                 5-6%
Эксперт выключен. График закрыт. Просто перемещаем мышь по окну MetaTrader. 
                 5-6%

 

Как видно, реальная нагрузка возрастает только в том случае, если происходит фактическая обработка этого события. Примечательно, что судя по загрузке ЦП, MetaTrader отслеживает положение мыши независимо от того, включена подписка на это событие или нет. И в общем получается что бессмысленно экономить гипотетические ресурсы, т.к. в любом случае отслеживание мыши будет производится.

Код тестового эксперта:

//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   ObjectCreate(0, "Edit", OBJ_EDIT, 0, 0, 0);
   ObjectSetInteger(0, "Edit", OBJPROP_XSIZE, 400);
   //Включаем и выключаем событие по нашему усмотрению
   ChartSetInteger(0, CHART_EVENT_MOUSE_MOVE, false);
   
//---
   return(INIT_SUCCEEDED);
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
{
   //Комментируем блок, если обрабатывать поступающее событие не требуется.
   if(id == CHARTEVENT_MOUSE_MOVE)
   {
      string label = (string)lparam + " " + (string)dparam + " " + sparam;
      //printf(sparam);
      ObjectSetString(0, "Edit", OBJPROP_TEXT, label);
      ChartRedraw(0);
   }
}
Знакомство с MQL5: написание простого советника и индикатора
Знакомство с MQL5: написание простого советника и индикатора
  • 2010.03.16
  • Denis Zyatkevich
  • www.mql5.com
В этой статье проведен краткий обзор языка MQL5, приведен пример написания советника и индикатора. Данная статья ориентирована как на читателей, знакомых с программированием на языке MQL4, так и на тех, кто только начинает знакомство с программированием торговых систем и индикаторов.
 

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

2. Настраивать график под себя это плохо. Это примерно тоже самое, что торговать автоматом без магика.

 
DC2008:

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

Итак, автор показал скользкие моменты, которые могут расстроить правильную работу его индикатора. Отлично, теперь "новичку" понятно, что:

... 

Вы ещё 20 правил придумайте для своего оправдания чувства собственной важности и тогда уж точно, и себя запутаете и новичкам "поможете". Противоречия и недопонимание в данном случае наблюдались у Вас. )

C-4:

Получиться полностью контролируемый код.

...

Контролируемым он будет тогда, когда Вы его будете контролировать. В данном случае Вы предлагаете всё пустить на самотёк, то есть оставить событие, которое в данный момент не нужно и может воспроизводиться очень часто. На простых примерах это может быть не заметно. Возможно увидите необходимость отключения всего, что не нужно, в более сложных программах.

 
TheXpert:

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

...

Как, например, при переполнении очереди событий?
 

tol64:

Извините, а я Вас случайно не отвлекаю от написания очередного учебного пособия или рецепта?

Если нет, то давайте продолжим обсуждение Вашей статьи про управление в подокне индикатора. Итак, Вы предлагаете массовое решение (или идею) как сделать удобное меню в индикаторе. Хорошо, цель статьи очень достойна! Но как "начинающему" программисту воспользоваться всем этим арсеналом? Куда разместить пользовательские функции? Продемонстрируйте на примере. А заодно объясните, что нужно исправить в коде чтобы использовать например, 5 кнопок? Считайте это вопрос начинающего.

 
tol64:
Как, например, при переполнении очереди событий?
Ага.
 
DC2008:
Вы так уверены что в вашей статье все идеально?
Причина обращения: