Можно ли вывести текущее время через кнопку, при условии что оно не будет зависать при отсутствии тика?

 
Добрый день, имеется простой индикатор отображения текущего времени, который не останавливается если нету тика.
Вопрос, как еще можно сделать отображение времени через кнопку, при условии что при отсутствии тика время не будет зависать?
тут через таймер вывел:
//+------------------------------------------------------------------+
//|                                                         Time.mq4 |
//|                                                      Loev Nikita |
//|                                         https://www.loevblog.com |
//+------------------------------------------------------------------+
#property copyright "Loev Nikita"
#property link      "https://www.loevblog.com"
#property version   "1.00"
#property strict
#property indicator_chart_window

string perDayWeek = "";
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
  EventSetTimer(1); 
//---

   ObjectCreate(0,"but",OBJ_BUTTON,0,0,0);
//--- установим координаты объекта 
   ObjectSetInteger(0,"but",OBJPROP_XDISTANCE,200); 
   ObjectSetInteger(0,"but",OBJPROP_YDISTANCE,18); 
   ObjectSetInteger(0,"but",OBJPROP_CORNER,CORNER_RIGHT_UPPER); 
//--- установим размеры объекта 
   ObjectSetInteger(0,"but",OBJPROP_XSIZE,150); 
   ObjectSetInteger(0,"but",OBJPROP_YSIZE,25);
//--- установим текст 
   ObjectSetString(0,"but",OBJPROP_TEXT," Нажми на меня"); 
//--- установим начлаьное положение кнопки 
   ObjectSetInteger(0,"but",OBJPROP_STATE,false);
   
   ObjectCreate(0,"time",OBJ_LABEL,0,0,0);
   //--- установим координаты метки 
   ObjectSetInteger(0,"time",OBJPROP_XDISTANCE,200); 
   ObjectSetInteger(0,"time",OBJPROP_YDISTANCE,50); 
//--- установим угол графика, относительно которого будут определяться координаты точки 
   ObjectSetInteger(0,"time",OBJPROP_CORNER,CORNER_RIGHT_UPPER); 
   //--- установим цвет 
   ObjectSetInteger(0,"time",OBJPROP_COLOR,clrRed); 
//--- установим текст 
   ObjectSetString(0,"time",OBJPROP_TEXT,""); 
   
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
   ObjectDelete(0,"but");
   
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  
}
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {

//--- время торгового сервера при первом вызове OnTimer();
   static datetime start_tradeserver_time=TimeCurrent();
//--- вычисляемое время торгового сервера
   static datetime calculated_server_time=TimeCurrent();

   
  if(DayOfWeek()==1)
      perDayWeek="Понедельник  /  ";
   if(DayOfWeek()==2)
      perDayWeek="Вторник  /  ";
   if(DayOfWeek()==3)
      perDayWeek="Среда  /  ";
   if(DayOfWeek()==4)
      perDayWeek="Четверг  /  ";
   if(DayOfWeek()==5)
      perDayWeek="Пятница  /  ";
   if(DayOfWeek()==6)
      perDayWeek="Суббота  /  ";
   if(DayOfWeek()==0)
      perDayWeek="Воскресенье  /  ";   
     
    if(ObjectGetInteger(0,"but",OBJPROP_STATE) == true)
      {
       string time=perDayWeek+TimeToString(calculated_server_time,TIME_MINUTES|TIME_SECONDS);
       ObjectSetString(0,"time",OBJPROP_TEXT,time); 
      }

    if(ObjectGetInteger(0,"but",OBJPROP_STATE) == false)
      {
       string time=perDayWeek+TimeToString(calculated_server_time,TIME_MINUTES|TIME_SECONDS);
       ObjectSetString(0,"time",OBJPROP_TEXT,"");
      }


    calculated_server_time=calculated_server_time+1;
   
  }
 
Таймер, все через таймер, как уже сказано в предыдущей теме.
Как сделать отжатие кнопки через 1 секунду
Как сделать отжатие кнопки через 1 секунду
  • 2020.08.28
  • www.mql5.com
Добрый день, собственно тема и есть вопрос. Нужно чтобы при нажатии на кнопку произошло действие и кнопка выключилась не сразу а через секунду/две...
 
Ihor Herasko:
Таймер, все через таймер, как уже сказано в предыдущей теме.

Спасибо за ответ, так тут и сделал через таймер, но при нажатии есть задержка небольшая, можно ли как то не через таймер сделать?

 
vebster005:

Спасибо за ответ, так тут и сделал через таймер, но при нажатии есть задержка небольшая, можно ли как то не через таймер сделать?

Так а зачем Вы в таймере используете TimeCurrent()? Таймер сам считает время. Не нужно ничего запрашивать. Логика должна быть такая:

  1. Нажата кнопка. Запуск таймера (или возведение флага, если таймер будет использован для каких-то других целей).
  2. Сработал таймер. Отжатие кнопки. Удаление таймера или сброс флага на отжатие кнопки.
Задержка происходит только по одной причине - нет обновления графика (обновления происходят по тикам). Для обновления графика нужно использовать ChartRedraw().
 
Добрый день, ребят объясните почему при смене ТФ удаляется текст?