Скачать MetaTrader 5

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

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


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

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

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

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

А у этого "как бы тика" есть какие-то отличительные свойства кроме способности запускать старт?
Forex Trader
114269
Forex Trader 2006.01.26 16:50  
Не должно быть такого. Очень легко проверяется тестовым экспертом
//+------------------------------------------------------------------+
//| 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
114269
Forex Trader 2006.01.26 16:53  
Если речь идёт про индикатор, то при переходе на другой таймфрейм он просто-напросто пересчитывается. То есть, вызывается функция start.
Forex Trader
114269
Forex Trader 2006.01.26 17:21  
Slawa, спасибо. Очень интересно, что Вы говорите.
Правда, я не очень понял как практически отличить натуральный тик от вызова функции старт, если сам код сидит в этом самом старте.

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

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

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

Если это обсуждение выходит за рамки Ваших интересов, то скажите.
Forex Trader
114269
Forex Trader 2006.01.26 17:45  
Индикатор не должен знать, по какой причине он считается (или пересчитывается). Но нет никаких препятствий, чтобы определить факт запуска пересчёта после смены символа-таймфрейма.
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
114269
Forex Trader 2006.01.26 18:07  
Slawa, извините, я не понял.

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

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

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

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

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

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

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

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

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

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