Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Как вывести результаты оптимизации в таблицу Excel
Почитайте про работу с фреймами.
Вот этот код:
inNum=0;
{ // Считали соответствующие оптимизируемые входные параметры
Print("GLOC = ",GLOC);
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: TesterCache
fxsaber, 2019.11.11 04:45
Вы получили opt-файл в байтовый массив. Дальше его надо подать в Cache.
Поправил так, как Вы сказали:
string Sohran,Contr;
MTTESTER::GetSettings(Sohran); // Считываются текущие исходные настройки робота для временного сохранения в Sohran
prWrite = MTTESTER::SetSettings2(Odinar); // Установка Odinar в настройки робота
prRead = MTTESTER::GetSettings(Contr); // Считываются только что установленные настройки робота
Print("prWriteSettings = ",prWrite," prReadSettings = ",prRead);
Print("SettingBeg OdinarContr ",Kol," PoseY = ",PoseY," Итерация ",IterNumber,"\n",Contr);
Run(Contr[0]); // Прогон оптимизации по значениям выделенного Y параметра
int GLOC = MTTESTER::GetLastOptCache(Bytess); // Получили opt-файл в байтовый массив Bytess
TESTERCACHE<ExpTradeSummary> Cache;
bool CL = Cache.Load(Bytess); // Подаём в Cache байтовый массив Bytess
ProfitNow = Cache[GetMaxProfitPos(Cache)].profit; // Максимальная прибыль
int NomProchodaMaxProfit = Cache[GetMaxProfitPos(Cache)].Pass; // Номер прохода с максимальной прибылью
int IndexMaxProfit = GetMaxProfitPos(Cache); // Индекс массива со значением параметра https://www.mql5.com/ru/forum/318998/page2#comment_13846951
Cache.GetInputs(IndexMaxProfit,Paramas);
ParamMax = Paramas[0,1].double_value; // Значение параметра, при котором достигнута максимальная прибыль
Alert("CL=",CL," GLOC = ",GLOC," ProfitNow =",ProfitNow," ParamMax=",ParamMax," Odinar ",Kol," PoseY = ",PoseY," PosEq = ",PosEq," TypPar = ",TypPar," Итерация ",IterNumber);
return;
Результат по-прежнему ошибочный.
Почему-то из кеша считываются данные по ProfitNow и ParamMax из какого-то бывшего ранее прогона.
С уважением, Александр
Почему-то из кеша считываются данные по ProfitNow и ParamMax из какого-то бывшего ранее прогона.
Показывает ли после Оптимизации правильные значения этот скрипт?
Если да, то проблема, скорее всего, в неготовности opt-файла сразу после Оптимизации. Можно попробовать поставить Sleep после Run. Ну либо Run работает неправильно.
Показывает ли после Оптимизации правильные значения этот скрипт?
Если да, то проблема, скорее всего, в неготовности opt-файла сразу после Оптимизации. Можно попробовать поставить Sleep после Run. Ну либо Run работает неправильно.
Спасибо! Завтра все это проверю.
Но сейчас обнаружил, что если задать оптимизацию по новому параметру, то все работает правильно.
Поэтому мне кажется, что все дело в том, что тестер, если ему повторно задать уже работавшую ранее оптимизацию, на самом деле ее не обрабатывает заново, а просто извлекает из памяти прошлый результат.
Нельзя ли что-нибудь придумать, чтобы предварительно уничтожать эту память тестера?
Поэтому мне кажется, что все дело в том, что тестер, если ему повторно задать уже работавшую ранее оптимизацию, на самом деле ее не обрабатывает заново, а просто извлекает из памяти прошлый результат.
Ваши гипотезы ошибочны. Проблема в коде, что написали.
Ваши гипотезы ошибочны. Проблема в коде, что написали.
Добрый день!
Согласен с вами, что "Проблема в коде, который я написал". Ошибка в нём, и я пока не знаю, как ее исправить.
Однако экспериментально я установил, что если перед запуском Run убрать все opt-файлы вручную
из папки "C:\Users\ASUS\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\Tester\cache",
то мой код работает правильно и проводит оптимизацию по выбранному параметру.
Если же эту папку не чистить, то Тестер повторные оптимизации (с теми же самыми неизменными данными) не проводит, а считывает
уже имеющийся opt-файл из этой папки. Это хорошо видно при неоднократном запуске вручную одной и той же оптимизации.
Видно, что реальная оптимизация производится только в первый раз, а потом - только считывание opt-файла из папки.
При таком повторном считывании в кеше, по-видимому, не обновляется содержимое, и это-то и приводит к ошибке в моем коде.
Очистка указанной папки могла бы помочь устранить ошибку. Конечно, это плохое решение, и было бы элегантнее суметь восстановить нужные данные в кеше.
Но я не знаю, как это сделать. Пока же в кеше зависают данные от предыдущей реальной оптимизации (не соответствующие повторно считанным из папки).
К сожалению, из скрипта при помощи FolderClean нельзя очистить эту папку, потому что это запрещено в MQL5 -
она вне "песочницы" и заполняется только Тестером стратегий.
Может следует создать средствами С++ какую-то внешнюю примочку и запускать ее из скрипта.
С уважением, Александр