Доступ удаленного агента к файлу, созданному им же на предыдущем проходе

 

Всегда было полезно визуализировать результаты оптимизации в виде облака кривых эквити:

 

MT5 это может сделать, если передавать через FrameAdd после каждого прохода соответствующие данные эквити. Но это очень накладно делать с удаленными агентами - сетевые задержки. Поэтому хочется рационально подойти к решению задачи: передавать эквити только по условию улучшения показателей по сравнению с предыдущими проходами. Хранить прошлые данные возможно только через файлы. Поэтому сабж.

 

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

 

Поясните по пакетированию локальных и удаленных агентов. Запустил оптимизацию советника:

input int Temp = 0;

double OnTester( void )
{
  static int Res = 0;
  
  Res++;
  
  return(Res);
}

Результат:

 

Наивно полагаг, что статик-переменная (в OnTester) будет помнить себя внутри пакета заданий, что отправляется на агента. С новым пакетом должна обнуляться. Так мало того, что этого не произошо, так еще статик был единым для всех локальных агентов.

В итоге архитектурный раздрай в голове. Вроде, утверждали, что тестер - это диспетчер заданий. Теперь сомнения появились. Как на самом деле?

 

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

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

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

Если данных много, то можете сами их упаковывать в zip с помощью штатной функции.
 

Renat:
Используйте мастер режим эксперта и собирайте на нем все пакеты. Не беспокойтесь за латенси передачи фреймов - они работают очень быстро и данные пакета автоматически сжимаются при передаче.

Спасибо, изучаю потихоньку. Удивило совпадение на выходе двух файлов:

input int Counter = 0;

int handle = 0;

void SaveFrames( void )
{
  ulong  Pass = 0;
  long   Id = 0;
  double Value = 0;
  double Total = 0;
  string Name;
  double Data[];
  
  if (handle > 0)
    while (FrameNext(Pass, Name, Id, Value, Data))
    {  
      FileWrite(handle, "номер прохода в оптимизации, на котором добавлен фрейм: " + (string)Pass +
                        ", публичное имя/метка: " + (string)Name +
                        ", публичный id: " + (string)Id +
                        ", значение: " + (string)Value);
                        
      string Str = "{";
      
      for (int i = 0; i < ArraySize(Data); i++)
        Str += " " + (string)Data[i];
        
      FileWrite(handle, Str);      
    }
                                                 
  return;                         
}

double OnTester( void )
{
  double Data[];
  
  ArrayResize(Data, Counter / 100);
  
  for (int i = 0; i < ArraySize(Data); i++)
    Data[i] = MathRand();
  
  FrameAdd("", Counter, Counter, Data);
    
  return(0);
}

void OnTesterInit( void )
{
  handle = FileOpen(__FUNCTION__ + ".log", FILE_WRITE | FILE_TXT);
  
  return;
}

void OnTesterPass( void )
{   
   SaveFrames();
   
   return;   
}

void OnTesterDeinit( void )
{
  if (handle > 0)
    FileClose(handle);

  handle = FileOpen(__FUNCTION__ + ".log", FILE_WRITE | FILE_TXT);

  FrameFirst();
  
  SaveFrames();

  if (handle > 0)
    FileClose(handle);
    
  return;
}

Получается, что все фреймы с переданными данными хранятся на мастер-машине до окончания выполнения мастера. А где хранятся - память (вылезти за размер не получится?) или диск?

 

Для реализации безумных идей не хватает инициализатора события TesterInit - запускать программно оптимизатор. Безумная идея состояит в реализации не только автооптимизатора, но и в некоторых оптимизационных насущных задачах. Например, мне нужно через ГА найти локальный экстремум меняющей со временем мат. функции. Хотелось бы через виртуальный счетчик запускать оптимизацию программно. Соответственно, уничтожая прежние фреймы (другой оптимизации).

 

Правильно ли понимаю, что FrameNext перескакивает на следующий фрейм, удовлетворяющий условию FrameFilter? 

 

Если данных много, то можете сами их упаковывать в zip с помощью штатной функции.

Что-то не получается сжатие:

double CompressRatio( const int Amount )
{
  uchar Data[]; // ругается, если указать Amount
  uchar Key[]; // ругается, если указать явно ноль
  uchar Result[];
  
  ArrayResize(Data, Amount);
  ArrayResize(Key, 0);
  
  for (int i = 0; i < Amount; i++)
    Data[i] = (uchar)MathRand();
    
  CryptEncode(CRYPT_ARCH_ZIP, Data, Key, Result); // == ArraySize(Result)
  
  return(1.0 * ArraySize(Result) / Amount);
}
 

Хотелось бы иметь возможность скармливать "графику оптимизации" (TesterDeinit) различные данные для 2D-визуализации. Например, облако-эквити из первого поста.

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

Сами же штатные графики, к сожалению, не обладают функционалом зума и перемещения, как это сделано на буке с тем же спредом или альпари-паммах.

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