Обсуждение статьи "Нейронные сети обратного распространения ошибки на матрицах MQL5"

 

Опубликована статья Нейронные сети обратного распространения ошибки на матрицах MQL5:

Статья описывает теорию и практику применения алгоритма обратного распространения ошибки на MQL5 с помощью матриц. Прилагаются готовые классы и примеры скрипта, индикатора и эксперта.

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

Популярные функции активации

Популярные функции активации

Активационные функции могут иметь различные диапазоны значений — ограниченные или неограниченные. В частности, сигмоида (3) отображает данные в диапазон [0,+1] (лучше подходит для задач классификации), а гиперболический тангенс — в диапазон [-1,+1] (лучше подходит для задач регрессии и прогнозирования).

Автор: Stanislav Korotky

 
Автору спасибо за подробную статью и за честные выводы. 
Предыдущий нейросетевик за свои 35 статей повыкладывал граальные картинки, а на деле подбрасывание монетки. 

Читал статью, что на западе у кого-то получилось создать стабильно прибыльный нейросетевик, в основе было обучение с подкреплением
 

Станиславу больше спасибо! Наконец-то написана статья про нейросети с использованием нативных матриц...

К слову. Буквально сегодня обнаружил, что в Документации появился новый блок, касающийся ML. 

Документация по MQL5: ONNX модели
Документация по MQL5: ONNX модели
  • www.mql5.com
ONNX модели - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Ivan Butko #:
Автору спасибо за подробную статью и за честные выводы. 
Предыдущий нейросетевик за свои 35 статей повыкладывал граальные картинки, а на деле подбрасывание монетки. 

"Те вещи, которые я забыл, ты еще даже не знаешь" - так мог бы ответить автор на подобную критику.

 
Rashid Umarov #:

"Те вещи, которые я забыл, ты еще даже не знаешь" - так мог бы ответить автор на подобную критику.

Там два аспекта и это важно:

1. Исполнение, техническая часть, универсальность, похвалили даже матёрые программисты. И здесь действительно, я не могу и не буду и не пытался критиковать код. Я ведь о другом:

2. Тестирование. Автор указал на работоспособность всех своих моделей. На деле же при нажатии кнопки "Старт" в тестере появляется рандомная картинка на форвард в 2 недели, из 10 нажатий 5 - слив, 5 - прибыль. Естественно, если поставить такое на реал - 50 на 50 жизнеспособность твоего депо. Это не дело. На мои вопросы о том, что это такое и как исправить, автор сказал, что так должно быть, это принцип работы модели. Ну тут я выпал просто, нет слов. 
Два месяца пытался завести эти сети, никак не хотели работать на NVIDIA, спасибо  Aleksey Vyazmikin, переписал код автора и всё заработало на 3080. А в итоге - неработоспособные модели. Вдвойне обидно. 

Так что апеллировать к авторитету неуместно, я не критиковал его профессионализм. 

Но если обидел/задел, прошу извинить, не имел такой цели.  
 
Багфикс.
Файлы:
MatrixNet.mqh  23 kb
 
Stanislav Korotky # : Bugfix.

@Stanislav Korotky  

Your efforts to put Neural Network concept with MQL is well appreciated. This is really a great piece of work to start with for beginners like me. Kudos :)

Thanks for updating the file with bug fixed. However, I would suggest to replace the file in the download area.

Luckily I went through the Discussion on the topic and found there is a bug in the file. And than now I was trying to look for the fix, I found this file link here.

I hope there are only these places for bugfix at line number 490-493, 500, 515-527, I could with //* marking. If anywhere else please mention line numbers or mark //*BugFix ...

Regards

 

Для работы на неттинг-счетах необходимо добавить в функцию ClosePosition явное указание символа:

 bool ClosePosition()
{
    // определяем пустую структуру
   MqlTradeRequest request = {};
   ...
   // заполняем требуемые поля
   request.action = TRADE_ACTION_DEAL;
   request.position = PositionGetInteger(POSITION_TICKET);
   request.symbol = _Symbol;
   const ENUM_ORDER_TYPE type = (ENUM_ORDER_TYPE)(PositionGetInteger(POSITION_TYPE) ^ 1);
   request.type = type;
   request.price = SymbolInfoDouble(_Symbol, type == ORDER_TYPE_BUY ? SYMBOL_ASK : SYMBOL_BID);
   request.volume = PositionGetDouble(POSITION_VOLUME);
   ...
     
   // отправляем запрос
   ...
}
 

Статья, достойная внимания.

Спасибо!

 

Спасибо, очень добротная статья!

Почему-то упустил её из виду.

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