Эксперименты с нейросетями (Часть 4): Шаблоны
Введение
Добрый день, уважаемые пользователи сообщества 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. Здесь я не могу ее выложить, но всем, кому понадобится, я отправлю в личных сообщениях, если Вы мне напишете. Работает это так:
- Вводим необходимое количество оптимизаций.
- Наводим курсор мышки на кнопку Старт в оптимизаторе стратегий.
- Идем заниматься своими делами.
Оптимизация закончится по истечению указанных циклов и программа закроется. Автокликер реагирует на изменение цвета кнопки Старт. Ниже на скриншоте как выглядит программа.
2. Шаблоны
Шаблон представляет собой некую конструкцию похожую на «плавающий паттерн». Его значения постоянно меняются в зависимости от ситуации на рынке, но каждое из значений находятся в определенном диапазоне, что и нужно для наших экспериментов. Так, как нам уже известно, что данные, которые мы передаем в нейросеть, должны находиться в определенном диапазоне. Значение в шаблоне округляется до целого для упрощения и лучшего понимания перцептроном и нейросетью. Таким образом мы получаем большее количество ситуаций для срабатывания условий и меньшую нагрузку на перцептрон и нейросеть. Ниже на скриншоте Вы видите первый, из шаблонов который мне пришел на ум. Назвал я его веер, думаю сходство очевидно. Индикаторы в данной статье мы использовать не будем, работаем со свечами.
Ниже показаны примеры с использованием масштабирования на истории, таким образом, мы можем анализировать более короткую или глубокую историю.
Использовать равное количество свечей в шаблонах не является обязательным условием что дает дополнительное поле для размышлений по поводу актуальности предыдущих значений цены. В нашем случае цены закрытия свечей.
Важно понимать, что в примерах с использованием библиотеки DeepNeuralNetwork.mqh на 24 свечи мы используем разные библиотеки, которые я описал в предыдущих статьях. С разными настройками входных данных. А именно 4 и 8 параметров на вход нейросети. Но Вы за это можете не переживать во вложении я добавил советники и нужные библиотеки.
2.1 Шаблон веер из четырёх значений, растянутый на 24 свечи. На периоде H1 равно одному дню.
И так опишем, что мы будем передавать в перцептрон и нейросеть для большего понимания:
- Округленное расстояние в пунктах от точки 1 до точки 2;
- Округленное расстояние в пунктах от точки 1 до точки 3;
- Округленное расстояние в пунктах от точки 1 до точки 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 равно одному дню.
Что передаем в перцептрон и нейросеть для большего понимания:
- Округленное расстояние в пунктах от точки 1 до точки 2;
- Округленное расстояние в пунктах от точки 1 до точки 3;
- Округленное расстояние в пунктах от точки 1 до точки 4;
- Округленное расстояние в пунктах от точки 1 до точки 5;
- Округленное расстояние в пунктах от точки 1 до точки 6;
- Округленное расстояние в пунктах от точки 1 до точки 7;
- Округленное расстояние в пунктах от точки 1 до точки 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 равно двум дням.
Итак, опишем, что к чему для большего понимания:
- Округленное расстояние в пунктах от точки 1 до точки 2;
- Округленное расстояние в пунктах от точки 1 до точки 3;
- Округленное расстояние в пунктах от точки 1 до точки 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 равно двум дням.
Что передаем в перцептрон и нейросеть для большего понимания, точки отсчета сместились на равное количество свечей:
- Округленное расстояние в пунктах от точки 1 до точки 2;
- Округленное расстояние в пунктах от точки 1 до точки 3;
- Округленное расстояние в пунктах от точки 1 до точки 4;
- Округленное расстояние в пунктах от точки 1 до точки 5;
- Округленное расстояние в пунктах от точки 1 до точки 6;
- Округленное расстояние в пунктах от точки 1 до точки 7;
- Округленное расстояние в пунктах от точки 1 до точки 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 равно одному дню.
Ниже описание какие значения передаем:
- От точки 10 до точки 2 прибавляем в моем случае 800 пунктов по пятизнаку;
- От точки 10 до точки 1 отнимаем 800 пунктов;
- От точки 9 до точки 3 прибавляем 800 пунктов;
- От точки 9 до точки 4 отнимаем 800 пунктов;
- Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
- Округленное значение от точки 3 до точки 7;
- Округленное значение от точки 2 до точки 6;
- Округленное значение от точки 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 равно двум дням.
Ниже описание какие значения передаем:
- От точки 10 до точки 2 прибавляем в моем случае 1200 пунктов по пятизнаку. Значение в пунктах я увеличил, так как цена за два дня может меняться в больших пределах. Таким образом, мы не нарушим нашу конструкцию;
- От точки 10 до точки 1 отнимаем 1200 пунктов;
- От точки 9 до точки 3 прибавляем 1200 пунктов;
- От точки 9 до точки 4 отнимаем 1200 пунктов;
- Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
- Округленное значение от точки 3 до точки 7;
- Округленное значение от точки 2 до точки 6;
- Округленное значение от точки 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 равно одному дню.
Ниже описание какие значения передаем:
- От точки 9 прибавляем в моем случае 800 пунктов по пятизнаку, получаем точку 3;
- От точки 9 отнимаем 800 пунктов, получаем точку 4;
- От точки 12 до точки 2 прибавляем 800 пунктов;
- От точки 12 до точки 1 отнимаем 800 пунктов;
- Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
- Округленное значение от точки 7 до точки 3;
- Округленное значение от точки 13 до точки 4;
- Округленное значение от точки 6 до точки 3;
- Округленное значение от точки 2 до точки 6;
- Округленное значение от точки 2 до точки 10;
- Округленное значение от точки 12 до точки 11 (точка 1 найдена как разница между точками 4 и 1);
- Округленное значение от точки 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 равно двум дням.
Ниже описание какие значения передаем:
- От точки 9 прибавляем в моем случае 1200 пунктов по пятизнаку, получаем точку 3;
- От точки 9 отнимаем 1200 пунктов, получаем точку 4;
- От точки 12 до точки 2 прибавляем 1200 пунктов;
- От точки 12 до точки 1 отнимаем 1200 пунктов;
- Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 3);
- Округленное значение от точки 7 до точки 3;
- Округленное значение от точки 13 до точки 4;
- Округленное значение от точки 6 до точки 3;
- Округленное значение от точки 2 до точки 6;
- Округленное значение от точки 2 до точки 10;
- Округленное значение от точки 12 до точки 11 (точка 1 найдена как разница между точками 4 и 1);
- Округленное значение от точки 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 равно одному дню.
Ниже описание какие значения передаем:
- От точки 4 до точки 2 прибавляем в моем случае 800 пунктов по пятизнаку;
- От точки 4 до точки 3 отнимаем 800 пунктов;
- Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 3 до точки 5;
- Округленное значение от точки 1 до точки 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.
Ниже описание какие значения передаем в перцептрон и нейросеть:
- От точки 4 до точки 2 прибавляем в моем случае 1200 пунктов по пятизнаку;
- От точки 4 до точки 3 отнимаем 1200 пунктов;
- Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 3 до точки 5;
- Округленное значение от точки 1 до точки 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.
Ниже также опишу какие значения передаем:
- От точки 4 до точки 2 прибавляем в моем случае 800 пунктов по пятизнаку;
- От точки 4 до точки 3 отнимаем 800 пунктов;
- Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 3 до точки 5;
- Округленное значение от точки 1 до точки 6;
- Округленное значение от точки 1 до точки 7;
- Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 8 до точки 10 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 8 до точки 11 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 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.
Ниже также опишу какие значения передаем:
- От точки 4 до точки 2 прибавляем в моем случае 1200 пунктов по пятизнаку, прибавляемое значение увеличиваем на 48 свечах;
- От точки 4 до точки 3 отнимаем 1200 пунктов;
- Округленное значение от точки 8 до точки 4 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 3 до точки 5;
- Округленное значение от точки 1 до точки 6;
- Округленное значение от точки 1 до точки 7;
- Округленное значение от точки 8 до точки 9 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 8 до точки 10 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 8 до точки 11 (точка 8 найдена как разница между точками 2 и 1);
- Округленное значение от точки 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 может существенно повысить продуктивность в наших поисках.
- Количество входных передаваемых параметров существенно увеличивает нагрузку на перцептрон или нейросеть. Округление значений входных параметров увеличило количество положительных результатов. По моим наблюдениям приблизительно в два раза. Что не может не радовать.
- Перед тем как выбрать для дальнейшего развития систему, необходимо проверить еще пару вариантов способов передачи данных в перцептрон и нейросеть а именно индикаторы, которые ходят в определенном диапазоне и такое интересное явление как дивергенция. Чем, я думаю, мы и займемся в ближайшее время.
Список файлов во вложении:
- DeepNeuralNetwork - оригинальная библиотека:
- DeepNeuralNetwork2 - модифицированная библиотека для нейросети структуры 4-4-3;
- DeepNeuralNetwork3 - модифицированная библиотека для нейросети структуры 8-4-3;
- perceptron fan 4 SL TP 24 - opt - советник на перцептроне для оптимизации шаблона веер с четырьмя параметрами на 24 свечах;
- perceptron fan 4 SL TP 48 - opt - советник на перцептроне для оптимизации шаблона веер с четырьмя параметрами на 48 свечах;
- perceptron fan 8 SL TP 24 - opt - советник на перцептроне для оптимизации шаблона веер на восемь параметров на 24 свечах;
- perceptron fan 8 SL TP 48 - opt - советник на перцептроне для оптимизации шаблона веер на восемь параметров на 48 свечах;
- perceptron fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер с четырьмя параметрами на 24 свечах;
- perceptron fan 4 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер с четырьмя параметрами на 48 свечах;
- perceptron fan 8 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер на восемь параметров на 24 свечах;
- perceptron fan 8 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на перцептроне, шаблон веер на восемь параметров на 48 свечах;
- 4-4-3 fan 4 SL TP 24 - opt - советник на библиотеке для оптимизации шаблона веер с четырьмя параметрами на 24 свечах;
- 4-4-3 fan 4 SL TP 48 - opt - советник на библиотеке для оптимизации шаблона веер с четырьмя параметрами на 48 свечах;
- 8-4-3 fan 4 SL TP 24 - opt - советник на библиотеке для оптимизации шаблона веер на восемь параметров на 24 свечах;
- 8-4-3 fan 4 SL TP 48 - opt - советник на библиотеке для оптимизации шаблона веер на восемь параметров на 48 свечах;
- 4-4-3 fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер с четырьмя параметрами на 24 свечах;
- 4-4-3 fan 4 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер с четырьмя параметрами на 48 свечах;
- 8-4-3 fan 4 SL TP 24 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер на восемь параметров на 24 свечах;
- 8-4-3 fan 4 SL TP 48 - trade (600 60), (200 230), (200 430) - оптимизированные советники на библиотеке, шаблон веер на восемь параметров на 48 свечах;
Спасибо за внимание, друзья, и до встречи!
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Интересная статья может добавить оптимизацию, день недели , часы
, например с 15-17 волатильные часы и фигуры прорывные треугольники.
Может первая пятница месяца(нонфарм). Также можно добавить имбаланс(середина импульсной свечи, ордерблоки, только те, где есть имбалансы.
Например в пн после сильных новостей в пятницу обычно противные. или последний день месяца, тоже. Ещё замечал поведение что последняя минута которая кратна 15, 30 минутам -иммульсная
Интересная статья может добавить оптимизацию, день недели , часы
, например с 15-17 волатильные часы и фигуры прорывные треугольники.
Может первая пятница месяца(нонфарм). Также можно добавить имбаланс(середина импульсной свечи, ордерблоки, только те, где есть имбалансы.
Например в пн после сильных новостей в пятницу обычно противные. или последний день месяца, тоже. Ещё замечал поведение что последняя минута которая кратна 15, 30 минутам -иммульсная
Все можно сделать. Было бы желание. Спасибо за отзыв. Торговые сесии в разработке.
также могу в рабочее время дать мвли мощности для тестирования бесплатно, если вы разработчик.
Команда набирается. Писать в ЛС.