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

 
Случай, когда 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);
}
 
fxsaber:
Как быстро сложить много строк (например, сгенерировать торговый отчет в string)

Результат

Красным отмечен факт, который никак не удается объяснить.

Особенности работы пула памяти, при первом вызове SumString2 в пул памяти "насыщается" памятью из системы, при повторном, память у системы больше не запрашивается.

Рекомендую поправить SumString1

ulong SumString1( string TmpStr, const int Amount )
{
  const ulong StartTime = GetMicrosecondCount();

  string Str;
  StringInit(Str,Amount * StringLen(TmpStr) + 1);            << обеспечим строке приёмный буфер

  for (int i = 0; i < Amount; i++)
    Str += TmpStr;

  return(GetMicrosecondCount() - StartTime);
}
 
fxsaber:

По редактору

  • Если в Metaeditor набирать следующую строкуто тултип (или как правильно называется всплывающая подсказка с вариантами?) GetMicrosecondCount не появляется.
    DoubleToString(GetMicro

Подсветка умная, аргумент DoubleToString должен быть дабл, а GetMicrosecondCount — ulong.

Сработает вот так:

DoubleToString( (double)GetMicro
 
fxsaber:

Есть мысли, как получить имя произвольного input-параметра в виде строки?

input double dParam1 = 1.0; // Double
input int iParam2 = 2;      // Integer

Print( InputToString( dParam1 ) ); // "dParam1"
Print( InputToString( iParam2 ) ); // "iParam2"

template<typename T>
string InputToString(T param)
{
   ???
}
 
Andrey Khatimlianskii:

Есть мысли, как получить имя произвольного input-параметра в виде строки?

input double dParam1 = 1.0; // Double
input int iParam2 = 2;      // Integer

#define TOSTRING(A) (#A)

Print( TOSTRING( dParam1 ) ); // "dParam1"
Print( TOSTRING( iParam2 ) ); // "iParam2"
 
fxsaber:

Супер, спасибо!

А получить список инпутов советника при запуске одиночного прогона тестера? Без чтения файла настроек с использованием длл.
Сделал удобное отображение параметров, используемых при тесте после оптимизации (через файл и гл. переменные), осталось одно неудобство — все параметры нужно перечислить вручную.

 
Andrey Khatimlianskii:

А получить список инпутов советника при запуске одиночного прогона тестера?

Никак, только в режиме Оптимизации.

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

Ошибки, баги, вопросы

fxsaber, 2017.07.25 11:27

Как узнать входные параметры советника хотя бы в режиме одиночного прогона?

Для индикаторов есть IndicatorParameters.

Для оптимизации - FrameInputs.

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