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

 

Ошибка в FileLoad. Если с флагом FILE_COMMON два локальных Агента пытаются считать данные через FileLoad, то один из Агентов обламывается.

В FileOpen можно задать соответствующие флаги, а вот в FileLoad - нет. Поэтому просьба разрешить доступ к файлу через FileLoad, если другой FileLoad его считывает.

 

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

Не для разработчиков МТ! Чем заменить INIT_PARAMETERS_INCORRECT ?

fxsaber, 2018.07.10 20:16

// Нужно компилировать (не запускать) советник, когда этот файл (с любым содержанием, хоть пустой) лежит в Песочнице.
// Иначе Тестер не будет видеть эти данные, даже если соответствующий файл с ними положить после компиляции на место.  
  #property tester_file __FILE__

Древний баг.

 

Возможно ли tester_file держать в RAM, чтобы не насиловать HDD/SSD? А то проходов бывают миллионы, и столько раз считать файл - ужас.


Такой "RAM-диск" позволит значительно усложнить несанкционированную передачу личных данные третьим лицам.

 

Новые оптимизационные кеши не учитывают изменения tester_file и Common-файлов перед запуском Оптимизации.

Здесь пример такого советника.

 
fxsaber:

Новые оптимизационные кеши не учитывают изменения tester_file и Common-файлов перед запуском Оптимизации.

Здесь пример такого советника.

Старые учитывали или нет?

Ничего не поменялось со "старых" оптимизационных кешей.

Если Вы подсунете изменённый tester_file с прежним временем модификации файла, то будет считаться, что файл не изменён.

Common-файлы вообще никак нельзя контролировать (и никогда было нельзя), так как неизвестно, какие из них вы используете в советнике

 
Slava:

Если Вы подсунете изменённый tester_file с прежним временем модификации файла, то будет считаться, что файл не изменён.

Обновленное время модификации не влияет на результат. Советник

// Нужно компилировать (не запускать) советник, когда этот файл (с любым содержанием, хоть пустой) лежит в Песочнице.
// Иначе Тестер не будет видеть эти данные, даже если соответствующий файл с ними положить после компиляции на место.  
#property tester_file __FILE__ 

sinput int NumPass = 10;

#define TOSTRING(A) #A

void SetArray( int &Array[], const int Amount )
{
  MathSrand((int)TimeLocal());
  
  for (int i = ArrayResize(Array, Amount) - 1; i >= 0; i--)
    Array[i] = MathRand() * Amount / SHORT_MAX + 1; // Случайное положительное число
}

void OnTesterInit()
{    
  ParameterSetRange(TOSTRING(NumPass), true, 0, 0, 1, NumPass - 1); // Задали Оптимизатору количество проходов = NumPass    
  
  int Array[];
  
  SetArray(Array, NumPass);      
  FileSave(__FILE__, Array);
  
  ArrayPrint(Array);  
}

void OnTesterDeinit()
{
  ChartClose(); // Закрыли чарт Frame-выполнения советника
}

double OnTester()
{
  int Array[];
  
  return((FileLoad(__FILE__, Array) != -1) ? Array[NumPass]: 0);
}


Результат двух подряд запусков


Красным пометил, что второй запуск полностью соответствует значениям первого запуска, не второго (вторая строка).


Лог это подтверждает

Tester  set "Custom max" as optimization criterion for mathematical calculations
Tester  input parameter 'NumPass' set to: enable=true, value=0, start=0, step=1, stop=9
Tester  cache file 'tester\cache\X2.30.480532BA71563CA64BC267378A0185DD.opt' contains 10 records
Tester  Experts\fxsaber\X2.ex5 math calculations test means no history and no symbol info for EURGBP
Tester  complete optimization started
Tester  optimization already processed, total passes 10
Tester  reading of 10 result records from cache...
Tester  1 blocks of results read from cache in 0 ms
Statistics      optimization done in 0 minutes 00 seconds


Если сбрасываю кеш (перекомпиляция), то первый запуск отлично, дальше - нет.

 
fxsaber:

Обновленное время модификации не влияет на результат. Советник

Да. Спасибо. Нашли в чём была проблема.

В ближайшее время будет исправление. Однако, используемые файлы из common-папки до сих пор нельзя контролировать. Только те файлы, которые указаны в #property tester_file

 

Включаю повторно тестер в режиме визуализации после прохода, понимаю, что не те настройки торможу и виснет тестер стратегий на пару минут.

2018.07.11 17:03:05.992 Core 8  disconnected
2018.07.11 17:03:05.992 Core 8  connection closed
2018.07.11 17:03:09.241 Core 8  connecting to 127.0.0.1:3000
2018.07.11 17:03:18.308 Tester  stopped by user
2018.07.11 17:03:19.241 Core 8  tester agent authorization error
 
//Определение экстремума
for(int i=NBars;i<=NumBars;i++)
     {
      xMinL=ArrayMinimum(MinBuffer,0,i);
      xMinLD=ArrayMinimum(MinBuffer,0,i+NBars);
      if((MinBuffer[xMinL]<=MinBuffer[xMinLD])&&(xMinL>=NBars))
        {
         Minimum=MinBuffer[xMinL];
         break;}}

//Проверка если ордера с такой же ценой не существует         
   for (int r=0; r<=OrdersTotal(); r++)
   {if (OrderSelect(OrderGetTicket(r)))
    {if (StringToDouble(OrderGetString(ORDER_COMMENT))==NormalizeDouble(Minimum,_Digits))    
       {x2=1;
        break;}
     else x2=0;}}

//Проверка если Позиции с такой же ценой не существует     
   for (int l=0; l<=PositionsTotal(); l++)
   {if (PositionSelectByTicket(PositionGetTicket(l)))
    {if (StringToDouble(PositionGetString(POSITION_COMMENT))==NormalizeDouble(Minimum,_Digits))     
       {y2=1;
        break;}
     else y2=0;}}

//Если проверка отрицательная, открываем ордер        
   if ((x2==0)&&(y2==0))
   m_trade.SellStop(Volume,NormalizeDouble(Minimum,_Digits),_Symbol,NormalizeDouble(Minimum+(SL_ATR*ATR2),_Digits),NormalizeDouble(Minimum-(TP_ATR*ATR2),_Digits),ORDER_TIME_GTC,0,DoubleToString(Minimum,_Digits));
Здравствуйте уважаемые форумчане. Это выдержка кода, которая определяет экстремумы и выставляет отложки на них. И вроде все работает но иногда на одном экстремуме он начинает выставлять бесконечные отложки, как будто критерия останова не видит. Я уже голову себе сломал.
 
Dmitri Custurov:
Здравствуйте уважаемые форумчане. Это выдержка кода, которая определяет экстремумы и выставляет отложки на них. И вроде все работает но иногда на одном экстремуме он начинает выставлять бесконечные отложки, как будто критерия останова не видит. Я уже голову себе сломал.

Так double сравнивать корректно?

if (StringToDouble(PositionGetString(POSITION_COMMENT))==NormalizeDouble(Minimum,_Digits)){.....}