English 中文 Español Deutsch 日本語 Português
preview
Эксперименты с нейросетями (Часть 4): Шаблоны

Эксперименты с нейросетями (Часть 4): Шаблоны

MetaTrader 5Торговые системы | 1 марта 2023, 13:50
2 741 13
Roman Poshtar
Roman Poshtar

Введение

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

В прошлых статьях (Часть 1, Часть 2, Часть 3) мы экспериментировали с фигурами и углами наклона, значение которых мы передавали в перцептрон и нейросеть построенную на базе библиотеки DeepNeuralNetwork.mqh.  Также проводили опыты по методам оптимизации в тестере стратегий. Честно говоря, я остался не совсем доволен, результатами работы нейросетей на базе библиотеки DeepNeuralNetwork.mqh как и медленной работой хитрого алгоритма оптимизации описанного мной в 3-й части. Результаты на простом перцептроне оказались лучше нейросети. Возможно, мы передаем в нейросеть неподходящие данные для таких задач, диапазон разброса которых не может привести к стабильному результату.  К тому же в комментариях под предыдущими статьями я увидел критику по поводу соотношения ТейкПрофита к СтопЛосу. Что же все пожелания учтены в следующих экспериментах.

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

Назвал я эту «технологию» - шаблоны. Не знаю правильно или нет, но как мне показалось это наиболее подходящее слово.

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

Сейчас я пишу это введение, и честно говоря, не знаю, к какому результату мы придём в итоге. Хотелось пройти все вместе с Вами, моими читателями. Но идея есть, и задача поставлена, пора начинать. Как уже сложилось по традиции, используем только средства MetaTrader 5 без использования стороннего программного обеспечения. Данная статья, скорее всего, будет похожа на пошаговую инструкцию. И я со своей стороны постараюсь объяснить все максимально доступно и просто.

Нам предстоит огромная работа — начнем!


1. Валютная пара. Диапазон оптимизации и форвард тестирования. Настройки

Тут я предоставлю все параметры для оптимизации и форвард тестирования, чтобы дальше в тексте не повторяться:

  • Рынок Forex;
  • Валютная пара EURUSD;
  • Период H1;
  • Шаблоны: Веер, Параллелограмм, Треугольник;
  • СтопЛосс и ТейкПрофит для соответствующих модификаций 600 и 60, 200 и 230 для равновесия с учетом спреда добавляем 30 пунктов по пятизнаку к ТейкПрофит, 200 и 430 Тейк профит в 2 раза больше Стоп лосса, 30 пунктов по пятизнаку к ТейкПрофит для равновесия;
  • Режим оптимизации и тестирования «Только цены открытия» и «Максимум комплексного критерия». Очень важно использовать режим «Максимум комплексного критерия» он показал более стабильные и прибыльные результаты по сравнению с «Максимальная прибыльность»;
  • Диапазон оптимизации 3 года. С 2019.02.18 по 2022.02.18. 3 года не является, каким-то критерием. Вы можете попробовать больше или меньше самостоятельно;
  • Диапазон форвард тестирования 1 год. С 2022.02.18 по 2023.02.18. Проверяем все на основе алгоритма изложенного в моей статье (Эксперименты с нейросетями (Часть 3): Практическое применение). То есть одновременная торговля несколькими лучшими результатами оптимизации;
  • Проводить оптимизацию мы будем теперь 20 раз. Увеличим в 2 раза по сравнению с предыдущими тестами и посмотрим на результаты. 
  • Во всех форвард тестированиях использовалось 40 результатов оптимизации одновременно. Величина увеличена по сравнению с предыдущими тестами в моих статьях в 2 раза;
  • Оптимизация советников с перцептроном «Быстрая (генетический алгоритм)»;
  • Оптимизация советников на библиотеке DeepNeuralNetwork.mqh «Быстрая (генетический алгоритм)». В связи с медленной оптимизацией алгоритма рассмотренного в (Части 2), было принято решение оптимизировать средствами MetaTrader 5 напрямую;
  • Начальный депозит 10000 единиц;
  • Плечо 1:500.

Чуть не забыл рассказать, как я провожу оптимизацию 20, 40 и более раз в режиме «Быстрая (генетический алгоритм)». Для этого я использую небольшую программу автокликер, которую я написал на Delphi. Здесь я не могу ее выложить, но всем, кому понадобится, я отправлю в личных сообщениях, если Вы мне напишете. Работает это так:

  1. Вводим необходимое количество оптимизаций.
  2. Наводим курсор мышки на кнопку Старт в оптимизаторе стратегий.
  3. Идем заниматься своими делами.

Оптимизация закончится по истечению указанных циклов и программа закроется. Автокликер реагирует на изменение цвета кнопки Старт. Ниже на скриншоте как выглядит программа. 

Автокликер


2. Шаблоны

Шаблон представляет собой некую конструкцию похожую на «плавающий паттерн». Его значения постоянно меняются в зависимости от ситуации на рынке, но каждое из значений находятся в определенном диапазоне, что и нужно для наших экспериментов. Так, как нам уже известно, что данные, которые мы передаем в нейросеть, должны находиться в определенном диапазоне. Значение в шаблоне округляется до целого для упрощения и лучшего понимания перцептроном и нейросетью. Таким образом мы получаем большее количество ситуаций для срабатывания условий и меньшую нагрузку на перцептрон и нейросеть. Ниже на скриншоте Вы видите первый, из шаблонов который мне пришел на ум. Назвал я его веер, думаю сходство очевидно. Индикаторы в данной статье мы использовать не будем, работаем со свечами.

Ниже показаны примеры с использованием масштабирования на истории, таким образом, мы можем анализировать более короткую или глубокую историю.

Использовать равное количество свечей в шаблонах не является обязательным условием что дает дополнительное поле для размышлений по поводу актуальности предыдущих значений цены. В нашем случае цены закрытия свечей.

Важно понимать, что в примерах с использованием библиотеки DeepNeuralNetwork.mqh на 24 свечи мы используем разные библиотеки, которые я описал в предыдущих статьях. С разными настройками входных данных. А именно 4 и 8 параметров на вход нейросети. Но Вы за это можете не переживать во вложении я добавил советники и нужные библиотеки.

2.1 Шаблон веер из четырёх значений, растянутый на 24 свечи. На периоде H1 равно одному дню. 

Веер 4 24

И так опишем, что мы будем передавать в перцептрон и нейросеть для большего понимания:

  1. Округленное расстояние в пунктах от точки 1 до точки 2;
  2. Округленное расстояние в пунктах от точки 1 до точки 3;
  3. Округленное расстояние в пунктах от точки 1 до точки 4;
  4. Округленное расстояние в пунктах от точки 1 до точки 5;

И как это будет выглядеть в коде для советников на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   a1 = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()));
   a2 = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   a3 = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()));
   a4 = (int)(a4/100)*100;
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

И как это будет выглядеть в коде для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()));
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()));
   xInputs[3] = (int)(a4/100)*100;  
   
   return(1);

  }

2.2 Шаблон веер из восьми значений, растянутый на 24 свечи. На периоде H1 равно одному дню.

Шаблон 8 24

 

 

Что передаем в перцептрон и нейросеть для большего понимания:

  1. Округленное расстояние в пунктах от точки 1 до точки 2;
  2. Округленное расстояние в пунктах от точки 1 до точки 3;
  3. Округленное расстояние в пунктах от точки 1 до точки 4;
  4. Округленное расстояние в пунктах от точки 1 до точки 5;
  5. Округленное расстояние в пунктах от точки 1 до точки 6;
  6. Округленное расстояние в пунктах от точки 1 до точки 7;
  7. Округленное расстояние в пунктах от точки 1 до точки 8;
  8. Округленное расстояние в пунктах от точки 1 до точки 9;

И как это будет выглядеть в коде для советников на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;
   
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   a1 = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point()));
   a2 = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()));
   a3 = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point()));
   a4 = (int)(a4/100)*100;
   
   int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   b1 = (int)(b1/100)*100;
   int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point()));
   b2 = (int)(b2/100)*100;
   int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()));
   b3 = (int)(b3/100)*100;
   int b4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point()));
   b4 = (int)(b4/100)*100;
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

И как это будет выглядеть в коде для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point()));
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()));
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point()));
   xInputs[3] = (int)(a4/100)*100;
   
   int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   xInputs[4] = (int)(g1/100)*100;
   int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point()));
   xInputs[5] = (int)(g2/100)*100;
   int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()));
   xInputs[6] = (int)(g3/100)*100;
   int g4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point()));
   xInputs[7] = (int)(g4/100)*100;
   
   return(1);

  }

2.3 Шаблон веер из четырёх значений растянутый на 48 свечей. На периоде H1 равно двум дням.

Веер 48

Итак, опишем, что к чему для большего понимания:

  1. Округленное расстояние в пунктах от точки 1 до точки 2;
  2. Округленное расстояние в пунктах от точки 1 до точки 3;
  3. Округленное расстояние в пунктах от точки 1 до точки 4;
  4. Округленное расстояние в пунктах от точки 1 до точки 5;

И как это будет выглядеть в коде для советников на перцептроне. Видим предыдущий пример, растянутый во времени на 2 дня:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   a1 = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   a2 = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()));
   a3 = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()));
   a4 = (int)(a4/100)*100;
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

И как это будет выглядеть в коде на нашей библиотеки DeepNeuralNetwork.mqh . Видим предыдущий пример, растянутый во времени на 2 дня:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()));
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()));
   xInputs[3] = (int)(a4/100)*100;  
   
   return(1);

  }

2.4 Шаблон веер из восьми значений, растянутый на 48 свечей. На периоде H1 равно двум дням.

Веер 8 48

Что передаем в перцептрон и нейросеть для большего понимания, точки отсчета сместились на равное количество свечей:

  1. Округленное расстояние в пунктах от точки 1 до точки 2;
  2. Округленное расстояние в пунктах от точки 1 до точки 3;
  3. Округленное расстояние в пунктах от точки 1 до точки 4;
  4. Округленное расстояние в пунктах от точки 1 до точки 5;
  5. Округленное расстояние в пунктах от точки 1 до точки 6;
  6. Округленное расстояние в пунктах от точки 1 до точки 7;
  7. Округленное расстояние в пунктах от точки 1 до точки 8;
  8. Округленное расстояние в пунктах от точки 1 до точки 9;

Код в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;
   
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   a1 = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()));
   a2 = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   a3 = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()));
   a4 = (int)(a4/100)*100;
   
   int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()));
   b1 = (int)(b1/100)*100;
   int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point()));
   b2 = (int)(b2/100)*100;
   int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()));
   b3 = (int)(b3/100)*100;
   int b4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point()));
   b4 = (int)(b4/100)*100;
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

Код в советниках на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point()));
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point()));
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point()));
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point()));
   xInputs[3] = (int)(a4/100)*100;
   
   int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point()));
   xInputs[4] = (int)(g1/100)*100;
   int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point()));
   xInputs[5] = (int)(g2/100)*100;
   int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point()));
   xInputs[6] = (int)(g3/100)*100;
   int g4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point()));
   xInputs[7] = (int)(g4/100)*100;
   
   return(1);

  }

2.5 Шаблон параллелограмм из четырех значений, растянутый на 24 свечи. Более сложная конструкция для передачи параметров. На периоде H1 равно одному дню.

Параллелограмм

Ниже описание какие значения передаем:

  1. От точки 10 до точки 2 прибавляем в моем случае 800 пунктов по пятизнаку;
  2. От точки 10 до точки 1 отнимаем 800 пунктов;
  3. От точки 9 до точки 3 прибавляем 800 пунктов;
  4. От точки 9 до точки 4 отнимаем 800 пунктов;
  5. Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
  6. Округленное значение от точки 3 до точки 7;
  7. Округленное значение от точки 2 до точки 6;
  8. Округленное значение от точки 1 до точки 5;

Код в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,7)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point());
   a4 = (int)(a4/100)*100;
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

Код в советниках на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,7)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point());
   xInputs[3] = (int)(a4/100)*100;
   
   return(1);

  }

2.6 Шаблон параллелограмм из четырех значений, растянутый на 48 свечей. Больший охват во времени. На периоде H1 равно двум дням.

Параллелограмм

Ниже описание какие значения передаем:

  1. От точки 10 до точки 2 прибавляем в моем случае 1200 пунктов по пятизнаку. Значение в пунктах я увеличил, так как цена за два дня может меняться в больших пределах. Таким образом, мы не нарушим нашу конструкцию;
  2. От точки 10 до точки 1 отнимаем 1200 пунктов;
  3. От точки 9 до точки 3 прибавляем 1200 пунктов;
  4. От точки 9 до точки 4 отнимаем 1200 пунктов;
  5. Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
  6. Округленное значение от точки 3 до точки 7;
  7. Округленное значение от точки 2 до точки 6;
  8. Округленное значение от точки 1 до точки 5;

Код в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point());
   a4 = (int)(a4/100)*100;
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

Код в советниках на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point());
   xInputs[3] = (int)(a4/100)*100;
   
   return(1);

  }

2.7 Шаблон параллелограмм из восьми значений, растянутый на 24 свечи. На периоде H1 равно одному дню.

Параллелограмм

Ниже описание какие значения передаем:

  1. От точки 9 прибавляем в моем случае 800 пунктов по пятизнаку, получаем точку 3;
  2. От точки 9 отнимаем 800 пунктов, получаем точку 4;
  3. От точки 12 до точки 2 прибавляем 800 пунктов;
  4. От точки 12 до точки 1 отнимаем 800 пунктов;
  5. Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
  6. Округленное значение от точки 7 до точки 3;
  7. Округленное значение от точки 13 до точки 4;
  8. Округленное значение от точки 6 до точки 3;
  9. Округленное значение от точки 2 до точки 6;
  10. Округленное значение от точки 2 до точки 10;
  11. Округленное значение от точки 12 до точки 11 (точка 1 найдена как разница между точками 4 и 1);
  12. Округленное значение от точки 1 до точки 5;

Код в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,5)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point());
   a4 = (int)(a4/100)*100;

   int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   b1 = (int)(b1/100)*100;
   int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,17))/Point());
   b2 = (int)(b2/100)*100;
   int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,21))/Point());
   b3 = (int)(b3/100)*100;
   int b4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))/2))/Point()) ;
   b4 = (int)(b4/100)*100;

   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

И как это будет выглядеть в коде для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,5)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,13)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())))/Point());
   xInputs[3] = (int)(a4/100)*100;

   int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   xInputs[4] = (int)(g1/100)*100;
   int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)+(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,17))/Point());
   xInputs[5] = (int)(g2/100)*100;
   int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,21))/Point());
   xInputs[6] = (int)(g3/100)*100;
   int b4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,24)-(800*Point()))/2))/Point()) ;
   xInputs[7] = (int)(g4/100)*100;
   
   return(1);

  }

2.8 Шаблон параллелограмм из восьми значений, растянутый на 48 свечей для большего охвата истории. На периоде H1 равно двум дням.

Параллелограмм

Ниже описание какие значения передаем:

  1. От точки 9 прибавляем в моем случае 1200 пунктов по пятизнаку, получаем точку 3;
  2. От точки 9 отнимаем  1200 пунктов, получаем точку 4;
  3. От точки 12 до точки 2 прибавляем  1200  пунктов;
  4. От точки 12 до точки 1 отнимаем  1200  пунктов;
  5. Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
  6. Округленное значение от точки 7 до точки 3;
  7. Округленное значение от точки 13 до точки 4;
  8. Округленное значение от точки 6 до точки 3;
  9. Округленное значение от точки 2 до точки 6;
  10. Округленное значение от точки 2 до точки 10;
  11. Округленное значение от точки 12 до точки 11 (точка 1 найдена как разница между точками 4 и 1);
  12. Округленное значение от точки 1 до точки 5;

Код в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,17)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,25)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point());
   a4 = (int)(a4/100)*100;

   int b1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   b1 = (int)(b1/100)*100;
   int b2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,33))/Point());
   b2 = (int)(b2/100)*100;
   int b3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,41))/Point());
   b3 = (int)(b3/100)*100;
   int b4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))/2))/Point()) ;
   b4 = (int)(b4/100)*100;

   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

Код для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,9)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point());
   xInputs[0] = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,17)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())))/Point());
   xInputs[0] = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,25)-(iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())))/Point());
   xInputs[0] = (int)(a4/100)*100;

   int g1 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   xInputs[0] = (int)(g1/100)*100;
   int g2 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)+(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,33))/Point());
   xInputs[0] = (int)(g2/100)*100;
   int g3 = (int)(((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))-iClose(symbolS1.Name(),PERIOD_CURRENT,41))/Point());
   xInputs[0] = (int)(g3/100)*100;
   int g4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point()))+(iClose(symbolS1.Name(),PERIOD_CURRENT,48)-(1200*Point()))/2))/Point()) ;
   xInputs[0] = (int)(g4/100)*100;
   
   return(1);

  }

2.9 Шаблон треугольник из четырех значений, растянутый на 24 свечи. На периоде H1 равно одному дню.

Треугольник

Ниже описание какие значения передаем:

  1. От точки 4 до точки 2 прибавляем в моем случае 800 пунктов по пятизнаку;
  2. От точки 4 до точки 3 отнимаем 800 пунктов;
  3. Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
  4. Округленное значение от точки 3 до точки 5;
  5. Округленное значение от точки 1 до точки 6;
  6. Округленное значение от точки 1 до точки 7;

Код в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point());
   a4 = (int)(a4/100)*100;

   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

Код для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point());
   xInputs[3] = (int)(a4/100)*100;
   
   return(1);

  }

2.10 Шаблон треугольник из четырех значений, охват истории 48 свечей. Два дня на периоде H1.

Треугольник

Ниже описание какие значения передаем в перцептрон и нейросеть:

  1. От точки 4 до точки 2 прибавляем в моем случае 1200 пунктов по пятизнаку;
  2. От точки 4 до точки 3 отнимаем 1200 пунктов;
  3. Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
  4. Округленное значение от точки 3 до точки 5;
  5. Округленное значение от точки 1 до точки 6;
  6. Округленное значение от точки 1 до точки 7;

Код шаблона в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point());
   a4 = (int)(a4/100)*100;

   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

Код шаблона для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
  
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point());
   xInputs[3] = (int)(a4/100)*100;
   
   return(1);

  }

2.11 Шаблон треугольник из восьми значений, растянутый на 24 свечи. Охват истории для анализа один день на таймфрейме H1.

Треугольник

Ниже также опишу какие значения передаем:

  1. От точки 4 до точки 2 прибавляем в моем случае 800 пунктов по пятизнаку;
  2. От точки 4 до точки 3 отнимаем 800 пунктов;
  3. Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
  4. Округленное значение от точки 3 до точки 5;
  5. Округленное значение от точки 1 до точки 6;
  6. Округленное значение от точки 1 до точки 7;
  7. Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 1);
  8. Округленное значение от точки 8 до точки 10 (точка 8 найдена как разница между точками 2 и 1);
  9. Округленное значение от точки 8 до точки 11 (точка 8 найдена как разница между точками 2 и 1);
  10. Округленное значение от точки 8 до точки 12 (точка 8 найдена как разница между точками 2 и 1);

 

Код шаблона в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point());
   a4 = (int)(a4/100)*100;
   
   int b1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point());
   b1 = (int)(b1/100)*100;
   int b2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point());
   b2 = (int)(b2/100)*100;
   int b3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point());
   b3 = (int)(b3/100)*100;
   int b4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point());
   b4 = (int)(b4/100)*100;

   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

Код шаблона для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,7))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,24)-iClose(symbolS1.Name(),PERIOD_CURRENT,19))/Point());
   xInputs[3] = (int)(a4/100)*100;
   
   int g1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,4))/Point());
   xInputs[4] = (int)(g1/100)*100;
   int g2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,10))/Point());
   xInputs[5] = (int)(g2/100)*100;
   int g3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,16))/Point());
   xInputs[6] = (int)(g3/100)*100;
   int g4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(800*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,24))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,22))/Point());
   xInputs[7] = (int)(g4/100)*100;
   
   return(1);

  }

2.12 Шаблон треугольник из восьми значений, растянутый на 48 свечей. Охват истории для анализа два дня на таймфрейме H1.

Треугольник

Ниже также опишу какие значения передаем:

  1. От точки 4 до точки 2 прибавляем в моем случае 1200 пунктов по пятизнаку, прибавляемое значение увеличиваем на 48 свечах;
  2. От точки 4 до точки 3 отнимаем 1200 пунктов;
  3. Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
  4. Округленное значение от точки 3 до точки 5;
  5. Округленное значение от точки 1 до точки 6;
  6. Округленное значение от точки 1 до точки 7;
  7. Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 1);
  8. Округленное значение от точки 8 до точки 10 (точка 8 найдена как разница между точками 2 и 1);
  9. Округленное значение от точки 8 до точки 11 (точка 8 найдена как разница между точками 2 и 1);
  10. Округленное значение от точки 8 до точки 12 (точка 8 найдена как разница между точками 2 и 1);

Код шаблона в советниках на перцептроне:

//+------------------------------------------------------------------+
//|  The PERCEPRRON - a perceiving and recognizing function          |
//+------------------------------------------------------------------+
double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   a1 = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   a2 = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   a3 = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point());
   a4 = (int)(a4/100)*100;
   
   int b1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,6))/Point());
   b1 = (int)(b1/100)*100;
   int b2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,18))/Point());
   b2 = (int)(b2/100)*100;
   int b3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point());
   b3 = (int)(b3/100)*100;
   int b4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point());
   b4 = (int)(b4/100)*100;

   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

Код шаблона треугольник для советников на библиотеке DeepNeuralNetwork.mqh:

//+------------------------------------------------------------------+
//|percentage of each part of the candle respecting total size       |
//+------------------------------------------------------------------+
int CandlePatterns(double &xInputs[])
  {
   
   int a1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,1))/Point());
   xInputs[0] = (int)(a1/100)*100;
   int a2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,13))/Point());
   xInputs[1] = (int)(a2/100)*100;
   int a3 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,25))/Point());
   xInputs[2] = (int)(a3/100)*100;
   int a4 = (int)((iClose(symbolS1.Name(),PERIOD_CURRENT,48)-iClose(symbolS1.Name(),PERIOD_CURRENT,37))/Point());
   xInputs[3] = (int)(a4/100)*100;
   
   int g1 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)+(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,6))/Point());
   xInputs[4] = (int)(g1/100)*100;
   int g2 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,18))/Point());
   xInputs[5] = (int)(g2/100)*100;
   int g3 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,31))/Point());
   xInputs[6] = (int)(g3/100)*100;
   int g4 = (int)((((iClose(symbolS1.Name(),PERIOD_CURRENT,1)-(1200*Point())+iClose(symbolS1.Name(),PERIOD_CURRENT,48))/2)-iClose(symbolS1.Name(),PERIOD_CURRENT,43))/Point());
   xInputs[7] = (int)(g4/100)*100;
   
   return(1);

  }


3. Советники

Итак, приступим к самому интересному, а именно оптимизации и тестированию наших шаблонов. Напоминаю что оптимизация и тестирование советников на библиотеке DeepNeuralNetwork.mqh проводилась стандартными средствами MQL5 без использования технологии оптимизации описанной в (Статье 2). Также было замечено, что 20 проходов немного маловато для этих советников. Я рекомендую Вам провести оптимизацию самостоятельно с большим количеством итераций, возможно, (я уверен) это улучшит результат. Большое количество оптимизируемых параметров требует больше времени на выявление лучших результатов. В данной статье я только хочу показать нестандартные методы передачи данных в нейросети.

В советниках на библиотеке DeepNeuralNetwork.mqh с четырьмя параметрами в шаблоне используется схема нейросети 4-4-3, с восемью параметрами схема 8-4-3.

Каждый из советников я постарался назвать в соответствии его стратегии и используемого для анализа шаблона. Так что думаю, заблудиться будет трудно. Но если что, вы всегда можете написать мне на форуме или в личные сообщения. 

В каждом советнике для проведения форвард тестирования использовались первые 40 лучших результатов полученных при оптимизации в режиме «Максимум комплексного критерия». Результаты буду выкладывать в формате результаты оптимизации и ниже результаты форвард тестирования.

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

Для тех, кто читает эту статью первой из этой серии и не понимает, как проводится тестирование, прошу ознакомиться с (Часть 3), там все подробно описано.


3.1 Советники на перцептроне.

Советник perceptron fan 4 SL TP 24 - trade - четыре параметра на 24 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Как видим, результат форвард тестирования не радует. Плавный слив депозита на всем промежутке истории. Профит фактор результатов тестирования на высоком уровне. Вероятно, сказывается соотношение СтопЛосс к ТейкПрофиту.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

Профит фактор едва превышает значение 1,8. На всей годовой истории большие просадки депозита. Минимальный рост депозита. Можно сказать, топчемся на одном месте.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

Болтанка депозита на всем диапазоне форвард тестирования, сколько заработали столько и теряем, очень нестабильные результаты. Профит фактор при оптимизации в районе 2.


Советник perceptron fan 4 SL TP 48 - trade - четыре параметра на 48 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Стабильный рост депозита первые полгода, дальше некий спад я думаю, по причине отсутствия дополнительной оптимизации на таком большом периоде времени. Более стабильные результаты за счет увеличения времени в передаваемых параметрах. Профит фактор значительно выше результата на 24 свечах. Отсутствие признаков привязки к соотношению СтопЛосс к ТейкПрофиту.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

Стабильный рост депозита первые пять месяцев, далее спад, возможно рынок изменился в отличии от подобранных условий в перцептроне. Рваный график первые пять месяцев все-таки наводит на мысль о нестабильности системы.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

Наиболее стабильный результат в тестах на перцептроне с шаблоном веер. Уверенный рост первые полгода. Далее незначительный спад по причине отсутствия переоптимизации. ТейкПрофит больше в два раза СтопЛосса дает хороший результат по классике торговли, профит больше стопа. Профит фактор при оптимизации на уровне 1,6 что я думаю закономерно учитывая соотношение СтопЛосс к ТейкПрофиту.


 

Советник perceptron fan 8 SL TP 24 - trade - восемь параметров на 24 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Получился довольно рваный график, но результат кардинально отличается от советника с четырьмя параметрами с таким же ТейкПрофит и СтопЛосс. Также наблюдается некий спад после первого полугодия. Средний профит фактор при оптимизации около 6, что довольно много.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

В данном форвард тесте получаем полный провал. Думаю, это связано с соотношением ТейкПрофит и СтопЛосс один к одному. Оптимизация показала профит фактор в районе 1,7 но ситуацию это не спасло.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

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


Советник perceptron fan 8 SL TP 48 - trade - восемь параметров на 48 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Рваный график, с учетом соотношения ТейкПрофит к СтопЛосс получаем убыток. Оптимизация показала профит фактор в районе 3,5-4 но, форвард тестирование показало убыток.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

Также получаем болтанку на одном месте и в данном варианте. Очень странно, почему спад баланса идет сразу в начале теста. Оптимизация показала профит фактор в районе 2.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

Очень хороший старт в начале, приблизительно первые 3 месяца, далее видимо сказалось отсутствие новой оптимизации. Соотношение ТейкПрофит к СтопЛосс два к одному не спасло ситуацию, на столь длительном периоде. При оптимизации профит фактор в среднем 1,4.


3.2 Советники на библиотеке DeepNeuralNetwork.mqh.

Советник 4-4-3 fan 4 SL TP 24 - trade - четыре параметра на 24 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Профит фактор 20 что очень много. В форварде получаем положительный результат, но имеем большие СтопЛосс. Но все же большее количество маленьких положительных ТейкПрофит вытягивают ситуацию.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

График баланса топчется на одном месте. Оптимизация показала профит фактор в районе 1,7.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

Медленный, но уверенный спад. Соотношение ТейкПрофит к СтопЛосс не вытягивает ситуацию.  Оптимизация показала профит фактор в районе 2.


Советник 4-4-3 fan 4 SL TP 48 - trade - четыре параметра на 48 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Передача шаблона на 48 свечах не показала положительного результата в отличии от того же шаблона на 24 свечах. Видимо столь растянутый во времени шаблон плохо работает с таким соотношением ТейкПрофит к СтопЛосс. Оптимизация показала профит фактор в районе 14 что не мало.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

При оптимизации получаем профит фактор 2,5. Как видим, ТейкПрофит 230 СтопЛосс 200 не отрабатывают, получаем медленный спад баланса.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

В данном случае топчемся на месте. На протяжении года баланс падает и растет, компенсируя потери один к одному. При оптимизации получаем профит фактор 2,7.


Советник 8-4-3 fan 8 SL TP 24 - trade - восемь параметров на 24 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Очень интересные результаты, всего один СтопЛосс на всей истории форвард тестирования. Но все-таки, возможно, результаты случайны. При оптимизации профит фактор зашкаливает на отметке 29.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

Как видно по скриншоту, топтание на месте. При оптимизации профит фактор на уровне 2,7 чего должно было хватить при нашем соотношении ТейкПрофит к СтопЛосс но не хватило. Виден некоторый всплеск вверх первые полгода.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

Первые два-три месяца небольшой рост, далее, видимо, ситуация на рынке поменялась, и советник начал терять депозит. Видимо, постоянная оптимизация все-таки необходима. При оптимизации профит фактор на уровне 3,9.


Советник 8-4-3 fan 8 SL TP 48 - trade - восемь параметров на 48 свечах, шаблон веер:

ТейкПрофит 60 СтопЛосс 600:

Оптимизация


Форвард

Поведение этого советника схоже с предыдущим на шаблоне в 24 свечи. Убыточных сделок больше. При оптимизации профит фактор на уровне 26, на 24 свечи было 29.


ТейкПрофит 230 СтопЛосс 200:

Оптимизация


Форвард

При оптимизации профит фактор на уровне 3. Уровень баланса остается на одном месте. Чередуются убытки с профитом.


ТейкПрофит 430 СтопЛосс 200:

Оптимизация


Форвард

В два раза больше ТейкПрофит по отношению к СтопЛосс не приводит к положительному результату. Скорее всего, нейросети не под силу спрогнозировать такой большой ТейкПрофит. При оптимизации профит фактор на уровне 3.


Заключение

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

  • В плане масштабирования получилась очень гибкая система. Возможно, применять неограниченное количество шаблонов и параметров, которые мы передаем в них. Придумывать новые шаблоны и наблюдать за результатами, что лучше сказывается на форвард тестировании.
  • Возможно, необходимо еще попробовать системы с несколькими перцептронами и разными шаблонами в них для определения сигнала на вход.
  • Компьютерных мощностей явно не хватает. Необходимы системы с не просто большим количеством ядер, а огромным. В идеале двух процессорная сборка с общим количеством ядер 16 и более.  Как известно, тестер стратегий использует только физические ядра, а не потоки. Возможность использовать сервис MQL5 Cloud Network может существенно повысить продуктивность в наших поисках.
  • Количество входных передаваемых параметров существенно увеличивает нагрузку на перцептрон или нейросеть. Округление значений входных параметров увеличило количество положительных результатов. По моим наблюдениям приблизительно в два раза. Что не может не радовать.
  • Перед тем как выбрать для дальнейшего развития систему, необходимо проверить еще пару вариантов способов передачи данных в перцептрон и нейросеть а именно индикаторы, которые ходят в определенном диапазоне и такое интересное явление как дивергенция. Чем, я думаю, мы и займемся в ближайшее время.


Список файлов во вложении:

  1. DeepNeuralNetwork - оригинальная библиотека:
  2. DeepNeuralNetwork2 - модифицированная библиотека для нейросети структуры 4-4-3;
  3. DeepNeuralNetwork3 - модифицированная библиотека для нейросети структуры 8-4-3;
  4. perceptron fan 4 SL TP 24 - opt - советник на перцептроне для оптимизации шаблона веер с четырьмя параметрами на 24 свечах;
  5. perceptron fan 4 SL TP 48 - opt  - советник на перцептроне для оптимизации шаблона веер с четырьмя параметрами на 48 свечах;
  6. perceptron fan 8 SL TP 24 - opt - советник на перцептроне для оптимизации шаблона веер на восемь параметров на 24 свечах;
  7. perceptron fan 8 SL TP 48 - opt - советник на перцептроне для оптимизации шаблона веер на восемь параметров на 48 свечах;
  8. perceptron fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер с четырьмя параметрами на 24 свечах;
  9. perceptron fan 4 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер с четырьмя параметрами на 48 свечах;
  10. perceptron fan 8 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер на восемь параметров на 24 свечах;
  11. perceptron fan 8 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер на восемь параметров на 48 свечах;
  12. 4-4-3 fan 4 SL TP 24 - opt -  советник на библиотеке для оптимизации шаблона веер с четырьмя параметрами на 24 свечах;
  13. 4-4-3 fan 4 SL TP 48 - opt -  советник на библиотеке для оптимизации шаблона веер с четырьмя параметрами на 48 свечах;
  14. 8-4-3 fan 4 SL TP 24 - opt -  советник на библиотеке для оптимизации шаблона веер на восемь параметров на 24 свечах;
  15. 8-4-3 fan 4 SL TP 48 - opt -  советник на библиотеке для оптимизации шаблона веер на восемь параметров на 48 свечах;
  16. 4-4-3 fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер с четырьмя параметрами на 24 свечах;
  17. 4-4-3 fan 4 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер с четырьмя параметрами на 48 свечах;
  18. 8-4-3 fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер на восемь параметров на 24 свечах;
  19. 8-4-3 fan 4 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер на восемь параметров на 48 свечах;

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


Прикрепленные файлы |
EA.zip (4201.73 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (13)
HyperShortyy
HyperShortyy | 9 мар. 2023 в 22:05
Ukrainian:

Вітаю Романе, мене дуже зацікавила серія, яку ти створюєш. Я хотів би запропонувати тобі використання моїх інформаційних ресурсів безкоштовно. Моя електронна адреса: sciortybrothers@gmail.com. Будь ласка, надішліть мені будь-яке повідомлення, щоб я міг на нього відповісти. Гарного дня!

English:

Hello Roman, I am very interested in the series that you are creating. I would like to offer you the use of my informatics resources for free. My email address is sciortybrothers@gmail.com. Please feel free to send me even just a word so that I can respond to you. Have a good day!
Sergei Poliukhov
Sergei Poliukhov | 8 апр. 2023 в 17:57

Интересная статья  может добавить оптимизацию,  день недели , часы

, например  с 15-17 волатильные часы и фигуры прорывные треугольники.

Может первая пятница месяца(нонфарм). Также можно добавить имбаланс(середина импульсной свечи, ордерблоки, только те, где есть имбалансы.

 Например  в пн после сильных новостей в пятницу обычно противные. или последний день месяца, тоже.   Ещё замечал поведение что последняя минута которая кратна 15, 30 минутам -иммульсная

Sergei Poliukhov
Sergei Poliukhov | 8 апр. 2023 в 17:58
также могу в рабочее время дать мвли мощности для тестирования бесплатно, если вы разработчик. 
Roman Poshtar
Roman Poshtar | 8 апр. 2023 в 18:02
Sergei Poliukhov #:

Интересная статья  может добавить оптимизацию,  день недели , часы

, например  с 15-17 волатильные часы и фигуры прорывные треугольники.

Может первая пятница месяца(нонфарм). Также можно добавить имбаланс(середина импульсной свечи, ордерблоки, только те, где есть имбалансы.

 Например  в пн после сильных новостей в пятницу обычно противные. или последний день месяца, тоже.   Ещё замечал поведение что последняя минута которая кратна 15, 30 минутам -иммульсная

Все можно сделать. Было бы желание. Спасибо за отзыв. Торговые сесии в разработке.

Roman Poshtar
Roman Poshtar | 8 апр. 2023 в 18:03
Sergei Poliukhov #:
также могу в рабочее время дать мвли мощности для тестирования бесплатно, если вы разработчик. 

Команда набирается. Писать в ЛС.

Популяционные алгоритмы оптимизации: Алгоритм обезьян (Monkey algorithm, MA) Популяционные алгоритмы оптимизации: Алгоритм обезьян (Monkey algorithm, MA)
В этой статье рассмотрим алгоритм оптимизации "Алгоритм обезьян" (MA). Способность этих подвижных животных преодолевать сложные препятствия и добираться до самых труднодоступных вершин деревьев легли в основу идеи алгоритма MA.
Нейросети — это просто (Часть 36): Реляционные модели обучения с подкреплением (Relational Reinforcement Learning) Нейросети — это просто (Часть 36): Реляционные модели обучения с подкреплением (Relational Reinforcement Learning)
В рассмотренных ранее моделях обучения с подкреплением мы использовали различные варианты сверточных сетей, которые способны идентифицировать различные объекты в исходных данных. Основное преимущество сверточных сетей в способности идентифицировать объекты вне зависимости от их расположением. В тоже время, сверточные сети не всегда справляются с различными деформациями объектов и шумом. Но эти проблемы способна решить реляционная модель.
Разработка экспериментальной DLL с поддержкой многопоточности в C++ для MetaTrader 5 на Linux Разработка экспериментальной DLL с поддержкой многопоточности в C++ для MetaTrader 5 на Linux
В статье рассмотрен процесс разработки для платформы MetaTrader 5 исключительно в системе Linux. При этом конечный продукт без проблем работает как в Windows, так и в Linux. Мы познакомимся с Wine и Mingw - важными инструментами кроссплатформенной разработки. В Mingw реализована потоковая передача (POSIX и Win32), что необходимо учитывать при выборе подходящего инструмента. Затем мы создадим DLL для проверки концепции и используем ее в коде MQL5, а также сравним производительность обеих реализаций потоков. Статья призвана стать отправной точкой для ваших собственных экспериментов. После прочтения статьи вы сможете создавать инструменты для MetaTrader в Linux.
Популяционные алгоритмы оптимизации: Гармонический поиск (Harmony Search — HS) Популяционные алгоритмы оптимизации: Гармонический поиск (Harmony Search — HS)
Сегодня изучим и протестируем мощнейший алгоритм оптимизации - гармонический поиск (HS), который инспирирован процессом поиска идеальной звуковой гармонии. И какой же алгоритм теперь лидер в нашем рейтинге?