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





- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Спасибо за быстрый ответ.
Я вижу, что делал свои предположения на неправильной вкладке; я использовал вкладку ордеров, когда должен был использовать вкладку сделок для анализа. Используя сделки и сортировку по убыванию в колонке прибыли, я сразу заметил сделку от 7 июля, которая принесла убыток в 1395 долларов.Я должен списать эту свою ошибку на неопытность. Я начал использовать MQ5 6 месяцев назад и только что познакомился с деталями торговли от ваших советников и попытался использовать свой опыт MQ4 в качестве основы.
Спасибо за помощь, я только что узнал много нового.
Cape CVoddah
D
Спасибо за быстрый ответ.
Я вижу, что делал свои предположения на неправильной вкладке; я использовал вкладку ордеров, когда должен был использовать вкладку сделок для анализа. Используя сделки и сортировку по убыванию в колонке прибыли, я сразу заметил сделку от 7 июля, которая принесла убыток в 1395 долларов.Я должен списать эту свою ошибку на неопытность. Я начал использовать MQ5 6 месяцев назад и только что познакомился с деталями торговли от ваших советников и попытался использовать свой опыт MQ4 в качестве основы.
Спасибо за помощь, я только что узнал много нового.
Cape CVoddah
D
Ничего страшного. Мы все учимся. Если вам интересно, я набираю команду для разработки нейро. Пришлите мне личное сообщение. Участие оплачивается.
Привет, Роман,
Прежде всего, позвольте поблагодарить вас за этот удивительный вклад, очень интересный, вы гений. Должен сказать, что мне понравились варианты с 2 перцептронами и 4 углами, поэтому я добавил 3-й перцептрон для параметра, который я нашел довольно ценным в моей ручной торговле: RSI на разных таймфреймах.
По сути, мой 3-й перцептрон ищет зависимость наклона между 14 rsi на текущем таймфрейме и тем же самым на более высоком уровне, в моем случае 4h и Daily соответственно, и результаты показывают некоторые перспективы, особенно для фунта.
Набор данных >1 года обучения, 2 года тестирования.
Для GBPUSD :
Оригинальный 2 перцептрон 4 угла, одна модель:
3-й перцептрон ищет наклон RSI на разных таймфреймах:
Для GBPJPY:
Оригинальный 2 перцептрон 4 угла, одиночная модель:
3-й перцептрон ищет наклон RSI на разных таймфреймах:
Надеюсь и дальше делиться другими находками.
С уважением!
Привет, Роман,
Прежде всего, позвольте поблагодарить вас за этот удивительный вклад, очень интересный, вы гений. Должен сказать, что мне понравились 2 перцептрона с 4 углами, поэтому я добавил 3-й перцептрон для параметра, который я нашел довольно ценным в моей ручной торговле: RSI на разных таймфреймах.
По сути, мой 3-й перцептрон ищет зависимость наклона между 14 rsi на текущем таймфрейме и тем же самым на более высоком уровне, в моем случае 4h и Daily соответственно, и результаты показывают некоторые перспективы, особенно для фунта.
Набор данных >1 года обучения, 2 года тестирования.
Для GBPUSD :
Оригинальный 2 перцептрон 4 угла, одна модель:
3-й перцептрон ищет наклон RSI на разных таймфреймах:
Для GBPJPY:
Оригинальные 2 перцептрона 4 угла, одна модель:
3-й перцептрон ищет наклон RSI на разных таймфреймах:
Надеюсь, что и дальше буду делиться другими находками.
С уважением!
Привет! Спасибо за ваш отзыв. Я рад, что смог помочь.
Роман, Эрик:
Вот некоторые результаты моего тестирования с использованием исходных параметров Романа, например, H1 2019 12/9-2021 12/9 и форвард-тест 2021 12/09-2022 12/09 для 1 перцептрона 4 угла tpsl
Оригинал $2758. Затем я вручную попытался оптимизировать tpsl и в итоге нашел tp=150 & sl=550, что дало $7915. Я попробовал переменные лоты и получил идентичные результаты. Я также попробовал оптимизацию GA для TPSL вокруг оптимизированных вручную значений. Используя лучшие оптимизированные значения TP=150 SL=524, что дало очень хорошую оптимизационную прибыль в $8973, форвардный тест обанкротился!Эти результаты, похоже, указывают на то, что для получения оптимальной прибыли, TP и SL также должны быть включены в оптимизационные прогоны GA. Я буду переключать свое тестирование также на H4, так как я считаю, что более высокий таймфрейм "выравнивает" некоторые из разворотов, приносящих убытки на более низком таймфрейме.
Эрик: интересная идея по поводу использования более высокого таймфрейма RSI, вы тестировали таймфреймы H6, H8 или H12? И мне интересно узнать, использовали ли вы MQ iRSI для получения результатов или один из MTF RSI с интерполяцией периодов?
Вот вам совет:
Используйте директивы компилятора #define и #ifdef, и вы сможете избавиться от опенверсий и сэкономить время на воспроизведении своих усилий.
//#define OPTIMIZING //COMMENT OUT FOR PRODUCTION TRADING
#ifdef OPTIMIZING
input int x1 = 1;
input int x2 = 1;
input int x3 = 1;
input int x4 = 1;
input int z1 = 1;
input int z2 = 1;
input intz3 = 1;
input int z4 = 1;
input int Param = 1000;
#else
int x1 = 1, x2 = 1,x3 = 1, x4 = 1;//AnglePerceptron4
int z1 = 1, z2 = 1,z3 = 1, z4 = 1; //RsiPerceptron4
int Param = 1000;
#endif
Вам придется снова использовать эту конструкцию в функции OnTick, чтобы закомментировать цикл for.
Здоровья вам обоим