Справка по языку MQL5 - страница 48

 
nen писал(а) >>

TimeCurrent

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

--------------

А можно увидеть пример. Допустим мы прикрепили эксперт к графику eurusd. С этим графиков все понятно. Но раз в формулировке говорится по одному из выбранных в "Обзоре рынка" символов, то хотелось бы получить время прихода последней котировки по gbpusd. При этом эксперт находится на графике eurusd.

-------------

Или же более четкую формулировку в Справке сделайте. Не по одному из, а по тому, к графику которого прикреплен эксперт.

Так и спрашивайте время прихода последней котировки по gbpusd при помощи запроса к MarketInfo

Чем не нравится нынешняя формулировка? По-моему, совершенно однозначная формулировка.

 
nen >>:

Я тоже так думаю. Но...

Хотелось бы от разработчиков получить четкий ответ. И в Справке исправить двусмысленность.

На этот случай в справку добавлен пример (пока не вошел в опубликованную версию).

//+------------------------------------------------------------------+
//|                                            ButtonClickExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

string buttonID="Button";
string labelID="Info";
int broadcastEventID=5000;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- создадим кнопку, для передачи пользовательских событий
   ObjectCreate(0,buttonID,OBJ_BUTTON,0,100,100);
   ObjectSetInteger(0,buttonID,OBJPROP_COLOR,White);
   ObjectSetInteger(0,buttonID,OBJPROP_BGCOLOR,Gray);
   ObjectSetInteger(0,buttonID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,buttonID,OBJPROP_XSIZE,200);
   ObjectSetInteger(0,buttonID,OBJPROP_YSIZE,50);
   ObjectSetString(0,buttonID,OBJPROP_FONT,"Arial");
   ObjectSetString(0,buttonID,OBJPROP_TEXT,"Кнопка");
   ObjectSetInteger(0,buttonID,OBJPROP_FONTSIZE,10);
   ObjectSetInteger(0,buttonID,OBJPROP_SELECTABLE,0);

//--- создадим метку для вывода информации
   ObjectCreate(0,labelID,OBJ_LABEL,0,100,100);
   ObjectSetInteger(0,labelID,OBJPROP_COLOR,Red);
   ObjectSetInteger(0,labelID,OBJPROP_XDISTANCE,100);
   ObjectSetInteger(0,labelID,OBJPROP_YDISTANCE,50);
   ObjectSetString(0,labelID,OBJPROP_FONT,"Trebuchet MS");
   ObjectSetString(0,labelID,OBJPROP_TEXT,"Нет информации");
   ObjectSetInteger(0,labelID,OBJPROP_FONTSIZE,20);
   ObjectSetInteger(0,labelID,OBJPROP_SELECTABLE,0);

//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit()
  {
//---
   ObjectDelete(0,buttonID);
   ObjectDelete(0,labelID);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---

  }
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- проверим событие на нажатие кнопки мышки
   if(id==CHARTEVENT_OBJECT_CLICK)
     {
      string clickedChartObject=sparam;
      //--- если нажатие на объекте с именем buttonID
      if(clickedChartObject==buttonID)
        {
         //--- состояние кнопки - нажата кнопка или нет
         bool selected=ObjectGetInteger(0,buttonID,OBJPROP_STATE);
         //--- выведем в лог отлпдочное сообщение
         Print("Кнопка нажата =",selected);
         int customEventID; // номер пользовательского события для отправки
         string message;    // сообщение для отправки в событии
         //--- если кнопка нажата
         if(selected)
           {
            message="Кнопка нажата";
            customEventID=CHARTEVENT_CUSTOM+1;
           }
         else // кнопка не нажата
           {
            message="Кнопка отжата";
            customEventID=CHARTEVENT_CUSTOM+999;
           }
         //--- отправим пользовательское событие "своему"графику
         EventChartCustom(0,customEventID-CHARTEVENT_CUSTOM,0,0,message);
         //--- отправим сообщение всем открытым графикам
         BroadcastEvent(ChartID(),0,"Broadcast Message");
         //--- отладочное сообщение
         Print("Отправлено событие с ID =",customEventID);
        }
      ChartRedraw();// принудительно перерисуем все объекты на графике
     }

//--- проверим событие на принадлежность к пользовательским событиям
   if(id>CHARTEVENT_CUSTOM)
     {
      if(id==broadcastEventID)
        {
         Print("Получили широковещательное соощение от графика с id="+lparam);
        }
      else
        {
         //--- прочитаем текстовое сообщение в событии
         string info=sparam;
         Print("Обрабатывается ПОЛЬЗОВАТЕЛЬСКОЕ событие с ID =",id);
         //--- выведем сообшение в метке
         ObjectSetString(0,labelID,OBJPROP_TEXT,sparam);
         ChartRedraw();// принудительно перерисуем все объекты на графике
        }
     }
  }
//+------------------------------------------------------------------+
//| послать широковещательное сообщение всем открытм графикам        |
//+------------------------------------------------------------------+
void BroadcastEvent(long lparam,double dparam,string sparam)
  {
   int limit=100;// у нас наверняка не больше 100 открытых графиков
   int eventID=broadcastEventID-CHARTEVENT_CUSTOM;
   long currChart,prevChart=ChartFirst();
   int i=0;
   while(i<limit)
     {
      currChart=ChartNext(prevChart); // на основании предыдущего получим новый график
      if(currChart==0) break;         // достигли конца списка графиков
      EventChartCustom(currChart,eventID,lparam,dparam,sparam);
      prevChart=currChart;// запомним идентификатор текущего графика для ChartNext()
      i++;// не забудем увеличить счетчик
     }
  }
//+------------------------------------------------------------------+


Если запустить этот эксперт на рахных графиках, то нажимая кнопку на одном из них, можно увидеть нечто подобное.



 
stringo писал(а) >>

Так и спрашивайте время прихода последней котировки по gbpusd при помощи запроса к MarketInfo

Чем не нравится нынешняя формулировка? По-моему, совершенно однозначная формулировка.

В справке написано про TimeCurrent:

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

И показано, как вызывать. Два варианта. Но раз в формулировке написано, время прихода последней котировке по выбранному символу, то напрашивается естественный вопрос, как именно с помощью этой функции получить время по выбранному символу, по одному из выбранных символов. Это и является шероховатостью формулировки.

-----------

Правильная формулировка будет, например, такая:

Возвращает последнее известное время сервера, время прихода последней котировки по символу, к графику которого прикреплен эксперт.

-----------

-----------

Когда встречаются такие шероховатости, то первым делом делается попытка сделать именно то, что НАПИСАНО.

 
nen >>:

В справке написано про TimeCurrent:

Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов.

И показано, как вызывать. Два варианта. Но раз в формулировке написано, время прихода последней котировке по выбранному символу, то напрашивается естественный вопрос, как именно с помощью этой функции получить время по выбранному символу. Это и является шероховатостью формулировки.


То есть, Вы настаиваете фактически на такой формулировке:

Возвращает последнее известное время сервера, время прихода последней котировки по какому-либо из доступных в "Обзоре рынка" символов.

 
Справка обновлена
 
nen писал(а) >>

Правильная формулировка будет, например, такая:

Возвращает последнее известное время сервера, время прихода последней котировки по символу, к графику которого прикреплен эксперт.

Нет. Это будет верно только для функции OnTick в самом начале её работы. Если вы проработаете на ОнТике больше секунды, то это утверждение может оказаться неверным.

На OnTimer, OnChartEvent, OnInit, OnDeinit etc это утверждение с большой вероятностью будет неверным

 

Возвращает последнее известное время сервера, время прихода последней котировки по символу, к графику которого прикреплен эксперт.

========

Одному из... или по какому либо... - выражения, которые допускают расширенную трактовку написанного.

========

Я пытаюсь читать Справку глазами человека впервые читающего Справку и мало знакомого с тем, что в Справке написано, не знакомого с МТ5. И стараюсь делать буквально то, что написано.

Приведу ход мыслей, которые были при обращении в Справке к этой функции. С маркетинфо дело иметь ранее не приходилось. Поэтому стал искать, каким образом получить доступ к потоку тиков, идущих к графику символа, к которому не прикреплен эксперт. Ранее при беглом просмотре в функции TimeCurrent запомнилось именно выражение: Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. Ага, значит с помощью этой функции можно получить время по выбранному символу. Не сказано, каким образом выбранного. Стал искать, а как выбрать символ. В параметрах функции не прописано. Слова по одному из выбранных и смутили.

========

Наверное, я слишком сильно придираюсь. Но если есть возможность неоднозначного прочтения, то такие формулировки необходимо менять.

 
stringo писал(а) >>

Нет. Это будет верно только для функции OnTick в самом начале её работы. Если вы проработаете на ОнТике больше секунды, то это утверждение может оказаться неверным.

На OnTimer, OnChartEvent, OnInit, OnDeinit etc это утверждение с большой вероятностью будет неверным

Интересный ход мысли...

фантазия разыгрывается...

Это тем более требует более детального разбора.

--------

Поэтому и попросил привести пример.

А теперь уже и не один пример может быть нужен.

--------

Говорят: Черт прячется в деталях. Это в том числе и про этот случай.

 
Зачем чего-то разбирать? Совершенно однозначная формулировка для документации. Всё остальное - предмет для написания статей.
 
nen писал(а) >>

Приведу ход мыслей, которые были при обращении в Справке к этой функции. С маркетинфо дело иметь ранее не приходилось. Поэтому стал искать, каким образом получить доступ к потоку тиков, идущих к графику символа, к которому не прикреплен эксперт. Ранее при беглом просмотре в функции TimeCurrent запомнилось именно выражение: Возвращает последнее известное время сервера, время прихода последней котировки по одному из выбранных в "Обзоре рынка" символов. Ага, значит с помощью этой функции можно получить время по выбранному символу. Не сказано, каким образом выбранного. Стал искать, а как выбрать символ. В параметрах функции не прописано. Слова по одному из выбранных и смутили.

Выбор символов в "Обзоре рынка" - это скорее относится к клиентскому терминалу и окну "Обзор рынка". А не к программированию на MQL.

То есть, прежде чем начать программировать, хорошо бы ознакомиться с предметной областью, с функциональностью клиентского терминала.

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