Ошибки, баги, вопросы - страница 221

 
vikulin:

это один и тот же результат! входные параметры для этих точек одинаковые!

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

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

 
sultanm:

 

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

Подсказка: произведите, пожалуйста, сортировку по запрашиваемому показателю, и не забудьте показать вертикальную полосу прокрутки таблицы.

 

 

Вот эта проблема когда-нибудь решится???

Третий раз про неё говорю а реакции ноль!


 
vikulin:


кстати, мне кажется, что если выбрано моделирование реквотов, то этот кэш не должен использоваться. что на этот счёт думают разработчики?

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

Напишите, пожалуйста, в сервисдеск. Причем в п. 2 интересует полная информация. ЭА, билд терминала, настройки оптимизации...
 
Код:
int symbols = SymbolsTotal(false);
for (int i=0; i<symbols; i++) {
   Print("Символ №"+i+" значение="+SymbolName(i,false));
}

В терминале результат

2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №11 значение=GBPJPY
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №10 значение=GBPCHF
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №9 значение=EURJPY
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №8 значение=EURCHF
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №7 значение=EURAUD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №6 значение=EURGBP
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №5 значение=AUDUSD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №4 значение=USDCAD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №3 значение=USDJPY
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №2 значение=USDCHF
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №1 значение=GBPUSD
2010.12.06 13:18:49   Expert (EURUSD,H1)    Символ №0 значение=EURUSD

Результат в тестере:

2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №11 значение=USDJPY
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №10 значение=USDCHF
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №9 значение=USDCAD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №8 значение=GBPUSD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №7 значение=GBPJPY
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №6 значение=GBPCHF
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №5 значение=EURUSD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №4 значение=EURJPY
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №3 значение=EURGBP
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №2 значение=EURCHF
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №1 значение=EURAUD
2010.12.06 13:21:20     Core 1  2010.11.01 00:00:00   Символ №0 значение=AUDUSD

Вся прелесть фунции SymbolName(i) пропадает

 
vyv:

Просьба к разработчикам. Пока кипит работа над МТ5 и еще вносятся изменения, было бы очень здорово расширить количество проходов оптимизации.

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

Универсальность MQL5+ООП+Многоядерное тестирование позволяют окинуть взглядом новые горизонты задач (например поиск патернов) которые могут быть решены средствами MT5.

Но вот незадача:

 В статье, опубликованной на вашем сайте есть пример генетического алгоритма https://www.mql5.com/ru/articles/55, где для решения задачи поиска на 100 барах понадобилось 3^100 прямого перебора - ну это немного больше, чем LongInt :) а решение было найдено за 17 000 итераций. Генетический алгоритм может находить решения среди намного большего количества вариантов, чем LongInt. А это ограничение совершенно ни чем не обоснованно и устарело. Ну разве, что на данном заключительном этапе работы над МТ5 это будет сложно сделать.

Огромная просьба к разработчикам, если это не очень сложно, сделайте пожалуйста количество проходов ну хотя бы  2^LongInt (2 в степени).

А мне кто-нибудь ответит?
 

Код:

//+------------------------------------------------------------------+
//|                                                      testInd.mq5 |
//|                                                                  |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   int handle1 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //
   int handle2 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //абсолютно идентичные параметры
   if(handle1 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle1 ="+handle1);
        }
        if(handle2 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle2 ="+handle2);
        }
        
   IndicatorRelease(handle2);
   handle2 = INVALID_HANDLE; //добавил для "надежности"
   handle2 = iMA(NULL,0,33,0,MODE_LWMA, PRICE_CLOSE); //другой период
        if(handle2 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Измененный? Handle2 ="+handle2); //все обращения к данным handle2 возвращают данные с handle1
        }
   
   
//---
   return(0);
  }

Лог:

2010.12.06 18:07:52    testInd (EURUSD,H1)    Измененный? Handle2 =10
2010.12.06 18:07:52    testInd (EURUSD,H1)    Handle2 =10
2010.12.06 18:07:52    testInd (EURUSD,H1)    Handle1 =10

Соответственно все обращения за данными к handle2 равноценны обращению к handle1, хотя период измененный.

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

P.S. Выяснил причину. Это баг - следствие оптимизации к одному номеру хендла.

IndicatorRelease(handle2); //уменьшает счетчик хендлов на единицу и в итоге следующий созданный хэндл(с любой переменной) - опять 10
 
Vigor:

Код:

Лог:

2010.12.06 18:07:52    testInd (EURUSD,H1)    Измененный? Handle2 =10
2010.12.06 18:07:52    testInd (EURUSD,H1)    Handle2 =10
2010.12.06 18:07:52    testInd (EURUSD,H1)    Handle1 =10

Соответственно все обращения за данными к handle2 равноценны обращению к handle1, хотя период измененный.

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

P.S. Выяснил причину. Это баг - следствие оптимизации к одному номеру хендла.

А почему вы решили что это именно баг?

 
alexvd:

А почему вы решили что это именно баг?

Хорошо. Это - фича. Но такая, про которую лучше знать.

Если, к примеру, пользователь вводит значения периода для MA из интерфейса, создавая хендлы для индикаторов и используя значения буферов индикаторов, то, создав, пускай случайно (у меня к примеру стоят в этой форме дефолтные настройки) 2 индикатора с одинаковыми характеристиками (их хендлы кладутся в объектную обертку), он получает, вследствии этой фичи для второго индикатора номер хэндла первого.

Следующие возможные цепочки событий.

Ситуация 1. Он удаляет первый индикатор(и программа делает IndicatorRelease) следствие - второй автоматически не работает - ошибка копирования буферов.

Ситуация 2. Он удаляет второй индикатор(и программа делает IndicatorRelease), хендл счетчик уменьшается. Первый при этом прекрасно себя чувствует. Создает третий индикатор с другим периодом. Ему отдается хендл счетчик+1 т.е. номер хендла только что удаленного индикатора. В итоге, самое ужасное, третий индикатор, с другим периодом, успешно созданный, отдает в буфер значения первого, по прежнему, неудаленного индикатора.

Фича склейки номеров хендлов, приводит к неоднозначным ситуациям при удалении одного из двух склеенных и последующем создании новых хендлов.

//+------------------------------------------------------------------+
//|                                                      testInd.mq5 |
//|                                                                  |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright ""
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
   int handle1 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //
   int handle2 = iMA(NULL,0,17,0,MODE_LWMA, PRICE_CLOSE); //абсолютно идентичные параметры
   if(handle1 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle1 ="+handle1);
        }
        if(handle2 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Handle2 ="+handle2);
        }
        
   IndicatorRelease(handle2);

   handle3 = iMA(NULL,0,33,0,MODE_LWMA, PRICE_CLOSE); //другой период
        if(handle3 == INVALID_HANDLE) {
                Print("Error Creating Handles for indicators",GetLastError());
        } else {
                Print("Новый handle3 ="+handle3); //все обращения к данным handle3 возвращают данные с handle1
        }
   
   
//---
   return(0);
  }
 
vyv:
А мне кто-нибудь ответит?

Здесь говорили об этом. https://www.mql5.com/ru/forum/1997/page6/#comment_31644

Может лучше туда вопрос - предложение перенести. 

Оптимизация в Тестере стратегий
Оптимизация в Тестере стратегий
  • www.mql5.com
из которых ТОЛЬКО 546 ms было затрачено именно на тестирование эксперта.