Скачать MetaTrader 5

Несанкционированные тики.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Forex Trader
114299
Forex Trader  
Посадите в любое окно такой индикатор:
int start() 
   {
   PlaySound( "ok.wav" );
   return;                                                           
   }


При "обычной" работе, т.е. когда юзер порсто сидит и смотрит на экран, ничего не меняя, звук будет ОКать в такт поступающим тикам.

Но достаточно перейти на соседний ТФ любой другой валюьной пары, как это событие тоже отзовётся ОКаньем. Мышкой туда-сюда тык-тык, терминал отзовётся ко-ко-ко..:)
Получается, что в момент перекл. ТФ система генерирует лишний тик.

Вопрос разработчикам:
как расценивать такое положение дел - как нормальное или ошибочное?

Forex Trader
114299
Forex Trader  
Уже писали - переход на другой тайм-фрейм или изменение размеров окна (перекомпиляция повешенного на чарт индикатора) - все это требует перерисовки графика, поэтому посылается "как бы тик". То есть, все нормально.
Forex Trader
114299
Forex Trader  
Rosh, ОК, спасибо.

А у этого "как бы тика" есть какие-то отличительные свойства кроме способности запускать старт?
Forex Trader
114299
Forex Trader  
Не должно быть такого. Очень легко проверяется тестовым экспертом
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   Print("Bars=",Bars,"  Close[0]=",Close[0],"  Bid=",Bid,"  Ask=",Ask,"  LastTime=",TimeToStr(MarketInfo(Symbol(),MODE_TIME),TIME_MINUTES | TIME_SECONDS));
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   Print("Close=",Close[0],"   ",TimeToStr(CurTime(),TIME_MINUTES | TIME_SECONDS),"    Bid=",Bid,"   ",TimeToStr(MarketInfo(Symbol(),MODE_TIME),TIME_MINUTES | TIME_SECONDS));
//----
   return(0);
  }


Сравните последнее время из маркет вотча со временем в журнале.

Forex Trader
114299
Forex Trader  
Если речь идёт про индикатор, то при переходе на другой таймфрейм он просто-напросто пересчитывается. То есть, вызывается функция start.
Forex Trader
114299
Forex Trader  
Slawa, спасибо. Очень интересно, что Вы говорите.
Правда, я не очень понял как практически отличить натуральный тик от вызова функции старт, если сам код сидит в этом самом старте.

Может, если Вы найдёте пару минут..
Я пытаюсь найти альтернативное решение, в условиях, когда нет возможности программно обрабатывать состояние кнопки советника. Задача простая: прекратить торговые операции в зацикленном эксперте в момент, когда нажата кнопка.

Идея такова: анализировать разницу во времени между:
- тиком, пришедшим в незацикленный эксперт, сидящий в соседнем ТФ той же вал. пары и
- тиком, пришедшим в индикатор.
Индикатор запускает старт всегда, а эксперт зависит от кнопки.
Если разница небольшая, то кнопка разрешает, если же разница превышает некот. значение, например 100 мс, то кнопка выключена. Для передачи информации используются ГлобПерем.

Я это всё проделал, но устойчивой работы добиться не удалось.
Оказывается, на процесс влияют случайные факторы , например, передвижение мыши задерживает запуск старта в эксперте ( "MQL4: Вопросы по MQL4." ), перекл. ТФ приводит к внеочередному запуску старт индикатора.. Боюсь, что есть и другие факторы.

Если это обсуждение выходит за рамки Ваших интересов, то скажите.
Forex Trader
114299
Forex Trader  
Индикатор не должен знать, по какой причине он считается (или пересчитывается). Но нет никаких препятствий, чтобы определить факт запуска пересчёта после смены символа-таймфрейма.
string SaveSymbol="";
int    SavePeriod=0;
...
int start()
  {
   string cur_symbol=Symbol();
   int     cur_period=Period();
   if(SaveSymbol!=cur_symbol || SavePeriod!=cur_period)
     {
      SaveSymbol=cur_symbol;
      SavePeriod=cur_period;
      return(0);
     }
   ...
  }
Forex Trader
114299
Forex Trader  
Slawa, извините, я не понял.

Это старт индикатора? Если так, то какие значения может принимать cur_symbol кроме того значения, кот предоставляет ему окно, в кот. он сидит?
Разве что, во все без исключения окна посадить аналогичные индикаторы и сравнивать их значения?

Или я чего-то не понимаю..
Forex Trader
114299
Forex Trader  
Обращаю Ваше внимание на то, что переменные SaveSymbol и SavePeriod объявлены на глобальном уровне. Для определения начала нового бара "Особенности написания экспертов" используется аналогичный метод - переменные можно объявить и на локальном уровне, но статическими.
Forex Trader
114299
Forex Trader  
Slawa, извините, я не понял.

Это старт индикатора? Если так, то какие значения может принимать cur_symbol кроме того значения, кот предоставляет ему окно, в кот. он сидит?
Разве что, во все без исключения окна посадить аналогичные индикаторы и сравнивать их значения?

Или я чего-то не понимаю..

Открой "Обзор рынка" и график Евры. Перетащи с Обзора символ Фунт на график - и удивишься :)
Или, открой Историю сделок или список открытых позиций и перетащи ордер по Фунту на график Евро . И так далее...
Forex Trader
114299
Forex Trader  
Slawa,
мне кое-как стала понятна Ваши мысль после комментариев Rosh.
Действительно, если мудрый юзер делает с графиком такие вещи, как меняет валюту или период, то приведенный Вами код поможет обнаружить это событие. Переменые, объявленные на глобальном уровне мне тоже понятны. Но в данном случае эта возможность не представляет никакого интереса.

Я говорил о другом.
Задача - определить состояние кнопки советника. Очень просто: отслеживаем факт срабатывания старта в индикаторе и начинаем мерять время до срабатывания старта в эксперте. Если через короткое время экспертовый старт запустился, значит кнопка советника включена. А если эксперт молчит, значит кнопка выключена. Легко, просто и понятно. Если бы не одно но. Вернее, 2 но.

1. Старт индикатора запускается при переходе мышкой на соседний ТФ. Обращаю внимание: без каких бы то ни было изменений в исходном окне. Юзер просто решил заглянуть в соседнее окно и старт индикатора в исходном окне срабатывает.
2. Измерять время можно, если знать все факторы, влияющие на это измерение. А они неизвестны. Во всяком случае, мне. Не понятно почему активное пользование мышкой сдвигает время запуска экспертного старта. Аналогичная задержка случается, например и при компиляции программ в МЕ. Есть подозрение, что на это запаздывание влияет вообще любая активная деятельность юзера на машине.
------------------------

Похоже, что штатными средствами задача решена быть не может..
Спасибо, что потратили время.

Rosh, спасибо за наглядный пример.

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