Скачать MetaTrader 5

Как определить замену графика? - страница 2

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Nikolai Semko
3514
Nikolai Semko  
foxmag:
В OnTick() организован бесконечный цикл. Есть ли возможность программно установить факт смены графика, осуществляемой вручную (например, перетаскиванием мышью)? Установлено, что изменений значений переменных _Symbol и _UninitReason при смене графика не происходит, поэтому их использовать как условие замены графика невозможно. Спасибо.
fxsaber:

А зачем засовывать бесконечные циклы в OnTick для такой задачи.
Это же жестко в плане нагрузки на процессор. Chart функции одни из самых дорогих.
Не проще ли через OnChartEvent без всяких циклов и Sleep- ов:

void OnChartEvent(const int id,         // идентификатор события   
                  const long& lparam,   // параметр события типа long 
                  const double& dparam, // параметр события типа double 
                  const string& sparam  // параметр события типа string 
                  )
  {
   if(id==CHARTEVENT_CHART_CHANGE)
     {

      static const long Chart=ChartID();
      static string PrevSymbol=_Symbol;
      static ENUM_TIMEFRAMES PrevTF=_Period;
      string Symb=ChartSymbol(Chart);
      ENUM_TIMEFRAMES TF=ChartPeriod(Chart);
      if((PrevSymbol!=Symb) || (PrevTF!=TF)) // ноль указывать НЕЛЬЗЯ!
        {
         PrevSymbol=Symb;
         PrevTF=TF;

         Alert(PrevSymbol+" "+EnumToString(PrevTF));
        }
     }
  }
foxmag
601
foxmag  
Nikolai Semko:

А зачем засовывать бесконечные циклы в OnTick для такой задачи.
Это же жестко в плане нагрузки на процессор. Chart функции одни из самых дорогих.
Не проще ли через OnChartEvent без всяких циклов и Sleep- ов:

В моем случае предлагаемый Вами способ не годится. Я использую бесконечный цикл для управления "живыми" управляющими объектами (ну, кнопками). И мне нужен был небольшой сервис для случая ручной замены графика. Вопрос решился чрезвычайно просто с помощью одной строки без какой бы то ни было "избыточной" нагрузки на процессор:

if(_Symbol != ChartSymbol(Chart)) return;

Chart определен выше у fxsaber.

Спасибо за участие.

Nikolai Semko
3514
Nikolai Semko  
foxmag:

В моем случае предлагаемый Вами способ не годится. Я использую бесконечный цикл для управления "живыми" управляющими объектами (ну, кнопками). И мне нужен был небольшой сервис для случая ручной замены графика. Вопрос решился чрезвычайно просто с помощью одной строки без какой бы то ни было "избыточной" нагрузки на процессор:

Chart определен выше у fxsaber.

Спасибо за участие.

Вы не поняли мою мысль. 

Попробуйте сделать профилирование и Вы ахнете, какая медленная функция ChartSymbol. Если вы будете выполнять эту функцию на каждом тике, да еще в цикле, то поймете, насколько это большая роскошь.
Гораздо проще определить глобальную переменную, скажем Cur_Symbol, и вычислять ее именно в OnChartEvent при наступления события CHARTEVENT_CHART_CHANGE

   if(id==CHARTEVENT_CHART_CHANGE)   Cur_Symbol=ChartSymbol(Chart);
    

тогда Ваша очень "дорогая" строчка в OnTick будет выглядеть следующим образом:

if(_Symbol != Cur_Symbol) return;

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

Andrey Khatimlianskii
59540
Andrey Khatimlianskii  
Nikolai Semko:

Вы не поняли мою мысль. 

Попробуйте сделать профилирование и Вы ахнете, какая медленная функция ChartSymbol. Если вы будете выполнять эту функцию на каждом тике, да еще в цикле, то поймете, насколько это большая роскошь.
Гораздо проще определить глобальную переменную, скажем Cur_Symbol, и вычислять ее именно в OnChartEvent при наступления события CHARTEVENT_CHART_CHANGE

тогда Ваша очень "дорогая" строчка в OnTick будет выглядеть следующим образом:

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

Бесконечный цикл. Нет ОнТика и ОнЧартИвента. Только хардкор )

foxmag
601
foxmag  
Nikolai Semko:

Вы не поняли мою мысль. 

Попробуйте сделать профилирование и Вы ахнете, какая медленная функция ChartSymbol. Если вы будете выполнять эту функцию на каждом тике, да еще в цикле, то поймете, насколько это большая роскошь.
Гораздо проще определить глобальную переменную, скажем Cur_Symbol, и вычислять ее именно в OnChartEvent при наступления события CHARTEVENT_CHART_CHANGE

тогда Ваша очень "дорогая" строчка в OnTick будет выглядеть следующим образом:

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

Простите, был невнимателен, Вы правы. Спасибо.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий