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

 
stringo:

Вы забыли указать отдельно ещё эту ссылку "Работа с результатами оптимизации"

Мы как разработчики сами очень активно используем сбор фреймов при оптимизации для выявления трудновоспроизводимых багов тестерных агентов. (Где то здесь, на форуме, мы уже показывали пример Moving_Average_Frames)

Вот такая статья ещё есть: Визуализируй стратегию в тестере MetaTrader 5. С примером в коде. И ещё одна на очереди. ))
 
tol64:
Вот такая статья ещё есть: Визуализируй стратегию в тестере MetaTrader 5. С примером в коде. И ещё одна на очереди. ))
Кстати, есть нюанс. Если вы получаете несколько видов фреймов, то сделать это можно только в OnTesterDeinit. По-моему, это ещё нигде не описано, хотя логично следует из документации по функциям приёма фреймов.
 
stringo:
Кстати, есть нюанс. Если вы получаете несколько видов фреймов, то сделать это можно только в OnTesterDeinit. По-моему, это ещё нигде не описано, хотя логично следует из документации по функциям приёма фреймов.

Я не понимаю, что имеется ввиду по "видами фреймов". В смысле массив любого типа? Я пробовал передать строковой массив и что-то не получилось у меня. Писал об этом в Сервисдеск, но на каком-то этапе всё заглохло и ответа не дождался. 

Пробовал ещё реализовать схему, когда устанавливаются свои параметры из заранее подготовленного списка. Тоже не получилось. Наверное мало думал? ))) Функции   ParameterGetRange и ParameterSetRange можно использовать только в самом начале оптимизации в OnTesterInit(). А хотелось бы устанавливать свои параметры на каждом проходе. Это возможно? 

 
Наверное, предполагается, что каждый проход должен включать в себя весь простой цикл: запуск тестера с входными параметрами, получение фрейма по критерию с попутным наслаждением 3d графиками, запись фрейма в файл сета (а как, кстати, она программно делается в нужное место?).  Т.е. организация серий  - это уже забота кодера-пользователя.
 
tol64:

Я не понимаю, что имеется ввиду по "видами фреймов".


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

double OnTester()
  {
   BalanceInTime balance[];
   double        balance_current=TesterStatistics(STAT_INITIAL_DEPOSIT);
   uint          data_count=0;
   MqlRates      rates[];
//---
   CopyRates(Symbol(),Period(),D'2010.12.01 0:00',D'2013.01.01 0:00',rates);
//--- запросим всю торговую историю
   HistorySelect(0,TimeCurrent());
   uint deals_total=HistoryDealsTotal();
   if(deals_total!=257)
     {
      if(deals_total>0)
        {
         ulong ticket=0;
         ArrayResize(balance,deals_total);
         //--- собираем данные о сделках
         for(uint i=0; i<deals_total; i++)
           {
            if((ticket=HistoryDealGetTicket(i))>0)
              {
               long   entry =HistoryDealGetInteger(ticket,DEAL_ENTRY);
               double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
               if(entry==DEAL_ENTRY_OUT || entry==DEAL_ENTRY_INOUT)
                  balance_current+=profit;
               balance[data_count].date=HistoryDealGetInteger(ticket,DEAL_TIME);
               balance[data_count].entry=(ENUM_DEAL_ENTRY)entry;
               balance[data_count].price=HistoryDealGetDouble(ticket,DEAL_PRICE);
               balance[data_count].balance=balance_current;
               data_count++;
              }
           }
         if(data_count<deals_total)
            ArrayResize(balance,data_count);
        }
      FrameAdd(MQL5InfoString(MQL5_PROGRAM_NAME),1,data_count,balance);
      //---
      FrameAdd(MQL5InfoString(MQL5_PROGRAM_NAME),2,ArraySize(rates),rates);
     }
//---
   return(double(deals_total));
  }

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

Пробовал ещё реализовать схему, когда устанавливаются свои параметры из заранее подготовленного списка. Тоже не получилось. Наверное мало думал? ))) Функции   ParameterGetRange и ParameterSetRange можно использовать только в самом начале оптимизации в OnTesterInit(). А хотелось бы устанавливать свои параметры на каждом проходе. Это возможно? 

Невозможно.

Только в OnTesterInit

 
stringo:

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

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

Спасибо за хороший пример.

stringo:

Невозможно.

Только в OnTesterInit

Жаль. Придётся подумать хорошенько, чтобы всё таки реализовать задуманное. ))
 
Ну а как результат прогона в сет-то записать? Тема топика  ведь не просто автотестирование, а с подстановкой результата...
 
Paragormon:
Ну а как результат прогона в сет-то записать? Тема топика  ведь не просто автотестирование, а с подстановкой результата...

Точно так же, с помощью FileWrite

Предвосхищая следующий вопрос - прочитать с помощью FileRead ;) 

 

Так и не нашли исполнителя под доступный бюджет? 

 
Пока нет, вот пытаюсь сам разобраться.-)
Причина обращения: