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

Эксперименты с нейросетями (Часть 3): Практическое применение

MetaTrader 5Эксперты | 19 января 2023, 08:42
1 899 17
Roman Poshtar
Roman Poshtar

Введение

Добрый день, уважаемые пользователи сообщества MQL5. В прошлых статьях Эксперименты с нейросетями (Часть 1): Вспоминая геометрию и Эксперименты с нейросетями (Часть 2): Хитрая оптимизация нейросети, я поделился с вами своими наблюдениями и экспериментами с нейросетями. Были проведены в основном оптимизации получившихся советников и пояснения их работы. Но мы мало затронули тему практического применения полученных результатов. Основной задачей данной статьи будет исправление столь досадного недоразумения.

Применим на практике полученные результаты, а также познакомимся с новым алгоритмом, который позволяет расширить возможности наших советников. Так сказать, собрать в одно целое всю цепочку и в итоге посмотреть на форвард тестировании что получилось. Как всегда, используем только средства MetaTrader 5 без использования стороннего программного обеспечения. Данная статья, скорее всего, будет похожа на пошаговую инструкцию. Я со своей стороны постараюсь объяснить все максимально доступно и просто.


1. Идея применения

При оптимизации двух предыдущих систем мы получали некие результаты с наилучшими показателями профит фактора или комплексного критерия и также набор весов для наших перцептронов и нейросетей. Протестировав полученные результаты, мы получили вполне сносные показатели. Основная идея данной доработки объединить все результаты оптимизации в одном советнике и заставить их работать одновременно. Согласитесь, не очень удобно держать открытыми 10 графиков с десятью советниками. К тому же это позволит посмотреть на результаты расширенно (комплексно), использовав например 10-20 параметров одновременно.


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

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

  • Рынок Forex;
  • Валютная пара EURUSD;
  • Период H1;
  • Индикаторы: 2 индикатора TEMA с периодами 1 и 24. От MA пришлось отказаться, так как по многочисленным тестам индикатор TEMA оказался лучше.
  • СтопЛосс и ТейкПрофит для соответствующих модификаций 600 и 60;
  • Режим оптимизации и тестирования «Только цены открытия» и «Максимум комплексного критерия». Очень важно использовать режим «Максимум комплексного критерия» он показал более стабильные и прибыльные результаты по сравнению с «Максимальная прибыльность»;
  • Диапазон оптимизации 3 года. С 2018.12.09 по 2021.12.09. 3 года не является, каким-то критерием. Вы можете попробовать больше или меньше самостоятельно;
  • Диапазон форвард тестирования 1 год. С 2021.12.09 по 2022.12.09;
  • Во всех форвард тестированиях использовалось 20 результатов оптимизации одновременно;
  • Оптимизация советников с перцептроном «Быстрая (генетический алгоритм)»;
  • Оптимизация советников на библиотеке DeepNeuralNetwork.mqh «Медленная (полный перебор параметров)»;
  • Начальный депозит 10000;
  • Плече 1:500.

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

 По многочисленным наблюдениям выявилось, что глубина весов 200 в советниках с перцептроном не требуется. Достаточно 20. Потому был изменен сам код перцептрона и параметры оптимизации. Теперь мы оптимизируем веса от 0 с шагом 1 до 20.

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

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

for(int i=0; i<=(ArraySize(EURUSD)/6)-1; i++){
 comm=IntegerToString(i);
 x1=(int)StringToInteger(EURUSD[i][0]);
 x2=(int)StringToInteger(EURUSD[i][1]);
 x3=(int)StringToInteger(EURUSD[i][2]);
 x4=(int)StringToInteger(EURUSD[i][3]);
 
 Param=(int)StringToInteger(EURUSD[i][4]);

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

}

 Новый код перцептрона:

1 perceptron 4 angle SL TP и 1 perceptron 4 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

1 perceptron 8 angle SL TP и 1 perceptron 8 angle

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;  
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

2 perceptronа 4 angle SL TP и 2 perceptronа 4 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

double perceptron2() 
  {
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

 Код активации входа:

1 perceptron 4 angle SL TP и 1 perceptron 4 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

1 perceptron 8 angle SL TP и 1 perceptron 8 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

2 perceptronа 4 angle SL TP и 2 perceptronа 4 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (perceptron2()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (perceptron2()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

 Настройки оптимизации:

1 perceptron 4 angle SL TP и 1 perceptron 4 angle

Настройки оптимизации 1

1 perceptron 8 angle SL TP и 1 perceptron 8 angle

Настройки оптимизации

2 perceptronа 4 angle SL TP и 2 perceptronа 4 angle

Настройки оптимизации


3.1 Советник 1 perceptron 4 angle SL TP

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

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Большое количество результатов комплексного критерия 99.99. Профит фактор на высоком уровне 4-8.

 Далее экспортируем полученный результат в Excel. Оставляем 100 первых лучших результатов, все остальное удаляем. Удаляем все колонки кроме х1, х2, х3, х4 и Param.  Сохраняем файл в CSV (разделители - запятые). Я назвал файл EURUSD для наглядности. Этот формат мы можем загрузить в код советника в качестве текстового массива.  Должно получиться так, как показано на рисунке ниже.

Результат оптимизации

Вставляем наш файл в код через меню MetaEditor.

Результат оптимизации

Получаем текстовый массив с результатами оптимизации готовый к использованию.

string EURUSD[][6]=
  {
   {"19","1","3","6","1100"},
   {"20","1","4","6","1000"},
   {"20","0","4","4","1200"},
   {"19","0","6","4","1100"},
   {"19","1","5","4","1100"},
   {"17","0","7","4","1100"},
   {"19","1","3","8","1000"},
   {"20","0","4","3","1300"},
   {"17","0","7","0","1400"}
  };

Компилируем и проводим форвард тестирование. 

Форвард тестирование

Хорошие результаты. Уверенный подъем вверх на протяжении года.


3.2 Советник 1 perceptron 4 angle

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

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, 0, 0, EAComment);
}

if ((perceptron1()>0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, 0, 0, EAComment);
}

if ((perceptron1()<0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY);
}

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Результат комплексного критерия несколько ниже, чем в предыдущем случае. Профит фактор на уровне 2-2,5.

Результат форвард тестирования:

Результат форвард тестирования

Линия баланса повторяет предыдущий результат с более глубокими просадками.


3.3 Советник 1 perceptron 8 angle SL TP

Данная модификация советника использует для выхода  СтопЛосс и ТейкПрофит. Стратегия 1 перцептрон и 8 углов наклона индикаторов TEMA.

Для этого советника необходимо подготовить Excel файл, таким образом, как показано на рисунке ниже. Тут мы оптимизируем 9 параметров х1, х2, х3,х4, y1, y2, y3, y4 и Param.

Результат оптимизации

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Результат комплексного критерия высокий. Профит фактор на уровне 2,5-3.

Результат форвард тестирования:

Результат форвард тестирования

Линия баланса не очень стабильна. Большие просадки. Но результат положительный.


3.4 Советник 1 perceptron 8 angle

СтопЛосс и ТейкПрофит не используем. Закрытие по обратному сигналу перцептрона. Стратегия 1 перцептрон и 8 углов наклона индикаторов TEMA.

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Результат комплексного критерия высокий. Профит фактор на уровне 2,5-3.

Результат форвард тестирования:

Результат форвард тестирования

Линия баланса стабильна. Хороший прирост к депозиту на протяжении года. Просадки не такие глубокие.


3.5 Советник 2 perceptron 8 angle SL TP

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

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Результат комплексного критерия на уровне 99,99. Профит фактор результатов практически одинаков 4,3.

Результат форвард тестирования:

Результат форвард тестирования

Пилообразная линия баланса. Выход в плюс на протяжении года.


3.6 Советник 2 perceptron 8 angle

Без СтопЛосс и ТейкПрофит. Стратегия 2 перцептрона, 4 угла наклона в первом и 4 угла наклона во втором которые отличаются. Закрытие по обратному сигналу перцептрона.

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Результат комплексного критерия на уровне 99,8. Профит фактор результатов в пределах 2,8-3,2.

Результат форвард тестирования:

Результат форвард тестирования

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


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

Сегодня в наших экспериментах принимают участие 4 советника на библиотеке DeepNeuralNetwork.mqh  Angle 4-4-3 SL TP и Angle 8-4-3 SL TP, в которых для закрытия будут использованы СтопЛосс и ТейкПрофит. А также Angle 4-4-3 и Angle 8-4-3 в которых сигнал для закрытия будет поступать из нейросети.  Во всех в  качестве стратегии используются углы наклона. Фигуры, представленные во второй части наших экспериментов сегодня мы не используем.

Код со СтопЛосс и ТейкПрофит:

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

Код закрытия из нейросети:

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

//CLOSE ALL++++++++++++++++++++++++++++++++++++++++++
if (yValues[2]>LL){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
}

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

Как мы помним, при оптимизации наш советник создает файл CSV с набором оптимизированных весов по пути «C:\Users\Ваше имя пользователя\AppData\Roaming\MetaQuotes\Terminal\Common\Files». В эту папку необходимо скопировать файл отчета оптимизации в формате CSV.

На график валютной пары устанавливаем советник с именем «Angle EA 4-4-3 convert».

Советник

Параметры советника для конвертации:

  • Param – параметр (величина) комплексного критерия ниже которого результаты не копируются в массив. Я использовал 80;
  • OptimizationFileName1 – файл отчета оптимизации в формате CSV;
  • OptimizationFileName2 – файл созданный советником при оптимизации в формате CSV. Содержит веса нейросети;
  • OptimizationFileName3 – файл массива для вставки в рабочий советник. Будет создан автоматически.

Наблюдать за процессом можно в журнале.

Журнал

Вставляем полученный файл в код советника «Angle EA 4-4-3 trade»:

string Result[][37]=
  {
   {"17293","0.8","-0.1","-0.2","1.0","0.9","0.6","0.4","1.0","0.6","-0.4","0.9","-0.5","0.1","-0.5","-0.5","0.9","-0.1","-0.8","0.4","0.0","-0.1","0.1","0.2","-0.4","-0.7","-0.6","-0.9","-0.8","-0.9","-0.7","-0.5","0.4","0.4","0.8","-0.6"},
   {"18030","0.6","0.2","-0.4","0.9","-1.0","-0.9","-0.9","0.4","-0.9","-0.8","0.4","0.9","0.2","-0.8","0.9","-0.1","-0.6","0.3","0.5","-0.4","0.7","0.6","-0.4","-0.1","0.4","-0.8","0.4","0.9","-0.2","0.0","0.4","-0.6","-0.4","-0.7","0.7"},
   {"13128","0.7","-0.3","0.5","-0.5","-0.5","-0.1","0.8","0.0","0.6","0.9","-0.2","0.8","1.0","0.7","-0.7","-0.2","0.5","0.5","-0.6","0.5","-0.9","-0.5","-0.5","0.5","-0.3","0.5","0.8","0.2","-0.5","-0.2","0.1","-0.1","-0.4","-0.7","0.1"},
   {"10688","0.3","0.0","0.2","-0.1","0.6","0.1","0.1","-0.2","-1.0","0.3","0.2","0.5","-0.8","0.7","0.4","-0.5","-0.4","-0.3","-0.3","-0.9","-0.2","0.0","0.1","0.9","0.3","-0.9","-0.2","-0.2","0.1","0.9","0.8","0.1","0.4","0.8","0.6"},
   {"8356","0.8","0.8","0.7","0.2","0.0","-0.4","0.5","-0.8","0.0","0.9","0.2","-0.1","1.0","0.6","0.2","-0.8","-0.1","-0.5","-0.3","0.0","0.7","-0.5","-0.3","0.0","0.9","-1.0","-0.2","-0.6","-0.7","-0.5","-0.8","0.5","-0.3","-0.1","0.8"},
   {"18542","-0.8","0.9","-0.1","0.5","-0.5","0.3","0.8","-0.4","0.7","0.9","0.4","0.0","-0.2","0.0","0.2","0.5","0.9","0.4","1.0","0.7","0.1","0.1","-0.4","0.0","0.9","0.2","0.0","-0.8","0.1","-0.5","0.1","-0.1","0.1","-0.1","0.6"},
   {"18381","0.7","-1.0","-0.8","0.8","-0.8","-0.4","0.9","0.7","1.0","0.7","0.8","0.5","0.1","-0.3","-0.7","-0.9","-0.2","-0.4","0.8","-0.8","0.0","0.8","-0.5","-0.3","0.2","-0.3","-0.1","0.5","-0.1","0.3","0.0","-0.7","-0.2","-0.3","0.8"},
   {"13795","0.2","0.9","0.4","0.4","0.1","-0.6","-0.6","-0.3","0.7","0.9","0.7","0.0","-0.2","-0.9","-0.8","-0.6","-0.1","-0.4","-1.0","0.7","-0.7","-0.3","0.0","-0.3","-1.0","0.8","-0.9","-0.9","0.1","-0.5","-0.3","-0.7","-0.2","-0.7","-0.8"},
   {"4376","0.9","0.7","-0.6","-0.9","1.0","0.8","0.1","-0.8","0.7","-0.8","0.2","0.1","-0.9","0.8","0.9","-0.4","0.8","0.3","0.0","-0.3","-0.4","0.7","-0.2","0.4","-0.8","-0.2","0.9","0.9","0.2","0.0","0.1","0.5","-0.8","-0.1","0.6"},
   {"14503","0.1","-0.4","-0.7","0.1","-0.1","0.5","-0.7","-0.2","-0.9","0.0","0.2","-0.7","0.3","0.7","-0.7","0.1","0.4","0.3","0.3","-0.5","-0.8","-0.8","-0.7","0.2","-0.7","-0.1","-0.8","0.0","-0.4","0.0","0.1","0.5","-0.3","0.5","0.8"},
   {"12887","0.6","-0.1","0.4","0.6","-0.9","-0.3","0.7","0.2","-0.6","-1.0","0.0","-0.6","0.5","0.3","0.8","0.0","-0.5","-1.0","-0.6","0.6","-0.6","-0.9","-0.3","0.6","0.2","-0.5","0.6","0.2","-0.5","0.3","0.3","-0.9","-0.7","-0.8","0.8"},
   {"16285","0.3","0.3","-0.9","-0.7","-0.1","0.7","-0.7","-0.7","-0.2","-0.5","-0.8","-1.0","-0.1","-0.4","-0.6","1.0","0.3","-0.8","-0.6","1.0","-0.1","0.7","-0.1","0.5","-0.6","0.9","-0.5","0.6","0.2","0.5","-0.4","0.3","-0.6","-0.7","0.7"},
   {"13692","0.8","-0.9","0.6","0.3","-0.2","-0.8","-0.4","0.3","-0.6","0.7","0.7","-0.8","0.5","0.1","-0.2","0.7","-0.7","-0.2","0.7","-0.5","0.9","0.7","0.6","0.8","-0.1","-1.0","-0.8","-0.5","-0.1","-0.9","-0.5","0.2","-0.4","0.8","0.2"},
   {"1184","-0.1","0.1","0.6","-0.2","-0.3","0.0","-0.7","0.1","-0.5","0.1","-0.6","0.0","-0.9","-0.8","0.1","0.5","0.3","-1.0","0.1","-0.8","-0.6","0.0","-0.4","-0.1","-0.7","-0.8","0.6","0.5","0.0","0.9","-0.5","0.2","0.7","0.3","0.9"},
   {"9946","0.4","-0.5","0.9","-1.0","-0.4","-0.7","0.9","0.0","-0.2","0.7","0.7","0.1","0.7","0.4","-0.9","0.1","-0.6","-0.5","0.9","0.8","0.2","-0.9","0.0","0.1","0.9","0.7","0.3","0.6","-0.4","0.8","-0.1","0.2","-0.2","-0.4","0.7"},
   {"6104","0.5","-0.9","-0.1","0.7","-0.7","0.0","0.4","0.3","0.8","-0.7","-0.1","0.1","-0.1","-0.5","-0.5","1.0","-0.1","-0.5","0.5","0.7","-0.8","-0.7","-0.7","0.8","-0.2","-0.5","0.2","-0.6","-0.2","-0.1","-0.4","-0.9","-0.6","-0.1","0.9"},
   {"995","0.9","0.6","0.7","0.1","-0.8","0.3","-0.2","0.3","0.9","-0.1","0.2","0.5","0.9","-0.7","-0.7","-0.7","0.2","0.2","0.4","-0.7","-0.4","-0.2","0.0","-0.2","0.0","0.6","-0.3","-0.6","-0.9","0.8","-0.6","-0.2","0.2","0.5","0.9"},
   {"6922","0.5","0.9","0.1","-0.8","-1.0","-0.1","0.9","0.9","-0.2","0.8","0.8","0.5","-0.3","0.8","-0.2","0.9","-0.6","0.0","0.7","-0.9","0.4","0.7","0.6","-0.1","-0.4","0.5","-0.6","-0.2","-0.5","-0.9","-0.7","-0.6","0.5","-0.6","0.7"},
   {"3676","-0.9","-0.8","-0.5","0.8","0.4","-0.8","-0.4","0.6","0.9","0.9","-0.7","0.6","0.8","-0.9","0.3","0.7","-0.7","0.5","0.8","0.9","0.1","0.5","0.8","0.1","0.9","0.9","0.4","0.3","-0.1","0.4","-0.4","0.4","-0.3","-0.6","0.9"},
   {"6245","-0.1","-0.4","-0.6","0.7","0.6","-0.6","-0.2","0.2","0.0","-0.4","0.0","0.9","-0.3","0.5","-0.2","0.7","0.4","1.0","0.7","-0.1","-0.3","-0.9","-0.5","0.9","0.8","-0.1","-0.5","-1.0","0.3","0.9","-0.4","-0.2","-0.4","-0.3","0.9"},
   {"1039","-0.4","-0.3","-0.6","-0.7","-0.6","0.5","-0.2","-0.9","0.7","0.9","-0.2","-0.6","-0.2","-0.3","0.6","0.1","-0.9","-0.8","0.9","0.3","0.6","0.8","-0.8","0.8","0.6","0.1","-0.2","-0.7","0.6","-0.2","-0.6","0.4","-0.1","-0.2","0.1"},
   {"6615","-0.4","-0.1","-0.7","0.5","-0.9","0.4","-0.9","0.4","-0.4","-0.1","0.7","-0.4","0.4","0.4","-0.8","-0.2","-0.6","-0.1","-0.5","-0.7","0.6","0.0","1.0","0.9","-0.3","0.8","0.8","-0.1","-0.2","0.9","-0.2","0.9","-0.8","-0.6","0.5"},
   {"410","-0.3","0.2","-0.2","-0.2","0.2","-0.5","0.8","0.3","-0.9","-0.9","-0.4","0.3","-0.8","-0.8","0.0","0.9","-0.2","0.0","-0.2","-0.4","-0.1","0.1","-0.4","0.7","1.0","0.1","0.5","0.3","0.1","0.7","0.4","0.0","-0.2","-1.0","-0.1"},
   {"15027","-0.3","-0.4","-0.6","0.3","-0.5","-0.6","0.9","0.5","-0.2","0.0","-0.7","0.7","0.1","0.5","-0.4","-0.4","0.4","0.7","-0.1","0.9","-0.1","0.6","0.5","-0.3","0.6","0.8","0.4","0.1","0.9","-0.5","0.7","0.6","-0.8","-0.1","0.0"},
   {"14157","0.6","-0.7","0.7","0.5","0.8","-0.1","0.9","0.8","0.8","0.7","0.6","-0.3","-0.7","-0.5","-0.2","0.2","0.0","-0.8","0.6","0.9","-0.4","0.1","0.1","0.9","0.7","-0.8","-0.6","-0.5","-0.7","0.1","-0.3","0.9","0.5","0.8","-0.7"},
   {"11367","0.2","-1.0","-0.4","-0.4","-0.3","-0.2","0.2","-0.1","-0.4","0.7","-1.0","-0.5","-0.9","-0.7","-0.4","-0.8","-0.4","0.0","0.2","0.7","-0.2","0.4","0.1","0.0","-0.1","-0.9","0.2","-0.5","-0.6","-0.6","-0.7","-0.2","-0.3","-0.1","0.9"},
   {"3892","-0.7","-0.3","0.8","0.2","-0.3","0.4","0.0","0.3","-0.2","0.7","0.6","0.6","0.7","-0.4","-0.7","0.4","-0.3","-0.8","-0.2","0.0","0.9","0.9","0.3","0.0","0.7","0.1","-0.1","0.1","-0.8","-0.4","-0.5","0.9","-0.7","-0.6","0.2"}
  };


4.1 Советник Angle 4-4-3 SL TP

Советник использует для выхода  СтопЛосс и ТейкПрофит. Стратегия 4 угла наклона индикаторов TEMA.

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Как видим, нашлось немало хороших результатов. Профит-фактор в пределах 1.6-5. Значений комплексного критерия больше 80 – 27.

Результат форвард-тестирования:

Результат форвард тестирования

К сожалению, советник провалил форвард-тестирование. Результаты отрицательные и нестабильны.


4.2 Советник Angle 4-4-3

Советник использует для выхода нейросеть. Стратегия 4 угла наклона индикаторов TEMA.

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Как видим, нашлось меньше хороших результатов по комплексному критерию больше 80, всего 6. Профит фактор в пределах 1.6-1.9.

Результат форвард тестирования:

Результат форвард тестирования

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


4.3 Советник Angle 8-4-3 SL TP

Советник использует для выхода СтопЛосс и ТейкПрофит. Стратегия 8 углов наклона индикаторов TEMA.

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Профит фактор результатов ниже по сравнению с нейросетью  4-4-3.  Результатов комплексного критерия больше 80 – 13.

Результат форвард-тестирования:

Результат форвард тестирования

Ожидаемо результат похож на предыдущий с использованием СтопЛосс и ТейкПрофит. Форвард тестирование провалено.


4.4 Советник Angle 8-4-3

Советник использует для выхода нейросеть. Стратегия 8 углов наклона индикаторов TEMA.

Результат оптимизации:

Результат оптимизации


Результат оптимизации

Результатов комплексного критерия больше 80  всего 3. Профит фактор на низком уровне по сравнению с предыдущими результатами.

Результат форвард тестирования:

Результат форвард тестирования

Форвард результат не удовлетворительный. Плавная потеря депозита.


Заключение

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

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

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

На будущее хотелось бы отметить  2 задачи. Проверить лучшие получившиеся результаты на других валютных парах и других временных интервалах.

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

По всем вопросам вы можете обратиться на форуме или в личные сообщения. Я всегда буду рад Вам помочь.



Прикрепленные файлы |
EA.zip (1061.76 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (17)
Roman Poshtar
Roman Poshtar | 10 февр. 2023 в 05:37
Aleksey Vyazmikin #:

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

Сейчас не могу. Проведите оптимизацию сами.

Aleksey Vyazmikin
Aleksey Vyazmikin | 10 февр. 2023 в 06:00
Aliaksandr Hryshyn #:
TP =60
SL= 600
Это уже не серьезно 

Да, видел. Но, всё же, показался интересным взгляд автора на предикторы...

Aleksey Vyazmikin
Aleksey Vyazmikin | 10 февр. 2023 в 06:01
Roman Poshtar #:

Сейчас не могу. Проведите оптимизацию сами.

Ну, может позже - через неделю или месяц?

Roman Poshtar
Roman Poshtar | 10 февр. 2023 в 06:35
Aleksey Vyazmikin #:

Ну, может позже - через неделю или месяц?

Возможно

Ivan Butko
Ivan Butko | 10 февр. 2023 в 17:20
Тестировал за последний год по паре EURUSD многие версии нейросетей и хочу сказать, что сам по себе год хороший. Почему то многие нейросети после оптимизации на 2021-ом показывают рост на 2022-ом. 

Но, если обучить на 2020-м и протестировать на 2021-м - с точностью наоборот сливают. 

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

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

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

Всё вышеописанное - имхо. А автору спасибо за статью, про перцептрон часть интересна, поглубже окунусь в неё
Популяционные алгоритмы оптимизации: Оптимизация инвазивных сорняков (Invasive Weed Optimization - IWO) Популяционные алгоритмы оптимизации: Оптимизация инвазивных сорняков (Invasive Weed Optimization - IWO)
Удивительная способность сорняков выживать в самых разнообразных условиях послужило идеей создания мощного алгоритма оптимизации. IWO — один из лучших среди рассмотренных ранее.
Как работать с линиями средствами MQL5 Как работать с линиями средствами MQL5
В этой статье мы поговорим о том, как работать с наиболее важными линиями, такими как линии тренда, поддержка и сопротивление, используя средства языка MQL5.
Бегущая строка котировок: улучшенная версия Бегущая строка котировок: улучшенная версия
Как вам идея оживить базовую версию панели? Первое, что мы сделаем — реализуем возможность добавить на панель изображение, например, логотип актива или любой другой рисунок, чтобы пользователь смог легко и быстро определить, что это за торговый инструмент.
Бегущая строка котировок: базовая версия Бегущая строка котировок: базовая версия
Здесь я покажу, как создать в терминале бегущую строку, которая обычно используется для отображения котировок на бирже. Создавать такую строку мы будем только при помощи MQL5, не используя никакое другое внешнее программирование.