Переписал рассчёт допустимых вариантов:
//+------------------------------------------------------------------+ //| KrL_write_func_tick.mq5 | //| Copyright 2018, Tabolin S.N. | //| https://www.mql5.com/ru/users/vip.avos | //+------------------------------------------------------------------+ #property copyright "Copyright 2018, Tabolin S.N." #property link "https://www.mql5.com/ru/users/vip.avos" #property version "1.00" //+------------------------------------------------------------------+ enum f_entry { no_f, // не использовать reb, // отскок brd1, // пробой 1 brd2, // пробой 2 lim, // лимитный lw, // недельный cust, // пользовательский }; int func_entry_1 = 0; // 1-я функция условий входа int func_entry_2 = 0; // 2-я функция условий входа int func_entry_3 = 0; // 3-я функция условий входа int func_entry_4 = 0; // 4-я функция условий входа int func_entry_5 = 0; // 5-я функция условий входа int func_entry_6 = 0; // 6-я функция условий входа int num_entry[][6]; string str = ""; int num_entry_size = 1; int num_entry_vars = 0; //--- //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- ResetLastError(); string filename = "KR\\func.bin"; int filehandle = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_BIN|FILE_COMMON); if(filehandle != INVALID_HANDLE) { FileSeek(filehandle,0,SEEK_END); //string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n"; if(FileWriteArray(filehandle,num_entry) == 0) Print("Ошибка записи файла "+string(GetLastError())); FileClose(filehandle); } ResetLastError(); filename = "KR\\func.txt"; filehandle = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_TXT|FILE_COMMON); if(filehandle != INVALID_HANDLE) { FileSeek(filehandle,0,SEEK_END); //string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n"; if(FileWriteString(filehandle,str) == 0) Print("Ошибка записи файла "+string(GetLastError())); FileClose(filehandle); } Print("Всего проходов "+string(num_entry_vars)); Print("Всего допустимых вариантов "+string(num_entry_size-1)); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { int var1, var2, var3, var4, var5, var6; for(var1 = 0; var1 < 7; var1++) { for(var2 = 0; var2 < 7; var2++) { for(var3 = 0; var3 < 7; var3++) { for(var4 = 0; var4 < 7; var4++) { for(var5 = 0; var5 < 7; var5++) { for(var6 = 0; var6 < 7; var6++) { func_entry_1 = var1; func_entry_2 = var2; func_entry_3 = var3; func_entry_4 = var4; func_entry_5 = var5; func_entry_6 = var6; if(!paramIncorrect()) { ArrayResize(num_entry,num_entry_size); str += string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n"; num_entry[num_entry_size-1][0] = func_entry_1; num_entry[num_entry_size-1][1] = func_entry_2; num_entry[num_entry_size-1][2] = func_entry_3; num_entry[num_entry_size-1][3] = func_entry_4; num_entry[num_entry_size-1][4] = func_entry_5; num_entry[num_entry_size-1][5] = func_entry_6; num_entry_size += 1; } num_entry_vars += 1; } } } } } } ExpertRemove(); } //+------------------------------------------------------------------+ bool paramIncorrect() { bool ret_func = false; if(func_entry_1 == no_f && func_entry_2 == no_f && func_entry_3 == no_f && func_entry_4 == no_f && func_entry_5 == no_f && func_entry_6 == no_f) return(true); //--- Порядок следования if(func_entry_1 == no_f) ret_func = true; else if(func_entry_2 == no_f && (func_entry_3 != no_f || func_entry_4 != no_f || func_entry_5 != no_f || func_entry_6 != no_f)) ret_func = true; else if(func_entry_3 == no_f && (func_entry_4 != no_f || func_entry_5 != no_f || func_entry_6 != no_f)) ret_func = true; else if(func_entry_4 == no_f && (func_entry_5 != no_f || func_entry_6 != no_f)) ret_func = true; else if(func_entry_5 == no_f && func_entry_6 != no_f) ret_func = true; //--- Повторяемость if(func_entry_1 == reb && (func_entry_2 == reb || func_entry_3 == reb || func_entry_4 == reb || func_entry_5 == reb || func_entry_6 == reb)) ret_func = true; if(func_entry_1 == brd1 && (func_entry_2 == brd1 || func_entry_3 == brd1 || func_entry_4 == brd1 || func_entry_5 == brd1 || func_entry_6 == brd1)) ret_func = true; if(func_entry_1 == brd2 && (func_entry_2 == brd2 || func_entry_3 == brd2 || func_entry_4 == brd2 || func_entry_5 == brd2 || func_entry_6 == brd2)) ret_func = true; if(func_entry_1 == lim && (func_entry_2 == lim || func_entry_3 == lim || func_entry_4 == lim || func_entry_5 == lim || func_entry_6 == lim)) ret_func = true; if(func_entry_1 == lw && (func_entry_2 == lw || func_entry_3 == lw || func_entry_4 == lw || func_entry_5 == lw || func_entry_6 == lw)) ret_func = true; if(func_entry_1 == cust && (func_entry_2 == cust || func_entry_3 == cust || func_entry_4 == cust || func_entry_5 == cust || func_entry_6 == cust)) ret_func = true; if(func_entry_2 == reb && (func_entry_3 == reb || func_entry_4 == reb || func_entry_5 == reb || func_entry_6 == reb)) ret_func = true; if(func_entry_2 == brd1 && (func_entry_3 == brd1 || func_entry_4 == brd1 || func_entry_5 == brd1 || func_entry_6 == brd1)) ret_func = true; if(func_entry_2 == brd2 && (func_entry_3 == brd2 || func_entry_4 == brd2 || func_entry_5 == brd2 || func_entry_6 == brd2)) ret_func = true; if(func_entry_2 == lim && (func_entry_3 == lim || func_entry_4 == lim || func_entry_5 == lim || func_entry_6 == lim)) ret_func = true; if(func_entry_2 == lw && (func_entry_3 == lw || func_entry_4 == lw || func_entry_5 == lw || func_entry_6 == lw)) ret_func = true; if(func_entry_2 == cust && (func_entry_3 == cust || func_entry_4 == cust || func_entry_5 == cust || func_entry_6 == cust)) ret_func = true; if(func_entry_3 == reb && (func_entry_4 == reb || func_entry_5 == reb || func_entry_6 == reb)) ret_func = true; if(func_entry_3 == brd1 && (func_entry_4 == brd1 || func_entry_5 == brd1 || func_entry_6 == brd1)) ret_func = true; if(func_entry_3 == brd2 && (func_entry_4 == brd2 || func_entry_5 == brd2 || func_entry_6 == brd2)) ret_func = true; if(func_entry_3 == lim && (func_entry_4 == lim || func_entry_5 == lim || func_entry_6 == lim)) ret_func = true; if(func_entry_3 == lw && (func_entry_4 == lw || func_entry_5 == lw || func_entry_6 == lw)) ret_func = true; if(func_entry_3 == cust && (func_entry_4 == cust || func_entry_5 == cust || func_entry_6 == cust)) ret_func = true; if(func_entry_4 == reb && (func_entry_5 == reb || func_entry_6 == reb)) ret_func = true; if(func_entry_4 == brd1 && (func_entry_5 == brd1 || func_entry_6 == brd1)) ret_func = true; if(func_entry_4 == brd2 && (func_entry_5 == brd2 || func_entry_6 == brd2)) ret_func = true; if(func_entry_4 == lim && (func_entry_5 == lim || func_entry_6 == lim)) ret_func = true; if(func_entry_4 == lw && (func_entry_5 == lw || func_entry_6 == lw)) ret_func = true; if(func_entry_4 == cust && (func_entry_5 == cust || func_entry_6 == cust)) ret_func = true; if(func_entry_5 == reb && func_entry_6 == reb) ret_func = true; if(func_entry_5 == brd1 && func_entry_6 == brd1) ret_func = true; if(func_entry_5 == brd2 && func_entry_6 == brd2) ret_func = true; if(func_entry_5 == lim && func_entry_6 == lim) ret_func = true; if(func_entry_5 == lw && func_entry_6 == lw) ret_func = true; if(func_entry_5 == cust && func_entry_6 == cust) ret_func = true; if(ret_func) return(true); return(false); }
и получил нормальный результат:
2018.11.10 22:13:46.339 Core 1 2018.04.02 00:00:00 Всего проходов 117649 2018.11.10 22:13:46.339 Core 1 2018.04.02 00:00:00 Всего допустимых вариантов 1956
Из этого делаю вывод, что полный перебор параметров в оптимизаторе отрабатывает с ошибками, не перебирает все параметры. К тому же проявляется совершенно не понятная зависимость от используемого ТФ.
Иного объяснения я не вижу...
Первые три слова в первом посте.
Про флаги доступа уже fxsaber подсказал.
В логи агентов смотрели? "Ошибка записи файла" там нет?
На одном агенте попробуйте прогнать.
Про флаги доступа уже fxsaber подсказал.
В логи агентов смотрели? "Ошибка записи файла" там нет?
На одном агенте попробуйте прогнать.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Сергей Таболин, 2018.11.11 09:23
Изменил.
int filehandle = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_BIN|FILE_COMMON);
Не помогло. 1 - М30, 2 - H4
И в обоих случаях найдено меньше допустимых вариантов. (1956)
А вот на одном агенте всё хорошо прошло и от ТФ результат не меняется.
А "Ошибка записи файла" в логах отсутствует (((А вот на одном агенте всё хорошо прошло и от ТФ результат не меняется.
А "Ошибка записи файла" в логах отсутствует (((Сбросить кэши, запустить оптимизацию на двух ядрах, и проверить их логи?
Записывать после каждого прогона свой файл (имя генерировать уникальное) и проверить кол-во файлов?
А вот на одном агенте всё хорошо прошло и от ТФ результат не меняется.
А "Ошибка записи файла" в логах отсутствует (((Почему Вы не пишете в лог ошибку открытия файла?
Косяк...
Сча исправлю.
if(paramIncorrect()) return(INIT_PARAMETERS_INCORRECT); else { string filename = "KR\\func.txt"; ResetLastError(); int filehandle = FileOpen(filename,FILE_WRITE|FILE_READ|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_BIN|FILE_COMMON); if(filehandle != INVALID_HANDLE) { FileSeek(filehandle,0,SEEK_END); string str = string(func_entry_1)+","+string(func_entry_2)+","+string(func_entry_3)+","+string(func_entry_4)+","+string(func_entry_5)+","+string(func_entry_6)+"\n"; /*num_entry[0][0] = func_entry_1; num_entry[0][1] = func_entry_2; num_entry[0][2] = func_entry_3; num_entry[0][3] = func_entry_4; num_entry[0][4] = func_entry_5; num_entry[0][5] = func_entry_6;*/ if(FileWriteString(filehandle,str) == 0) Print("Ошибка записи файла = "+string(GetLastError())); FileClose(filehandle); } else Print("Ошибка открытия файла = "+string(GetLastError())); return(INIT_FAILED); }
В логах никаких записей об ошибке открытия/записи файла не встречается.
Зато обратил внимание:
FI 0 16:32:12.494 Tester optimization finished, total passes 117649 (successful 115693 passes) JI 0 16:32:12.504 Statistics optimization done in 3 minutes 53 seconds
???
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Запускаю полный перебор. Файл записывается. И всё время разной длины. Может из-за ТФ, но ТФ никаким боком не должен влиять на результат! Ибо дальше инит ничего не идёт!
Как, почему? Или это глюк тестера?