Нужно написать робота, который в 12:00 каждый день показывает цену. Как это сделать?

 
Вот так?

if (Hour()==12 && Minute()==0 && Seconds()==0)
   Alert(Bid);


А если не будет в терминале тика в это время, то и цену не покажет.
А если в терминале будет 2 тика за эту секунду, то оно 2 раза цену покажет.

Как лучше организовать?

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

void OnTimer()
   {
   if (Hour()==12 && Minute()==0 && Seconds()==0)
     Alert(Bid);

   //еще код

   }
        
 
Объявить счетчик тиков, который сбрасывать при наступлении нового дня. Переменной datetime корректировать время наступления события (время дня плюс эта переменная). Контролировать через временное окно (время наступления плюс секунда минимум). Грубо говоря, наступило время, если тиков нет на протяжении секунды, то это не подходит . После прихода тика, если счетчик тиков равен нулю (и соблюдены предыдущие условия), входим в алгоритм обработки тика, увеличивая счетчик тиков. При наступлении нового дня сбрасываем счетчик тиков. И по новой...
 
Поставьте время >= и организуйте флаг, что цена получена.
 
Alexey Viktorov #:
Поставьте время >= и организуйте флаг, что цена получена.

да, наверное это лучший способ.

флаг поставить в положение true,
а через некоторое время его опять перевести в положение false


bool flag=false;


void OnTimer()
   {
        
      if (flag==false && Hour()==12 && Minute()==0)
         {
         Alert(Bid);
         flag=true;
         }   
        
      if (flag==true && Hour()==12 && Minute()==1)        
         flag=false;      
        
   }

и использовать OnTimer, а то на моем торговом символе мало тиков приходит за минуту, функция OnTick тут будет не оптимальна.

 
igrok333 #:

да, неверное это лучший способ.

флаг поставить в положение true,
а через некоторое время его опять перевести в положение false


и использовать OnTimer, а то на моем торговом символе мало тиков приходит за минуту, функция OnTick тут будет не оптимальна.

Вы не определили точно задачу, цена на каком тике нужна, на последнем до 12-00, или на первом после 12-00. ТаймКаррент до миллисекунд время меряет. Ровно в 12 часов цена бывает редко. Поймать последнюю цену до 12 часов в ОнТаймере или на первом тике После 12 часов. Поймать первую цену после 12 можно и без ОнТаймера. Текущее время больше 12 первый тик, и флаг, что первый тик получен.

Зы, а после 13 часов флаг вернуть что не получен)

 
igrok333 #:

да, неверное это лучший способ.

флаг поставить в положение true,
а через некоторое время его опять перевести в положение false


и использовать OnTimer, а то на моем торговом символе мало тиков приходит за минуту, функция OnTick тут будет не оптимальна.

Может быть, если за минуту хоть одна котировка есть…

 
igrok333:
Вот так?


А если не будет в терминале тика в это время, то и цену не покажет.
А если в терминале будет 2 тика за эту секунду, то оно 2 раза цену покажет.

Как лучше организовать?

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

проще взять цену открытия 12-го часового бара дня

datetime tm;

int bs,DAY,H_12;

H_12=(iTime(Symbol(),PERIOD_D1,1)-iTime(Symbol(),PERIOD_D1,2))/2;

tm=iTime(Symbol(),PERIOD_D1,0)+H_12;

if(DAY!=TimeDay(TimeCurrent()))

{

   if(tm<=TimeCurrent())

   {

      bs=iBarShift(Symbol(),PERIOD_H1,tm);

      Alert(iOpen(Symbol(),PERIOD_H1,bs));

      DAY=TimeDay(TimeCurrent());

   }

}