
Эксперименты с нейросетями (Часть 3): Практическое применение
Введение
Добрый день, уважаемые пользователи сообщества 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 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 задачи. Проверить лучшие получившиеся результаты на других валютных парах и других временных интервалах.
Сделок не так много как хотелось, но никто не запрещает использовать другие валютные пары и создать некий портфель на основе данных систем. Что в свою очередь сопряжено с трудозатратами на оптимизацию. Но кто не работает, тот не ест.
По всем вопросам вы можете обратиться на форуме или в личные сообщения. Я всегда буду рад Вам помочь.





- Бесплатные приложения для трейдинга
- Форексный VPS бесплатно на 24 часа
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Сейчас уже февраль 2023 - более двух месяцев новой истории относительно тестов на картинках баланса. Можете показать результаты советников с теми же настройками на новых данных? Ну или более ранних, не участвовавших в оптимизации.
Сейчас не могу. Проведите оптимизацию сами.
TP =60
Да, видел. Но, всё же, показался интересным взгляд автора на предикторы...
Сейчас не могу. Проведите оптимизацию сами.
Ну, может позже - через неделю или месяц?
Ну, может позже - через неделю или месяц?
Возможно
Но, если обучить на 2020-м и протестировать на 2021-м - с точностью наоборот сливают.
Более того, пока я изучал, что такое нейросети, понял, для чего нужна функция активации - для обратного распространения ошибки, которая и является обучением. То есть, подгонка весов при оптимизации на корню убивает смысл во всяких функциях активации, а следовательно - в классических нейросетях. Что с функцией активации, что с простейшим перцептроном Решетова - результат почти одинаков.
Даже больше скажу - простейшие перцептроны даже лучше показывают картину, а всякие нагромождения в виде библиотек попросту излишне грузят терминал.
Поэтому, лучше проверять на нескольких годах подряд и нескольких валютных парах. Да, трудозатратно, но результат будет объективней.
Всё вышеописанное - имхо. А автору спасибо за статью, про перцептрон часть интересна, поглубже окунусь в неё