Как правильно реализовать постоянную работу эксперта?

 
Как правильно реализовать постоянную работу эксперта, а не только во время каждого тика. Функция start(), как я понял, запускается во время каждого тика, но у меня сигналы поступают из вне в любое время и ждать следущего тика для исполнения сигнала не надо, следует выполнить немедленно по текущей цене, то есть мне надо следить за поступлением сигнала каждую секунду, а не каждый тик.

Пока пришло в голову такое решение, зациклить функцию start:

void start()
{
   while(true)
   {
      refreshRate();

       ... //код эксперта

      sleep(1000);
   }

}
Но может есть лучшее решение и более правильное?
 
Лучше так:

void start()
{
   while(!IsStopped())
   {
      RefreshRate();
 
       ... //код эксперта
 
      Sleep(1000);
   }
 
}
 
Все именно так и делают.
 
solandr писал (а):
Все именно так и делают.

Я делаю изящнее:

extern int    NumberAccount = 0;  // Номер торгового счёта
extern double IntUpdate     = 0;  // Интервал обновления в секундах (0-по тикам)
 
//+----------------------------------------------------------------------------+
//|  expert initialization function                                            |
//+----------------------------------------------------------------------------+
void init() {
  if (IsExpertEnabled()) Message("Советник будет запущен следующим тиком");
  else Message("Отжата кнопка \"Разрешить запуск советников\"");
}

//+----------------------------------------------------------------------------+
//|  expert start function                                                     |
//+----------------------------------------------------------------------------+
void start() {
  if (NumberAccount>0 && NumberAccount!=AccountNumber()) {
    Message("ЗАПРЕЩЕНА работа со счётом "+AccountNumber());
    return;
  }
  if (IntUpdate<=0) MainBody();
  else {
    while (IsExpertEnabled() && !IsStopped()) {
      if (IsConnected()) {
        MainBody();
        Sleep(1000*IntUpdate);
      } else Comment("ОТСУТСТВУЕТ связь с торговым сервером\n",
                     "Советник ОСТАНОВЛЕН");
    }
    Message("Отжата кнопка \"Разрешить запуск советников\"\n"+"Советник ОСТАНОВЛЕН");
  }
}
 
//+----------------------------------------------------------------------------+
//|  Основное тело эксперта                                                    |
//+----------------------------------------------------------------------------+
void MainBody() {
}
 
//+----------------------------------------------------------------------------+
//|  Вывод сообщения в коммент и в журнал                                      |
//+----------------------------------------------------------------------------+
void Message(string m) {
  Comment(m);
  if (StringLen(m)>0) Print(m);
}
 

Посмотрите здесь: Синхронизация работы экспертов, скриптов и индикаторов .

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