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

 
fxsaber:

Когда-то пробовал, такое не прокатывало. Только один FrameAdd срабатывал.

Здесь я пример показывал.
 

Спасибо.


PS FrameFirst здесь лишний

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

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

Slava, 2013.04.10 15:04

Вот пример. В OnTester советник отсылает 2 фрейма - история сделок и история, на которой он работал.

В OnTesterDeinit приём и обработка всех фреймов первого и второго типа

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);
        }
     }
//---
  }
 
fxsaber:


PS FrameFirst здесь лишний

Нет. Не лишний - чисто методически. Законченный блок кода безо всяких умолчаний

Этот код был выдран из более сложного кода. Передавали 4 типа разных фреймов. При этом читали в OnTesterPass тоже. Здесь представлен "рафинированный" код.

 
Slava:

Нет. Не лишний - чисто методически. Законченный блок кода безо всяких умолчаний

Этот код был выдран из более сложного кода. Передавали 4 типа разных фреймов. При этом читали в OnTesterPass тоже. Здесь представлен "рафинированный" код.

Про то, что FrameFirst всегда лишний, если вызывается перед FrameFilter.

Не рекомендовал бы передачу данных более, чем через один фрейм.

 
fxsaber:

Про то, что FrameFirst всегда лишний, если вызывается перед FrameFilter.

Не рекомендовал бы передачу данных более, чем через один фрейм.

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

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

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

 
Slava:

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

 
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-файла