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

 
Slava:

2. Один тип фреймов читается в OnTesterPass, дочитывается в OnTesterDeinit. Остальные фреймы вычитываются в OnTesterDeinit

Такая особенность не позволяет в реальном времени работать с результатами посчитанных проходов, если фреймов несколько на проход.

 
Вроде, чисто методически здесь недоработка

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

Тестирование стратегий по расписанию с автоподстановкой результата в советника

Slava, 2013.04.10 15:04

void OnTesterDeinit()
  {
   string        name;
   ulong         pass;
   long          id;
   double        value;
   int           handle,i;
   BalanceInTime balance[];
   MqlRates      rates[];
//---
   FrameFirst();
   FrameFilter("",1);
   while(FrameNext(pass,name,id,value,balance))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(balance); i++)
            FileWrite(handle,balance[i].date,EnumToString(balance[i].entry),DoubleToString(balance[i].price,5),DoubleToString(balance[i].balance,2));
         FileClose(handle);
        }
     }
//---
   FrameFirst();
   FrameFilter("",2);
   while(FrameNext(pass,name,id,value,rates))
     {
      handle=FileOpen(name+"_"+string(id)+"_"+IntegerToString(pass,5,'0')+".txt",FILE_WRITE|FILE_CSV|FILE_ANSI);
      if(handle!=INVALID_HANDLE)
        {
         for(i=0; i<ArraySize(rates); i++)
            FileWrite(handle,rates[i].time,DoubleToString(rates[i].open,5),DoubleToString(rates[i].high,5),DoubleToString(rates[i].low,5),DoubleToString(rates[i].close,5),string(rates[i].tick_volume));
         FileClose(handle);
        }
     }
//---
  }
Перед FrameNext в цикле хорошо бы вызывать ArrayFree на каждом проходе цикла.
 
Slava:

1. Да. Может быть лишний.

2. Один тип фреймов читается в OnTesterPass, дочитывается в OnTesterDeinit. Остальные фреймы вычитываются в OnTesterDeinit

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

Ранее я говорил о потери фреймов, если в одном проходе передается много фреймов и были неполадки с агентом - обрыв связи - будет ли что-то делаться с данной ситуацией?

 
fxsaber:

Откроете opt-формат?

Да.

В обмен на публикацию кода по чтению opt-файла

 
fxsaber:

Такая особенность не позволяет в реальном времени работать с результатами посчитанных проходов, если фреймов несколько на проход.

Да.

Поэтому и приходится фреймы "неосновного" типа вычитывать после окончания оптимизации.

 
Aleksey Vyazmikin:

Ранее я говорил о потери фреймов, если в одном проходе передается много фреймов и были неполадки с агентом - обрыв связи - будет ли что-то делаться с данной ситуацией?

А что тут сделаешь?

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

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

 
fxsaber:
Вроде, чисто методически здесь недоработка
Перед FrameNext в цикле хорошо бы вызывать ArrayFree на каждом проходе цикла.

Мы избегаем лишнего перераспределения памяти.

В данном случае вероятность 99 процентов, что буфер массива будет распределён однократно

 
Slava:

А что тут сделаешь?

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

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

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

Или в тело каждого фрейма писать общее количество и его порядковый номер в этом количестве, и так же, если все не пришли, то переоптимизировать.
 
Slava:

Да.

В обмен на публикацию кода по чтению opt-файла

Меня даже больше интересует запись. Чтение сделаю, если будет формат известен.

 
Aleksey Vyazmikin:

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

Или в тело каждого фрейма писать общее количество и его порядковый номер в этом количестве, и так же, если все не пришли, то переоптимизировать.

А если не каждый проход возвращает фрейм?

Я выше приводил пример по отлову ошибок в тестере. Фреймы отсылались, только когда некое результатное значение не совпадало с эталоном

Причина обращения: