Ещё один вопрос о звуковых сигналах

 

Можно ли индикатор заставить подавать только указанное кол-во сигналов с указанным интервалом? Например, при наступлении условий дать 5 сигналов через каждые 5 секунд (т.е. сделать ф-цию аналогичную вкладке "сигналы" в терминале только со своими условиями). Статью о звуковых сигналах в индикаторах читал и такая реализация проблем не вызывает, а вот только определённое кол-во сигналов сделать не могу.

Пробовал на таком простом примере:

   if (Bid == PriceLevel)
      {
      for (int i=0; i<AlertRepeat; i++)
         {
         PlaySound("alert.wav");
         Sleep(1000*RepeatAfter);
         }
      }
но в индикаторе не работает. В то же время советник с таким кодом работает. Подскажите, пожалуйста, как решить данную проблему
 
INTG писал(а) >>

Можно ли индикатор заставить подавать только указанное кол-во сигналов с указанным интервалом? Например, при наступлении условий дать 5 сигналов через каждые 5 секунд (т.е. сделать ф-цию аналогичную вкладке "сигналы" в терминале только со своими условиями). Статью о звуковых сигналах в индикаторах читал и такая реализация проблем не вызывает, а вот только определённое кол-во сигналов сделать не могу.

Пробовал на таком простом примере:

но в индикаторе не работает. В то же время советник с таким кодом работает. Подскажите, пожалуйста, как решить данную проблему

В индикаторе нельзя использовать Sleep()

 
Vinin писал(а) >>

В индикаторе нельзя использовать Sleep()

Т.е., если я правильно понял, в индикаторе данную задачу (указанное кол-во сигналов с определённым интервалом) реализовать не получится?

 
Vinin >>:

В индикаторе нельзя использовать Sleep()

Можно, конечно, заморочиться, и вместо Sleep() поставить пустой цикл (с каким-нибудь бессмысленным действием).

А потом подобрать количество прогонов для получения требуемого времени задержки (зависит от производительности машины).

По-хорошему, есть статья komposter'а по звуковым сигналам, там все разъясняется.

Звуковые сигналы в индикаторах

 

Ну Sleep() может и не работает, но зато работают функции времени, вот и сделайте по времени

 
xrust >>:

Ну Sleep() может и не работает, но зато работают функции времени, вот и сделайте по времени

При отсутствии тиков индикатор работать не будет. Сигналов тоже не будет.

Надо тики эммулировать. Скрипт зацикленный нужен с эммуляцией тиков.

 
Zhunko писал(а) >>

При отсутствии тиков индикатор работать не будет. Сигналов тоже не будет.

Надо тики эммулировать. Скрипт зацикленный нужен с эммуляцией тиков.

А вот этого вопроса не стояло

 

Попробовал "уговорить" следующим образом:

  int startAlert, endAlert;
  bool DoAlerts=false;
//----
   if (Bid == PriceLevel)
      {
      startAlert=TimeCurrent();
      endAlert=startAlert+AlertRepeat*RepeatAfter;
      DoAlerts=true;
      }
   
   if (DoAlerts)
      {
      if (endAlert-startAlert>=0 && (endAlert-startAlert)%AlertRepeat==0)
         Alert("Price crossed Level");
      if (TimeCurrent()>endAlert)
         DoAlerts=false;
      }

Но вот здесь и возникает вопрос о тиках - если в "нужную" секунду не будет тика, сигнала, соответственно, тоже не будет.

С эммуляцией тиков ранее не сталкивался. Можете подсказать, где можно почитать или посмотреть реализацию?

 

Вот такая функция обновляет окно, что равносильно эммуляции тиков:

PostMessageA (WindowHandle (Symbol(), Period()), WM_COMMAND, 33324, 0);   // Эммулируем тики в текущем окне.
 
Vinin писал(а) >>

В индикаторе нельзя использовать Sleep()

В индикаторах запрещено использовать функцию слип, но использовать ее можно.

У меня есть длл для этой функции.

Терминал будет виснуть во время звукового сигнала, но работать должно.

 
INTG писал(а) >>

Т.е., если я правильно понял, в индикаторе данную задачу (указанное кол-во сигналов с определённым интервалом) реализовать не получится?

Прямо так - не возможно. Можно, с интервалом не меньше заданного времени - как тики будут поступать. Если нет тиков не надо и сообщений.