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

 
Mikhail Nazarenko:

MT4 это темная коробка, и о том что там происходит я сужу только тестируя в реальных условиях. Изначально sleep вообще я не использовал, но когда на некоторых часовых барах получал чушь, добавил sleep и проблема исчезла. В какой последовательности и как обновляются таймсерии MT4 я ХЗ. Пусть меня ругают "свидетели наичистейшего истинного кода", главное что я решил свои проблемы, чем и делюсь.

Сам столкнулся с этим, в тестере всё чётко, на реальном рынке - чушь.

Гоняю советник с понедельника и удивляюсь.

Несколько открытий верны, после этого снова бай, вместо селл и наоборот.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам

Vitaly Muzichenko, 2021.02.15 21:48

Открыл мт4 чтобы по-быстрому проверить алгоритм.

Очень странно, что в тестере работает правильно, а после установки на реал - реверс сделок. Код простейший, всего 2 индикаторных буфера



Код индикатора простейший

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }
 
Vitaly Muzichenko:

Сам столкнулся с этим, в тестере всё чётко, на реальном рынке - чушь.

Гоняю советник с понедельника и удивляюсь.

Несколько открытий верны, после этого снова бай, вместо селл и наоборот.


Код индикатора простейший

Это таже хрень с которой столкнулся я до открытия этой ветки. На реале по каким-то причинам терминал дает устаревшие данные, я там выше функцию запилил isRefresh(). Попробуй с ней. У меня все заработало нормально.

А это у тебя не проскальзывание?

 
Vitaly Muzichenko:

Код индикатора простейший

а разве индикатор открывает сделки?

стрелки стоят одинаково - проблема в коде ЕА

 
Mikhail Nazarenko:

Начал учить, так помоги, подтверди кодом, тестами, ссылкой на тему в форуме или документации. Все остальное это мозговая мастурбация.

Уточни плиз, что осталось неясно. Прочитав показалось что основной вопрос решен и осталось обсудить насколько 4-ка устарела)

У меня не было проблем после вставки такой загрузки таймфреймов

bool HistoryCheck(int TF)
  {
   int err=0;   
   int i=0;
   datetime d1=0,d2=0;
   while(i<10)
    { 
    if((d1=iTime(NULL,TF,0))==0 || (d2=iTime(NULL,TF,InpPeriod*2))==0)          
        PrintFormat("itime=0, %s, %s", TimeToString(d1),TimeToString(d2)) ; 
   err=GetLastError();    
   if(err==4066)    
    {
    	PrintFormat("Error=4066") ; 
    	Sleep(500);     	
    }
   else break;	
      SleepA(100);
      i++;                 
    } // while
   if(i==10)
	 { Comment("Update failed. Go to the next attempt."); return(false); }
   PrintFormat("HistoryCheck %d , %s, %s",i,TimeToString(d1),TimeToString(d2)) ;
   Comment(""); 
   return(true);
  }

Если вам нужно редко и нерегулярно обращаться к таймфрейму, то эту загрузку надо(но необязательно если открыт график)  выполнять снова перед проверкой, или поможет такая проверка

  if((iTime(NULL,TF,0)+PeriodSeconds(TF))<TimeCurrent()
   || (iTime(NULL,TF,1)+PeriodSeconds(TF)*2)<TimeCurrent())
   HistoryCheck(TF)
Документация по MQL5: Операции с графиками / ChartOpen
Документация по MQL5: Операции с графиками / ChartOpen
  • www.mql5.com
ChartOpen - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

Это таже хрень с которой столкнулся я до открытия этой ветки. На реале по каким-то причинам терминал дает устаревшие данные, я там выше функцию запилил isRefresh(). Попробуй с ней. У меня все заработало нормально.

А это у тебя не проскальзывание?

Нет, открытие на новом 0 баре, сигнал ищется по закрытому бару, то есть 1.

Вот иногда и возникает ситуация, что советник через iCustom() получает не то, что ожидается. Опять-же: иногда, но не часто.

Вот ещё есть - свежее. Открыл бай верно - по сигналу, следующий сигнал с индикатора так-же бай (внизу стрелка), но эксперт через iCustom() получил почему-то сигнал на селл, при этом закрыл бай и открыл селл, хотя там должно быть открытие второго бай. 

Что-то видать не то с таймсериями, пока не разбирался, обнаружено 4 дня назад, да и разбираться скорее всего не буду, перенесу расчёт в советник. В тестере проблем не увидел ни разу

Вот прям сейчас

--- И ещё только что нашёл


 

И ещё, но уже вместо селл, открыт бай. Как и говорил, не часто такое, но бывает

Код индикатора простейший - нет никаких заумностей


 
Aleksey Mavrin:

Уточни плиз, что осталось неясно. Прочитав показалось что основной вопрос решен и осталось обсудить насколько 4-ка устарела)

У меня не было проблем после вставки такой загрузки таймфреймов

Если вам нужно редко и нерегулярно обращаться к таймфрейму, то эту загрузку надо(но необязательно если открыт график)  выполнять снова перед проверкой, или поможет такая проверка

Все правильно,

это из справки:

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


Если запрашивается информация с другого графика (название инструмента и/или значение таймфрейма отличаются от текущих), то возможна ситуация, что в клиентском терминале не открыт соответствующий график и необходимые данные должны быть запрошены у сервера. В этом случае в переменную _Last_error будет помещена ошибка ERR_HISTORY_WILL_UPDATED (4066 - запрошенные исторические данные в состоянии обновления) и необходимо через некоторое время повторить попытку запроса (см. пример ArrayCopySeries()).

 
Vitaly Muzichenko:

И ещё, но уже вместо селл, открыт бай. Как и говорил, не часто такое, но бывает

Код индикатора простейший - нет никаких заумностей


Самый достоверный метод - писать лог. На каждой сделке писать в файл значения ключевых переменных. Из опыта: не строгое условие <=0 вместо <0 вносило жуткую кривость.

 
Vitaly Muzichenko:

Сам столкнулся с этим, в тестере всё чётко, на реальном рынке - чушь.

Гоняю советник с понедельника и удивляюсь.

Несколько открытий верны, после этого снова бай, вместо селл и наоборот.


Код индикатора простейший

   double poi=Point();
   for(int i = limit-2; i>0; i--) {
      if(open[i+0] > close[i+0] && MathAbs(open[i+0] - high[i+0]) < 0.1 * poi)
         Dn[i] = high[i+0] + 30 * poi;
      if(open[i+0] < close[i + 0] && MathAbs(open[i+0] - low[i+0]) < 0.1 * poi)
         Up[i] = low[i+0] - 30 * poi;
   }


А зачем прибавлять 0  в [i + 0] ?

 
Aleksey Mavrin:

Уточни плиз, что осталось неясно. Прочитав показалось что основной вопрос решен и осталось обсудить насколько 4-ка устарела)

У меня не было проблем после вставки такой загрузки таймфреймов

Если вам нужно редко и нерегулярно обращаться к таймфрейму, то эту загрузку надо(но необязательно если открыт график)  выполнять снова перед проверкой, или поможет такая проверка

Спасибо, это по делу. А терминал реально дает ошибку 4066 после обращения через iTime к необновленной таймсерии? Я столкнулся с тем что iClose отдает необновленную информацию вместо нуля.

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