После победы советника Александра Топчило на чемпионате по автотрейдингу
Automated Trading Championship 2007 эксперты на основе нейросетей стали особенно популярны.
Интервью с чемпионом вы можете посмотреть по ссылке:
championship.mql4.com/2007/ru/news/302
Материалов по созданию экспертов на основе нейросетей, достаточно в сети и на форуме мкл. Для более углубленного изучения нейросетей можете использовать следующие источники:
ПРЕДСКАЗАНИЕ ФИНАНСОВЫХ ВРЕМЕННЫХ РЯДОВ:
www.mql5.com/ru/articles/1506
ПРОГНОЗИРОВАНИЕ ЦЕН С ПОМОЩЬЮ НЕЙРОННЫХ СЕТЕЙ:
www.mql5.com/ru/articles/1482
РЕЦЕПТЫ НЕЙРОСЕТЕЙ:
www.mql5.com/ru/articles/1562
КАК НАЙТИ ПРИБЫЛЬНУЮ ТОРГОВУЮ СТРАТЕГИЮ:
www.mql5.com/ru/articles/1447
Код эксперта «ArtificialIntelligence_Right»:
www.mql5.com/ru/code/7650
Код эксперта «ArtificialIntelligence»:
www.mql5.com/ru/code/10289
Для начала немного теории:
Что такое нейронная сеть или Perceptron? Это алгоритм, использующий уравнение линейного неравенства (линейного фильтра), с помощью которого можно причислить исследуемый объект к тому или иному классу или, наоборот, исключить его из этого самого класса объектов. Само неравенство выглядит так:
w1 * a1 + w2 * a2 +… wn * an > d,
где:
wi — весовой коэффициент с индексом i,
ai — численное значение признака с индексом i исследуемого объекта,
d — пороговое значение, чаще всего равное 0.
Если левая часть неравенства окажется выше порогового значения, то объект принадлежит к определенному классу, если ниже, то не принадлежит. В случае, когда классификация объектов подразумевает разделение всего на два класса, вполне достаточно однослойной нейросети.
Используемая ТС:
Наш простейший перцептрон будет анализировать открытие и закрытие свечей на определенном участке истории и на основе этого будет покупать или продавать с фиксированными стопами.
Код перцептрона будет выглядеть так:
double perceptron()
{
double w1 = x1 - 100;
double w2 = x2 - 100;
double w3 = x3 - 100;
double w4 = x4 - 100;
double a1 = Open[p] - Close[0];
double a2 = Open[p] - Open[p*2];
double a3 = Open[p*2] - Open[p * 3];
double a4 = Open[p*3] - Open[p * 4];
return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}
Если функция вернет значение меньше нуля покупаем, больше продаем.
if(OrdersTotal()<1 && tm!=Time[0])
{
if(perceptron()<0) PutOrder(0,Ask);
if(perceptron()>0) PutOrder(1,Bid);
tm=Time[0];
}
И вот готов весь код эксперта:
//+------------------------------------------------------------------+
//| Perceptron.mq4 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.00"
#property strict
//---- input parameters
extern double tp = 50;
extern double sl = 50;
extern int p=10;
extern int x1 = 100;
extern int x2 = 100;
extern int x3 = 100;
extern int x4 = 100;
extern double lot=0.1;
datetime tm=0;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
{
int r=0;
color clr=Green;
double s=0,t=0;
if(type==1 || type==3 || type==5)
{
clr=Red;
if(sl>0) s=NormalizeDouble(price+sl*Point,Digits);
if(tp>0) t=NormalizeDouble(price-tp*Point,Digits);
}
if(type==0 || type==2 || type==4)
{
clr=Blue;
if(sl>0) s=NormalizeDouble(price-sl*Point,Digits);
if(tp>0) t=NormalizeDouble(price+tp*Point,Digits);
}
r=OrderSend(NULL,type,lot,NormalizeDouble(price,Digits),33,s,t,"",0,clr);
return;
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
double perceptron()
{
double w1 = x1 - 100;
double w2 = x2 - 100;
double w3 = x3 - 100;
double w4 = x4 - 100;
double a1 = Open[p] - Close[0];
double a2 = Open[p] - Open[p*2];
double a3 = Open[p*2] - Open[p * 3];
double a4 = Open[p*3] - Open[p * 4];
return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
if(OrdersTotal()<1 && tm!=Time[0])
{
if(perceptron()<0) PutOrder(0,Ask);
if(perceptron()>0) PutOrder(1,Bid);
tm=Time[0];
}
}
//+------------------------------------------------------------------+
Поставим наш код на оптимизацию на участке 11.01.2000-11.01.2015 на дневках по ценам открытия.
Результаты оптимизации на участке следующие:
Форвард тест 11.01.2015-23.08.2016:
По результатам тестирования и оптимизации можно сделать вывод, что даже в таком простейшем виде наш однослойный перцептрон представляет определенный интерес.
Скачать советник:
www.opentraders.ru/downloads/1293/
Комментарии (10)
Формула была бы похожа на формулу взвешенного скользящего среднего, если было бы деление на сумму коэффициентов.
Наверное, мне ближе формула, которая бы показывала значимость события от 0 до 1 (или от 0 до 100%). Хотя в этой тоже что-то есть
Раньше мне казалось, что нейросети, это что-то заумное — типо логически мыслящего робота, способного самообучаться Неужели это всего лишь математическая формула?
Андрей, ты разбил мои иллюзии
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Здесь только самый простейший вариант.
35 AM2 Автор Сообщений: 16303 - Андрей
Вот даже подумываю посетить.
27 Oxy Сообщений: 3430 - ..ιllιlι.lι.ιllι.ιlι..
Настройки использовал 1:1 как на скрине.
24 ShamanHand Сообщений: 1092 - Наношу добро, причиняю пользу.
35 AM2 Автор Сообщений: 16303 - Андрей
10 Nadejda-stav Сообщений: 157
10 Nadejda-stav Сообщений: 157
45 Bishop Сообщений: 5803 - АЛЬФАХАМЕЦ-Машковод
10 Nadejda-stav Сообщений: 157
10 Nadejda-stav Сообщений: 157
Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий