Жду - не дождусь никак

 

Есть задача: нужно написать эксперта, который честно отрабатывает init() на каждом тике, но пока тиков нет - он должен в цикле делать некоторые действия, например выводить текущее время в комментарий (учебно-тестовый пример). Я думал что приход нового тика прерывает выполнение эксперта и "заново" вызывает start(). Однако небольшой тестовый примерчик показал: как только эксперт ушел во внутренний цикл он перестает реагировать на приходящие тики. В этом конечно есть свое здравое зерно, но задачку "поймания" тиков внутри глухого ( while(true) ) цикла мне все таки нужно решить. Буду очень признателен если кто поможет дельным советом или покажет/докажет что этого сделать никак нельзя.

int init()
{   
  Print("Init " + TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
}

int start()
{
  int cnt=1000;
  Print("Tick " + TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
  while(true) 
  {
    Comment("Loop " + TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
    cnt--; if(cnt<0) break; // чтобы наглухо не зациклится        
    Sleep(50); // задержка чтобы не захватить все 100% CPU usage
  }
  Print("Exit " + TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS));
}
Файлы:
 
Сударь Вы что то путаете, насколько я помню инит отрабатывается только при первом запуске экспа, или при смене ТФ на индикаторе, или после нажатия кнопки ОК в настройках ?
 
xrust >>:
Сударь Вы что то путаете,

Очепяточка вышла - я конечно же имел в виду start()

 
ForexTools писал(а) >>

Очепяточка вышла - я конечно же имел в виду start()

Бывает :)

Вот что нам по этому поводу говорит документация :

При поступлении новых котировок выполняется функция start() у присоединенных советников и пользовательских индикаторов. Если при поступлении новой котировки выполнялась функция start(), запущенная на предыдущей котировке, то пришедшая котировка будет проигнорирована советником. Все пришедшие во время выполнения программы новые котировки программой игнорируются до тех пор, пока не завершится очередное выполнение функции start(). После этого функция start() будет запущена только после прихода очередной новой котировки. У пользовательских индикаторов функция start() запускается для пересчета также после смены символа или периода текущего графика вне зависимости от поступления новых котировок. Функция start() не запускается при включенном запрете использования советников (кнопка "Разрешить/запретить советников"). Однако запрещение работы советников путем нажатия на указанную кнопку не прерывает текущее выполнение функции start(). Функция start() не запускается на выполнение при открытом окне свойств советника. Окно свойств не может быть открыто в момент выполнения советника.

 
Есть "некрасивое" решение: зацикленный скрипт + эксперт реагирующий на тики и контролирующий (напр. через глобальную переменную) что скрипта нет или он не работает. Но хочется все таки чтобы было два в одном ;)
 

а как на счет Refresh?

 
Так как поток один и прерывания не организованны, нужно делать в цикле свой контроль прихода нового тика, и таким образом его прерывать, но только в промежутках между тактами цикла, там где у вас Sleep() стоит
 
ForexTools >>:

Есть задача: нужно написать эксперта, который честно отрабатывает init() на каждом тике, но пока тиков нет - он должен в цикле делать некоторые действия, например выводить текущее время в комментарий (учебно-тестовый пример). Я думал что приход нового тика прерывает выполнение эксперта и "заново" вызывает start(). Однако небольшой тестовый примерчик показал: как только эксперт ушел во внутренний цикл он перестает реагировать на приходящие тики. В этом конечно есть свое здравое зерно, но задачку "поймания" тиков внутри глухого ( while(true) ) цикла мне все таки нужно решить. Буду очень признателен если кто поможет дельным советом или покажет/докажет что этого сделать никак нельзя.

Двумя экспертами. Если одним, необходимо отмерять порции, цикла не получится, ибо не будет вменяемой точки выхода.
 
зато есть возможность прямого взаимного вызова пользовательских функций, что прекрасно восполняет отсутстие прямого перехода, правда так он будет работать на каждом втором тике, но это уже лучше чем ничего...
 
один эксперт ловит тики и изменяет состояние глобальной переменной. Второй эксперт (зацикленный) просто отлавливает эти изменения
 
TheXpert >>:
Двумя экспертами. Если одним, необходимо отмерять порции, цикла не получится, ибо не будет вменяемой точки выхода.

Ошибочка, таки можно через RefreshRates. Но т.к. есть Sleep то некоторые тики будут пропускаться а остальные обрабатываться с опозданием в среднем в пол Slеep'а

Причина обращения: