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

 
Возможно ли сделать StringReplace удобнее/логичнее в использовании?
int  StringReplace( 
   string&         str,              // строка, в которой будет осуществляться замена 
   const string    find,             // искомая подстрока 
   const string    replacement,      // подстрока, которая будет вставлена в найденные места 
   const uint Amount = 0             // Максимальное количество замен, 0 - все меняем.
   );

Например, если знаем, что искомая строка для замены встречается всего один раз, то зачем расходовать вычислительные ресурсы на поиск после первой же замены?

 

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

 
Баг тестера
void OnInit()
{
  ExpertRemove();

  Print((bool)_StopFlag); // Реал - true, тестер - false
}
 
_StopFlag и IsStopped() не являются bool. Подправьте Справку.
void OnStart()
{
  Print(_StopFlag);   // 0
  Print(IsStopped()); // 0
  
  bool StopFlag = _StopFlag;
  
  Print(StopFlag); // false
}
 

В тестере при снятии денег невозможно задать комментарий. Прошу дополнить

bool  TesterWithdrawal( 
   double money      // размер снимаемой суммы 
   const string Comment = "withdrawal"
   );
 

В тестере только с локальными Агентами получаю такое сообщение

Tester  debug version of "fxsaber\Test.ex5" detected
Tester  debug version of "MQL5\Experts\fxsaber\Test.ex5" can be optimized on local agents only, no Cloud, no Farm
Tester  OnTesterInit works too long...
Tester  OnTesterInit works too long...

Явно баг.

 
Случай, когда DEAL_TIME_MSC возвращает ноль
// Время в миллисекундах первой балансовой сделки (DEAL_TIME_MSC) в тестере равно нулю
int OnInit()
{
  if (HistorySelect(0, TimeCurrent()) && HistoryDealsTotal())
  {
    Print((datetime)HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME)); // Время балансовой сделки
    Print(HistoryDealGetInteger(HistoryDealGetTicket(0), DEAL_TIME_MSC));       // Это же время в мс равно нулю
  }

  return(INIT_FAILED);
}
 

Если во время оптимизации нажать Стоп, а затем запустить заново Оптимизацию, то она не пойдет, т.к. будет такая запись

Core 1  occupied by another terminal
Core 2  occupied by another terminal
 
Тестер не вызывает ParameterSetRange для входных параметров, на которых не стоит галочка Оптимизации. По этой причине ParametersGetRange возвращает нули для соответствующих Start, Step и Stop значений. Это неправильно совсем. Например, из-за этого невозможно сформировать полноценный SET-файл тестера самому или скорректировать диапазон Оптимизации входного параметра, если он некорректно задан юзером.
 
ParameterGetRange не работает в OnTesterInit.
sinput int Range = 5;

#define PRINT(A) Print(#A + " = " + (string)(A));

void PrintParameter( const string Name, const string From )
{
  PRINT(From)
  
  bool Enable;
  long Value, Start, Step, Stop;
  
  if (ParameterGetRange(Name, Enable, Value, Start, Step, Stop))
  {
    PRINT(Start)
    PRINT(Step)
    PRINT(Stop)
    PRINT(Value)
    PRINT(Enable)
  }   
}

void OnTesterInit()
{
  ParameterSetRange("Range", true, 5, 1, 2, 3); // Задали ненулевыми все значения
  
  PrintParameter("Range", __FUNCTION__); // Возвращает одни нули
}

void OnTesterDeinit()
{
  PrintParameter("Range", __FUNCTION__); // Работает нормально
  
  ChartClose();
}

void OnTesterPass()
{
  PrintParameter("Range", __FUNCTION__); // Работает нормально
}

int OnInit()
{
  uchar Data[];
  
  FrameAdd(NULL, 0, 0, Data);
  
  return(INIT_FAILED);
}