Что обновляет функция RefreshRates() - страница 3

 
Artyom Trishkin:

Если подозреваете ошибки в функциях iXXXXX, используйте функции SymbolInfoXXXX

Можно пример замены iXXXXX на SymbolInfoXXXX.

 
Mikhail Nazarenko:

Код у меня похожий. Ошибка в OnTick 

надо

Если у нас текущий таймфрейм M5 cравнивать надо М5 c H1 и M1

Текущий таймфрейм а именно M5 у меня отображался корректно. Проблема была с H1 и M1. 

Я проверял на Альпари реал EURCHF M5 только вместо Print рисовал горизонтальные отрезки на каждом из уровней.

Да, я сначала так и поставил Н1, но потом решил, что это будет слишком редкие сравнения. Вот и поменял на М5.

Mikhail Nazarenko:

Можно пример замены iXXXXX на SymbolInfoXXXX.

Артём чуток ошибся…

Вместо iClose можно использовать

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

примерно так

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

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

Функция возвращает true или false но я проверки в этом примере не сделал. Сами сможете догадаться…

 
Alexey Viktorov:
Да, я сначала так и поставил Н1, но потом решил, что это будет слишком редкие сравнения. Вот и поменял на М5.

Я там дорисовал твой код и выложил выше. Поставил твой вариант у себя, результат тотже. Идет не соответствие почти на каждой свече M5. У тебя какие результаты?

 
Mikhail Nazarenko:

Я там дорисовал твой код и выложил выше. Поставил твой вариант у себя, результат тотже. Идет не соответствие почти на каждой свече M5. У тебя какие результаты?

Здесь надо изменить

if(NewBar(PERIOD_M5))

на

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

Здесь надо изменить

на

Нет, лучше _Period. Так как мы будем принудительно ждать появления нулевой котировки от H1, а текущий период исправно обновляется. Надо чтобы данные были получены на первых секундах часа, а не когда час обновится.

Хочу добавить в пример и проверить
double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

 
Alexey Viktorov:

Здесь надо изменить

на

Результат такой же как и от iClose(); Пожоже iClose и CopyClose берут данные в одном и томже месте.

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Нет, лучше _Period. Так как мы будем принудительно ждать появления нулевой котировки от H1, а текущий период исправно обновляется. Надо чтобы данные были получены на первых секундах часа, а не когда час обновится.

Хочу добавить в пример и проверить

Похоже, что вы вообще не понимаете как работает функция появления нового бара.

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/ 

И следовательно

Mikhail Nazarenko:

Результат такой же как и от iClose(); Пожоже iClose и CopyClose берут данные в одном и томже месте.

При получении значений закрытия бара и\или других из OHLC при поступлении нового ТИКА значения всегда без проблем.
 
Alexey Viktorov:

Похоже, что вы вообще не понимаете как работает функция появления нового бара.

И следовательно

При получении значений закрытия бара и\или других из OHLC при поступлении нового ТИКА значения всегда без проблем.

Ответь на вопрос. Почему на новой свече функция iClose(1) отдает устаревшую информацию, а не обновленную или ошибку? Это баг.

 
Mikhail Nazarenko:

Ответь на вопрос. Почему на новой свече функция iClose(1) отдает устаревшую информацию, а не обновленную или ошибку? Это баг.

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

Сейчас у меня поставлен советник на М15 с определением нового бара Н1

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_H1))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M5[0], "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

И  вот что в комментарии

Нет никаких расхождений.

 
Ладно, спасибо всем разработчикам за внимание, пошел создавать костыли типа NewBar.))) Тема закрыта.
Причина обращения: