Доступ к глобальным переменным в функции OnTesterPass

 

Добрый день.

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

 Есть ли какой нибудь способ работать с глобальными переменными (в моем случае типа string) в функции OnTesterPass?

 
Nexxtor:

Добрый день.

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

 Есть ли какой нибудь способ работать с глобальными переменными (в моем случае типа string) в функции OnTesterPass?

А почему не в OnTester? Ведь OnTesterPass восникает при старте фрейма и логично, что все обнулено. 
 
Alexey Volchanskiy:
А почему не в OnTester? Ведь OnTesterPass восникает при старте фрейма и логично, что все обнулено. 
Тогда в функции OnTesterDeinit(), когда я по окончании оптимизации записываю все данные в csv файл, все глобальные переменные string пустые...
 
Nexxtor:
Тогда в функции OnTesterDeinit(), когда я по окончании оптимизации записываю все данные в csv файл, все глобальные переменные string пустые...

Еще раз - в OnTester переменные не пустые? Это же проверить секунда

OnTesterDeinit() вызывается после полной оптимизации 

 
Естественно, что они пустые, они же в агенте. Так же через фрейм их передавать, как и другие данные. 
 
Dmitry Fedoseev:
Естественно, что они пустые, они же в агенте. Так же через фрейм их передавать, как и другие данные. 
Пробовал. Через фрейм передавать объекты нельзя, в том числе string.
 
Alexey Volchanskiy:

Еще раз - в OnTester переменные не пустые? Это же проверить секунда

OnTesterDeinit() вызывается после полной оптимизации 

В OnTester переменные не пустые, в этой функции все хорошо. В функции OnTester я делаю, например:

toWrite = toWrite + DoubleToString(TesterStatistics(STAT_PROFIT),2);

 Потом, уже в OnTesterDeinit() записываю toWrite в файл, а файл пустой.

 
Nexxtor:
Пробовал. Через фрейм передавать объекты нельзя, в том числе string.
Кто вам это сказал?
 
Dmitry Fedoseev:
Кто вам это сказал?

string ResultsByTest[6]; 

double OnTester(void)

   {

   if (writeAllResultsToFile){

            GetTestStatistics();

            FrameAdd("ResultsByTest",1,0,ResultsByTest);

            }

   return 0.0;

   }

 При компиляции ошибка:

'ResultsByTest' - string arrays and structures containing objects are not allowed ExpertN.mq5 2372 31

 
Nexxtor:

string ResultsByTest[6]; 

double OnTester(void)

   {

   if (writeAllResultsToFile){

            GetTestStatistics();

            FrameAdd("ResultsByTest",1,0,ResultsByTest);

            }

   return 0.0;

   }

 При компиляции ошибка:

'ResultsByTest' - string arrays and structures containing objects are not allowed ExpertN.mq5 2372 31

Можно собрать все глобальные переменные в одну строку через какой-нибудь разделитель, потому преобразовать ее в массив char, передать этот массив. Массивы можно передавать всякие, но не строковые.

Можно массив структур использовать, но без переменных string. Под имя выделить массив char фиксированного размера:

struct sx{
   char name[100];
   double val;
};

sx z[1111];

double OnTester(void){

   FrameAdd("ResultsByTest",0,0.0,z);


   return 0.0;

}
 
Тестер и терминал - разные процессы. Соответственно скоп глобальных переменных в тестере будет виден только из под тестера. В терминале - только под терминалом.
Передача строковых данных через калбэк между тестером и терминалом - это окей. Товарищ выше дело написал. 
Если не, то только через межпроцесс, пайпы, файл, dll.
Причина обращения: