Обсуждение статьи "Как использовать торговые классы Стандартной библиотеки при написании советника" - страница 2

 
Trolls:

подскажите что я неправильно делаю ? почему Bid не печатается ?

Вот лог работы


2011.01.31 20:20:18 00 (EURUSD,M1) EURUSD 0

вот код



 

Используйте \my_symbol.RefreshRates();\ вместо \my_symbol.Refresh();\. Тогда работает!
 
-Alexey-:
Используйте \my_symbol.RefreshRates();\ вместо \my_symbol.Refresh();\. Тогда работает!

Спасибо.

Это наверное вопрос уже к разработчикам или тому кто пишет Хелп.

В статье сказано

mysymbol.Refresh()
Используется для обновления всех данных по символу. При указании нового наименования символа для класса, она вызывается автоматически.


mysymbol.RefreshRates()
Используется для обновления котировок. При установке нового символа вызывается автоматически.  

1. Получается что не всех данных ?

2. Чем отличается указание нового символа от установки нового символа ?

3.  Не понятно слово автоматически. Вроде я установил символ командой my_symbol.Name(_Symbol), а обновление не произошло...

 
Trolls:

В статье сказано

mysymbol.Refresh()
Используется для обновления всех данных по символу. При указании нового наименования символа для класса, она вызывается автоматически.

mysymbol.RefreshRates()
Используется для обновления котировок. При установке нового символа вызывается автоматически.  

1. Получается что не всех данных ?

2. Чем отличается указание нового символа от установки нового символа ?

3.  Не понятно слово автоматически. Вроде я установил символ командой my_symbol.Name(_Symbol), а обновление не произошло...

Тот редкий момент, когда можно не дожидаться ответа автора статьи или автора справочника :) Достаточно посмотреть исходный код, чтобы увидеть, что RefreshRates() полностью дублирует функцию SymbolInfoTick(), которая "возвращает текущие цены  для указанного символа в переменной типа MqlTick".  Поэтому, когда авторы говорят "об обновлении котировок", речь фактически идёт об обновлении значений переменной типа MqlTick.

2. В исходном коде есть такая строчка

void  Name(string name)  { m_name=name; Refresh();}
Это говорит о том, что при вызове  функции Name() автоматически активизируется только функция  Refresh(). Про автоматическую активизацию функции RefreshRates() при вызове  функции Name() никакой информации не нашёл. Поэтому получается, что "по состоянию на сегодня" смена символа для функции Name() не влечёт автоматической активизации функции RefreshRates(). Придётся обновлять значения переменной типа MqlTick ("обновлять котировки") самостоятельно-принудительно.   
 
Trolls:

подскажите что я неправильно делаю ? почему Bid не печатается ? Вот лог работы  2011.01.31 20:20:18 00 (EURUSD,M1) EURUSD 0

вот код

void OnTick()
  {
   my_symbol.Name(_Symbol);
   my_symbol.Refresh();
   Print(_Symbol," ",my_symbol.Bid());
  }

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

double  Bid()  const { return(m_tick.bid);}

Тем самым,  значение функции Bid() привязано к значению одного из элементов переменной типа MqlTick. А эта переменная обновляется не автоматически при смене символа, а путём дополнительного вызова  функции RefreshRates(). В Вашем же коде вызывается  функция Refresh() - фактически, вызывается дважды (с учётом тела  функции Name()), - а функция RefreshRates() не вызывается ни разу.

 
Наверное можно усовершенствовать код, дописав в финальной части Refresh() вызов RefreshRates(). тогда действительно будут обновляться все данные....

 
Interesting:
Наверное можно усовершенствовать код, дописав в финальной части Refresh() вызов RefreshRates(). тогда действительно будут обновляться все данные....
Я дописывал вызов RefreshRates() в функцию Name(). Но всё равно - это заплатки на уровне отдельного пользователя под его нужды.
 
Yedelkin:
Я дописывал вызов RefreshRates() в функцию Name(). Но всё равно - это заплатки на уровне отдельного пользователя под его нужды.

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

Если говорим что Refresh обновляет все данные, значит должны действительно все быть обновлены. ИМХО


 
Interesting:

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

Если говорим что Refresh обновляет все данные, значит должны действительно все быть обновлены. ИМХО

С этим спору нет. Но, всё-таки, нормальным решением для пользователей будет чёткое и понятное описание имеющихся конструкций и их свойств. Дальше пользователь сам разберётся, как именно ему использовать эти конструкции. А поскольку такое решение труднодостижимо в силу разных причин, продвигаться вперёд будет тот, кто задаёт дополнительные вопросы себе и окружающим :)
 
Yedelkin:
С этим спору нет. Но, всё-таки, нормальным решением для пользователей будет чёткое и понятное описание имеющихся конструкций и их свойств. Дальше пользователь сам разберётся, как именно ему использовать эти конструкции. А поскольку такое решение труднодостижимо в силу разных причин, продвигаться вперёд будет тот, кто задаёт дополнительные вопросы себе и окружающим :)

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

Вот еще дождусь когда конструкторы сделают более удобными тогда совсем откажусь от стандартной библы...

Документация по MQL5: Стандартная библиотека
Документация по MQL5: Стандартная библиотека
  • www.mql5.com
Стандартная библиотека - Документация по MQL5
 

Кстати, обнаружил, что в классе  CHistoryOrderInfo имеется пара вот таких строчек

return(FormatType(str,Type()));
...
FormatType(type,Type())

 Но функция Type() в классе отсутствует.

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