Ошибки, баги, вопросы - страница 2050

 

Подскажите, а есть рабочий демо-сервер МТ4 и МТ5 с котировками в выходные?

 
Kirill Belousov:

Подскажите, а есть рабочий демо-сервер МТ4 и МТ5 с котировками в выходные?

Демо сервер на то и демо что торговля ведётся на не реальные деньги а на "демо" :), а всё остальное (также и время поступление котировок) почти как в реале.

 
Kirill Belousov:

Подскажите, а есть рабочий демо-сервер МТ4 и МТ5 с котировками в выходные?

В выходные котировок нет. 
Можете эмулировать поступление котировок. 
 

Выводим MT5 в оффлайн (левый прокси, например) и запускаем такой советник

void OnInit()
{
  Print("Hello World!");
}

Распечатка в логе будет только через пять секунд после запуска советника - БАГ.


Запускаем такой индикатор в оффлайне

#property indicator_chart_window

#property indicator_buffers 0
#property indicator_plots 0

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(rates_total);
}

void OnInit()
{
  const datetime LastBar = (datetime)SeriesInfoInteger(_Symbol, PERIOD_CURRENT, SERIES_LASTBAR_DATE);

  Print(LastBar);
  Print(Bars(_Symbol, PERIOD_CURRENT, LastBar - 24 * 3600, LastBar)); // 0
  Print(GetLastError());                                              // ERR_HISTORY_NOT_FOUND
}

Получаем облом в Bars. Причем тот же облом будет и при повторных вызовах, например, в OnTimer. А если Bars вызывать в советнике - все будет работать. В случае с индикатором явный баг.

2017.10.22 23:35:40.678 Terminal        Alpari Limited MT5 x64 build 1653 started (Alpari Limited)
2017.10.22 23:35:40.678 Terminal        Windows 7 Ultimate (x64 based PC), IE 09.00, Intel Core i7-2700K  @ 3.50GHz, RAM: 11310 / 16301 Mb, HDD: 827 / 30000 Mb, GMT+02:00
ЗЫ Пояснение в Документации ничего не объясняет

Если данные для таймсерии с указанными параметрами при вызове функции Bars() еще не сформированы в терминале, или данные таймсерии в момент вызова функции не синхронизированы с торговым сервером, то функция вернет нулевое значение.

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

 

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

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2017.10.17 15:07

Массивы потомков не в состоянии преобразоваться в массивы предков. А вот поэлементно - да. В этом имеется ограничение ArrayCopy, которое было бы хорошо снять.

Что-то неправильное с языком в данной ситуации

struct RATES : public MqlRates {};

void f1( RATES& ) {}

void f2( MqlRates& ) {}
void f2( MqlRates &[] ) {}

void OnStart()

{
  MqlRates a = {0};  
  
  f1(a); // 'a' - parameter conversion not allowed
  
  RATES b[1] = {0};
  
  b[0] = a; // no problem
  a = b[0]; // no problem
  
  f2(b[0]); // no problem
  f2(b);    // 'f2' - no one of the overloads can be applied to the function call
}


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

Что-то неправильное с языком в данной ситуации

У меня компилятор выдал


 
Kirill Belousov:

У меня компилятор выдал

Да, подправил сообщение.
 
   int tim=(int)FileGetInteger(aFileName,FILE_CREATE_DATE);
   int cur_tim=(int)TimeCurrent();

   RefreshRates();
   if(FileGetInteger(aFileName,FILE_EXISTS)==1)
      if(tim>0)
         if((cur_tim-tim)>120) 
           {
            Print(" ttt   "+TimeToString(cur_tim)+"  "+TimeToString(tim));
            FileDelete(aFileName);
            Print("Обновление файла ");
            return false;
           }

int tim=(int)FileGetInteger(aFileName,FILE_CREATE_DATE);    не обновляет время.

Создаю файл и хочу его удалить через 60 секунд, файл удаляется а int tim=(int)FileGetInteger(aFileName,FILE_CREATE_DATE); возвращает время первого файла после компиляции.  В окне виндовс я вижу что файл удаляется и создается с новым временем.

RefreshRates не помогает...

 

int tim=(int)FileGetInteger(aFileName,FILE_MODIFY_DATE);

Работает правильно

 
Vladimir Pastushak:

int tim=(int)FileGetInteger(aFileName,FILE_CREATE_DATE);    не обновляет время.

Создаю файл и хочу его удалить через 60 секунд, файл удаляется а int tim=(int)FileGetInteger(aFileName,FILE_CREATE_DATE); возвращает время первого файла после компиляции.  В окне виндовс я вижу что файл удаляется и создается с новым временем.

RefreshRates не помогает...

Где код создания файла?

Перед удалением файла Вы его закрываете?

При чём здесь RefreshRates?

Речь о пятёрке или о четвёрке?