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

В Учебнике такая фраза.
Функция возвращает количество скопированных элементов массива либо -1 в случае ошибки, код которой можно узнать из _LastError. В частности, ошибка возникнет, если задан несуществующий символ, интервал не содержит данных на сервере или выходит за ограничение по количеству баров на графике (TerminalInfoInteger(TERMINAL_MAXBARS)).
Но у меня не возникает ошибки.
void OnStart()
{
  MqlRates Rates[];
  
  Print(CopyRates(_Symbol, PERIOD_M1, D'1970.01.01', D'2100.01.01', Rates)); // 5000
  Print(_LastError); // 0
}
Как понять, что бары не все получены из-за низкого MaxBars?
Учебник по MQL5: Получение котировок в виде массива структур MqlRates / Создание прикладных программ
Учебник по MQL5: Получение котировок в виде массива структур MqlRates / Создание прикладных программ
  • www.mql5.com
Для запроса массива котировок, включающего все характеристики баров, предназначена функция CopyRates , имеющая несколько перегрузок. int...
fxsaber #:
В Учебнике такая фраза. Но у меня не возникает ошибки. Как понять, что бары не все получены из-за низкого MaxBars?
Через костыль.
datetime NextMonth( const datetime Time )
{
  MqlDateTime sTime = {};

  if (::TimeToStruct(Time, sTime))
  {
    if (sTime.mon++ == 12)
    {
      sTime.year++;
      sTime.mon = 1;
    }

    sTime.day = 1;

    sTime.hour = 0;
    sTime.min = 0;
    sTime.sec = 0;
  }

  return(::StructToTime(sTime));
}

bool IsFull( const string Symb, const MqlRates &Rates[] )
{
  datetime Month[] = {0};
  
  return(ArraySize(Rates) && CopyTime(Symb, PERIOD_MN1, (datetime)0, 1, Month) && (NextMonth(Month[0]) > Rates[0].time));
}

void OnStart()
{
  MqlRates Rates[];
  
  if (CopyRates(_Symbol, PERIOD_M1, 0, INT_MAX, Rates) && !IsFull(_Symbol, Rates))
    Alert("MaxBars!");
}
Есть нормальные решения?
fxsaber #:
Через костыль. Есть нормальные решения?

 //--- максимально баров в Терминале
      int terminal_maxbars = TerminalInfoInteger(TERMINAL_MAXBARS);
      //--- время на которое приходится самый первый бар Треминала
      datetime first_bar_time=iTime(_Symbol,_Period,terminal_maxbars-1);

сравниваем запрос и first_bar_time ?

lynxntech #:

сравниваем запрос и first_bar_time ?

Может запросто быть равен нулю при больших значениях MaxBars.

Добрый день!

Обращаюсь с просьбой помочь решить проблему скрипта OX при работе с MultiTester - библиотека для MetaTrader 5.
Библиотека установлена последней версии: www.mql5.com/ru/code/26132 

Необходимо загрузить сет 214-10000 HEX-449.set в робота F, который находится в тестере стратегий (но оптимизация не включена).
В него вручную загружен сет 214-10000 MFI-3218.set.

Скрипт OX сначала считывает сет 214-10000 HEX-449.set из папки в локальной песочнице при помощи процедуры FileLoad в строку Settings.
Распечатывает Settings для проверки правильности считывания (здесь все нормально, печатает размер Load: 3498).
Потом идет попытка загрузки в робота при помощи команды:
MTTESTER::SetSettings(Settings).

Вот эта команда и не работает, хотя и возвращает true. 
Но в параметрах робота F ничего не меняется, там по-прежнему вручную загруженный сет 214-10000 MFI-3218.set,
хотя картинка тестера дёргается (т.е. может идёт попытка загрузки, но неудачная).

Qwen-coder и DeepSeek дали несколько советов, но ни один не помог.
Замена SetSettings на SetSettings2 тоже не помогает.

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

С уважением, Александр.
Файлы:
fxsaber # :
В Учебнике такая фраза. Но у меня не возникает ошибки. Как понять, что бары не все получены из-за низкого MaxBars?

Данная часть документации относится к случаям использования параметра "count".


Alain Verleyen #:

Данная часть документации относится к случаям использования параметра "count".

К сожалению, это работает только на реальных символах. На пользовательских символах ошибка не возникает.

fxsaber # :

К сожалению, это работает только на реальных символах. На пользовательских символах ошибка не возникает.

Верно, возвращается только одна полоска, последняя.

Я сообщу об этом как об ошибке.

fxsaber #:

К сожалению, это работает только на реальных символах.

Столкнулся с ситуациями, когда не работает это условие.
bool IsFullAccess( const string Symb = NULL )
{
  MqlRates Rates[1];
  
  bool Res = false;
/*
  if (!SymbolInfoInteger(Symb, SYMBOL_CUSTOM))
    Res = (CopyRates(Symb, PERIOD_M1, D'1970.01.01', 1, Rates) != -1);    
  else
*/  
  if (CopyRates(_Symbol, PERIOD_MN1, D'1970.01.01', 1, Rates) > 0)
  {
    MqlRates Rates2[1];
    
    Res = (CopyRates(_Symbol, PERIOD_M1, D'1970.01.01', 1, Rates2) > 0) &&
          (Rates[0].time == GetMonth(Rates2[0].time)) && (Rates[0].open == Rates2[0].open);  
  }
  
  return(Res);
}

Ставил ограничение на 6000 баров и перезагружал терминал.

fxsaber # :
Столкнулся с ситуациями, когда не работает это условие.

Ставил ограничение на 6000 баров и перезагружал терминал.

Сложно понять, чего вы пытаетесь добиться?

(Этот код не компилируется).