МТ5 :: Вопрос по работе оптимизатора

 

Логика советника:

  1. при условии А - сохранить некоторые данные в файл.
  2. при условии Б - считать сохранённые данные.

При работе советника в режиме простого теста никаких вопросов не возникает. А вот при оптимизации...

Если не использовать FILE_SHARE_READ и FILE_SHARE_WRITE, то получим массу ошибок. А что получим, если использовать FILE_SHARE_READ и FILE_SHARE_WRITE ?

....

Допустим, у нас есть 2 агента, работающих при оптимизации.

  • первый агент. условие А. запись в файл 123
  • в файле 123
  • второй агент. условие А. запись в файл 321
  • в файле 321
  • первый агент. условие Б. читает из файла....

Вопрос - будет ли совпадать результат из оптимизации с результатом одиночного теста?


И правильно ли я понимаю этот процесс?

 

при оптимизации задания агенту выдаются пачками ( могу ошибаться, но по 4 шт задания )

поэтому логика:

Сергей Таболин:

Допустим, у нас есть 2 агента, работающих при оптимизации.

  • первый агент. условие А. запись в файл 123
  • в файле 123
  • второй агент. условие А. запись в файл 321
  • в файле 321
  • первый агент. условие Б. читает из файла....

будет примерно такая:

- первый агент закончил задание записал 123, первый агент прочитал или нет свои 123

- первый агент закончил задание записал 456 , прочитал 123

- второй агент закончил задание , записал 321, прочитал 456

- второй агент закончил задание, записал 789, прочитал 321

Сергей Таболин:

Вопрос - будет ли совпадать результат из оптимизации с результатом одиночного теста?

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

 
Igor Makanu:

при оптимизации задания агенту выдаются пачками ( могу ошибаться, но по 4 шт задания )

поэтому логика:

будет примерно такая:

- первый агент закончил задание записал 123, первый агент прочитал или нет свои 123

- первый агент закончил задание записал 456 , прочитал 123

- второй агент закончил задание , записал 321, прочитал 456

- второй агент закончил задание, записал 789, прочитал 321

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

Спасибо, но оптимизация на одном ядре.... не камильфо ))

Вот в том то проблема. Для оптимизации нужно как-то сделать так, чтобы каждый агент писал-читал свой файл. Но как это сделать не представляю.

Вообще то я думал, что при оптимизации каждому агенту выделяется индивидуальный поток со всеми вытекающими. А получается.....

 
Сергей Таболин:

Вот в том то проблема. Для оптимизации нужно как-то сделать так, чтобы каждый агент писал-читал свой файл. Но как это сделать не представляю.

- или не пишите в общую папку, файлы будут в папке тестер\агент

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

input ushort param =  USHORT_MAX;
#include <Files\FileTxt.mqh>
CFileTxt f;
const string path = TerminalInfoString(TERMINAL_DATA_PATH);
const string agent = "Agent_" + StringSubstr(path, StringLen(path) - 4);
long pass;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
   {
   f.Open(agent+".txt", FILE_READ | FILE_WRITE | FILE_COMMON);
   if(f.Size() == 0) pass = 0; else pass = StringToInteger(f.ReadString());
   f.Close();
//---
   return(INIT_SUCCEEDED);
   }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
   {
   pass++;
   f.Open(agent+".txt", FILE_WRITE | FILE_COMMON);
   f.WriteString((string)pass);
   f.Close();
   }
//+------------------------------------------------------------------+
void OnTick()
   {
   }
//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
   {
//---
   double ret = 0.0;
//---

//---
   return(ret);
   }
//+------------------------------------------------------------------+
 
Igor Makanu:

- или не пишите в общую папку, файлы будут в папке тестер\агент

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

Спасибо. Попробую и так и так.

И ещё вопрос. Недавно у человека была проблема похожего типа, только он использовал базу данных. База данных же не пишется с коммон-флагом? Я просто подумываю над этим вариантом, раньше не использовал. Не столкнусь ли и там с подобным?

 

в справке, в разделе работа с БД есть ссылка на статью от Метаквот

кажется в комментариях к статье админ тестировал совместную запись из агентов тестера в одну БД

но по моему Вы не то ищете, скорее всего Вы хотите раздавать агентам задания самостоятельно, тогда OnTesterPass()

 
Igor Makanu:

в справке, в разделе работа с БД есть ссылка на статью от Метаквот

кажется в комментариях к статье админ тестировал совместную запись из агентов тестера в одну БД

но по моему Вы не то ищете, скорее всего Вы хотите раздавать агентам задания самостоятельно, тогда OnTesterPass()

Нет, Игорь. Я хочу просто писать советник и не думать, что он может неправильно оптимизироваться.

А пока получается так, что я пишу советник и при этом должен ещё думать "а что будет при его оптимизации, где возникнут подводные камни?". На мой непрофессиональный взгляд - это не барско...