Здравствуйте, гость ( Вход | Регистрация )
| leonid553 |
23.3.2007, 11:29
Сообщение
#1
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) |
Yury V. Reshetov
Нейронная сеть Что такое нейронная сеть или Perceptron? Это алгоритм использующий уравнение линейного неравенства (линейного фильтра), с помощью которого можно причислить исследуемый объект к тому или иному классу или же наоборот исключить его из этого самого класса объектов. Само неравенство выглядит так: w1 * a1 + w2 * a2 + ... wn * an > d где: 1. wi - весовой коэффициент с индексом i; 2. ai - численное значение признака с индексом i исследуемого объекта; 3. d - пороговое значение, чаще всего равное 0. Дело в том, что геометрически плоскость описывается линейным уравнением. Например, в трехмерном пространстве относительно координат X, Y и Z уравнение плоскости имеет вид: A * X + B * Y + C * Z + D = 0 Координаты всех точек, расположенных по одну сторону от плоскости, в этом самом пространстве, удовлетворяют неравенству: A * X + B * Y + C * Z + D > 0 А координаты всех точек лежащих по другую сторону от плоскости, удовлетворяют неравенству: A * X + B * Y + C * Z + D < 0 Таким образом, если нам известно уравнение некой плоскости и координаты любых точек, то мы можем разделить множество всех точек пространства на два множества точек, разделяемых этой самой плоскостью. ПОСТАНОВКА ЗАДАЧИ Если мы разделим объекты на два класса: открываемые длинные позиции и короткие позиции, а в качестве признаков возьмем значения индикаторов или осцилляторов технического анализа, то остается лишь выяснить уравнение плоскости и попытаться с ее помощью произвести идентификацию. Постановка задачи ясна. Множества точек пересекаются в пространстве и провести четкую разделительную черту между ними невозможно. Единственным и приемлемым решением здесь является линия, которая будет отделять оба множества точек таким образом, чтобы с ее помощью большинство красных объектов оказалось по одну сторону, а синих по другую. На сей раз, мы имеем дело с задачей оптимизации, то есть поиском уравнения разделяющей плоскости или линии, способной максимально разделить два класса объектов друг от друга, но с вероятностью того, что часть точек, принадлежащих одному классу, будет ошибочно идентифицировано, как принадлежащих к классу другому. Попробуем теперь определиться с постановкой задачи, которую мы собираемся решить. Элементарно, что нужно знать трейдеру для прибыльной торговли - это направление движения котировок. То есть если котировки пойдут вверх, то следует открыть длинную позицию. Если вниз, то необходимо открывать позицию короткую. Следовательно, два класса объектов у нас уже есть, а именно, направление движения котировок. Для того, чтобы принять решение, следуя техническому анализу, трейдеры прибегают к исследованию так называемых технических индикаторов или осцилляторов. Мы также будем исследовать осциллятор. Поскольку технические осцилляторы - это гистограммы, значения которых отклоняются от горизонтальной линии, то соответственно и нейронная сеть нам понадобится с линейным фильтром. В качестве признаков объекта, будем брать паттерны, то есть значения осциллятора в четырех точках, взятые с шагом в семь периодов вглубь истории, начиная от текущего момента. Эскизы прикрепленных изображений |
![]() ![]() |
| leonid553 |
23.3.2007, 11:43
Сообщение
#2
|
![]() Группа: Активный участник Сообщений: 2 002 Регистрация: 14.4.2006 Из: г.Самара Пользователь №: 28 Спасибо сказали: 11 раз(а) |
На вышеприведенном рисунке значения осциллятора обведены кружочками. Присвоим их идентификаторам a1, a2, a3 и a4 и будем подставлять в уравнение разделительной плоскости и сравнивать полученное значение с нулем, чтобы узнать, с какой стороны будет находиться паттерн. Осталось только получить само уравнение плоскости, которое будет разделять паттерны, предшествующие движению цены вверх, от паттернов, предшествующих движению цены вниз. Для этой цели будем использовать встроенный в торговый терминал MetaTrader4 генетический алгоритм, предназначенный для ускорения процессов оптимизации. Проще говоря, мы будем подбирать значения весовых коэффициентов линейного фильтра таким образом, чтобы в результате получить уравнение разделительной линии для максимального значения баланса оптимизацией стратегии на исторических данных. Для этой цели нам понадобится, как минимум, формулировка торговой стратегии, с помощью которой можно будет реализовать алгоритм и переложить его в код советника для MetaTrader4. Теоретически торговая система должна предусматривать сигналы, как для входа в рынок, так и для выхода из него. Впрочем, выходы по сигналам не являются обязательными и их можно исключить с помощью: Расстановки стоп-ордеров - takeprofit и stoploss; Разворотом позиции в противоположном направлении при получении сигнала о изменении направления тенденции рынка. Чтобы не усложнять торговую систему, мы будем использовать выходы по защитным стопам - stoploss и по сигналам разворотов. В этом случае нейросеть будет выдавать на выходе только два сигнала по значениям признаков объектов, а именно: Котировки вероятнее всего будут двигаться в сторону повышения; Котировки вероятнее всего будут двигаться в сторону понижения. Таким образом упрощается задача идентификации объектов для нейронной сети путем разделения их всего на два класса. Оптимизацию торговой системы также можно упростить, исключив из управления ордерами фиксацию прибылей по takeprofit, то есть избавить ее от подбора еще одного входного параметра. В этом случае достаточно воспользоваться трейлинг-стопами, то есть постепенными подтягиваниями stoploss в прибыльную сторону до тех пор, пока нейросеть не даст противоположный сигнал или пока она не ошибется. Любая ошибка нейросети приведет к срабатыванию защитного стопа. При этом сама система управления ордерами усложняется. Быстрый разворот позиции в обратном направлении лучше всего выполнить через встречный ордер с удвоенным количеством лотов и последующим закрытием встречной позиции. Этот маневр позволяет совершить все операции по развороту сразу же, как только будет получен сигнал от нейросети. Чтобы сократить количество ложных срабатываний от сигналов нейросети, их считывание и принятие решений будем производить только по сформировавшимся барам и по ценам открытия этих самых баров. Решение задачи Ниже приведен исходный код советника, реализующего данную торговую стратегию: //+------------------------------------------------------------------+ //| ArtificialIntelligence.mq4 | //| Copyright й 2006, Yury V. Reshetov | //| http://reshetov.xnet.uz/ | //+------------------------------------------------------------------+ #property copyright "Copyright й 2006, Yury V. Reshetov ICQ:282715499 http://reshetov.xnet.uz/" #property link "http://reshetov.xnet.uz/" //---- input parameters extern int x1 = 120; extern int x2 = 172; extern int x3 = 39; extern int x4 = 172; // StopLoss level extern double sl = 50; extern double lots = 0.1; extern int MagicNumber = 888; static int prevtime = 0; static int spread = 3; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { if(Time[0] == prevtime) return(0); prevtime = Time[0]; //---- if(IsTradeAllowed()) { spread = MarketInfo(Symbol(), MODE_SPREAD); } else { prevtime = Time[1]; return(0); } int ticket = -1; // check for opened position int total = OrdersTotal(); for(int i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); // check for symbol & magic number if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber) { int prevticket = OrderTicket(); // long position is opened if(OrderType() == OP_BUY) { // check profit if(Bid > (OrderStopLoss() + (sl * 2 + spread) * Point)) { if(perceptron() < 0) { // reverse ticket = OrderSend(Symbol(), OP_SELL, lots * 2, Bid, 3, Ask + sl * Point, 0, "AI", MagicNumber, 0, Red); Sleep(30000); if(ticket < 0) { prevtime = Time[1]; } else { OrderCloseBy(ticket, prevticket, Blue); } } else { // trailing stop if(!OrderModify(OrderTicket(), OrderOpenPrice(), Bid - sl * Point, 0, 0, Blue)) { Sleep(30000); prevtime = Time[1]; } } } // short position is opened } else { // check profit if(Ask < (OrderStopLoss() - (sl * 2 + spread) * Point)) { if(perceptron() > 0) { // reverse ticket = OrderSend(Symbol(), OP_BUY, lots * 2, Ask, 3, Bid - sl * Point, 0, "AI", MagicNumber, 0, Blue); Sleep(30000); if(ticket < 0) { prevtime = Time[1]; } else { OrderCloseBy(ticket, prevticket, Blue); } } else { // trailing stop if(!OrderModify(OrderTicket(), OrderOpenPrice(), Ask + sl * Point, 0, 0, Blue)) { Sleep(30000); prevtime = Time[1]; } } } } // exit return(0); } } // check for long or short position possibility if(perceptron() > 0) { //long ticket = OrderSend(Symbol(), OP_BUY, lots, Ask, 3, Bid - sl * Point, 0, "AI", MagicNumber, 0, Blue); if(ticket < 0) { Sleep(30000); prevtime = Time[1]; } } else { // short ticket = OrderSend(Symbol(), OP_SELL, lots, Bid, 3, Ask + sl * Point, 0, "AI", MagicNumber, 0, Red); if(ticket < 0) { Sleep(30000); prevtime = Time[1]; } } //--- exit return(0); } //+------------------------------------------------------------------+ //| The PERCEPRRON - a perceiving and recognizing function | //+------------------------------------------------------------------+ double perceptron() { double w1 = x1 - 100.0; double w2 = x2 - 100.0; double w3 = x3 - 100.0; double w4 = x4 - 100.0; double a1 = iAC(Symbol(), 0, 0); double a2 = iAC(Symbol(), 0, 7); double a3 = iAC(Symbol(), 0, 14); double a4 = iAC(Symbol(), 0, 21); return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); } //+------------------------------------------------------------------+} Осталось только подобрать весовые коэффициенты линейного уравнения разделительной плоскости для нейросети. klot писал: Спасибо! Всё досупно и правильно написано. Я тут немного модернизировал Вашего советника, - попробовал сделать "многослойную сеть" из 4-х перцептронов.У каждого свой состав входов и каждый обучался отдельно на максимальную прибыль. Потом, 5-й обобщал результаты (обучался на минимизацию просадки) предыдущих 4-х. Получилось не плохо, много сделок и просадка не большая. А вообще, мне нравиться, эту тему я давно изучаю. Правда зашел через "парадный вход" начал с самых истоков. Если есть желание посотрудничать обсуждение идёт тут: http://www.fxexpert.ru/forum/index.php?showtopic=656 Yury V. Reshetov Я тоже попробовал 5-ти слойку. Первые 4 имеют по 5 входов, на каждый из которого поступают нормированные значения с отдельно взятого индикатора (на каждый слой свой индикатор). 5-й слой 4-х входовый и также обобщающий. Результаты весьма неплохие получаются. Самое главное, что вне репрезентативной выборки ведет себя очень стабильно по сравнению с однослойкой. Удобно тем, что каждый слой можно обучать по отдельности. Осталось только полностью автоматизировать весь процесс обучения на истории. Лучший вариант - это взять сразу 4 компьютера и распараллелить процессы обучения. Потом собрать результаты с 4 слоев воедино и обучить последний слой. |
leonid553 Perceptron 23.3.2007, 11:29
leonid553 GBPJPY, H1
Тест за янв-февр-март после оптимизации... 23.3.2007, 12:03
leonid553 to NoName:
Твоя последняя версия "ST+ENV... 23.3.2007, 15:05
NoName
А я так и не смог от неё ничего путнего получить... 23.3.2007, 21:09
leonid553 "А я так и не смог от неё ничего путнего полу... 24.3.2007, 19:46
NoName
То что я состряпал - это не для сети делалось.
... 24.3.2007, 21:47
leonid553 Вот такая ещё идея .
ПО вышеприведенному советнику... 25.3.2007, 12:23
NoName Я ведь тебе предлагал уже это по аське! Можно... 25.3.2007, 12:57
leonid553 Либо подбирать индикаторы , средняя линия которых ... 25.3.2007, 13:01
leonid553 Понятно теперь стало - почему в реале советник с и... 25.3.2007, 14:04
leonid553 А вот результат оптимизации от пред. поста
Качеств... 25.3.2007, 14:52
leonid553 Не всё, однако, так хорошо!
Результат был полу... 26.3.2007, 15:40
NoName
А нельзя ли сдесь привести код функции Perceptro... 26.3.2007, 16:55
leonid553 вот так сделал для текущей buy-позиции:
int ticke... 26.3.2007, 18:18
leonid553 Похоже, я тут вообще не в кон задал
if(perceptron... 26.3.2007, 18:35
NoName
Конечно не в кон :) Я почему и попросил функцию ... 26.3.2007, 19:35
NoName Вот, модернизировал для наглядности ;)
Вверху с... 26.3.2007, 20:05
leonid553 Благодарю, Андрей.
Вставил этот кусочек кода.
чтоб... 27.3.2007, 9:49
leonid553 А Проблема вот в чем:
----------------------------... 27.3.2007, 10:08
NoName
// check for opened position
int total = Order... 27.3.2007, 10:57
leonid553 бдагодарю.
Сейчас разберусь!
Только что пришла... 27.3.2007, 11:16
NoName
ИМХО
Оптимизация уже сама по себе подразумевает ... 27.3.2007, 11:19
NoName
Я думаю что нет никакой разницы в значении весов... 27.3.2007, 11:40
leonid553 Вставил вот этот кусочек!
double a1 = iStoch... 27.3.2007, 12:49
NoName Всё правильно. Шкала и не изменится, т.к вызываетс... 27.3.2007, 12:58
leonid553 В соотв. с вышеизложенными резонами подготовил пок... 28.3.2007, 8:33
NoName
Вот это уже хороший результат! И данный сове... 28.3.2007, 9:41
leonid553 Да, пожалуй...
Но хотелось бы уж сразу многослойку... 28.3.2007, 10:35
leonid553 to NoName:
Что-то никак не подберу параметры с инд... 28.3.2007, 17:27
NoName
По ходу всё правильно.
Попробуй сделать так:
d... 28.3.2007, 19:59
leonid553 Благодарю. 28.3.2007, 20:06
leonid553 При реализации очередной идеи обнаружилось очередн... 29.3.2007, 10:01
leonid553 Причина этого несоответствия , возможно, заложена ... 29.3.2007, 10:17
leonid553 Да, действительно, - для каждого индикатора нужно ... 29.3.2007, 11:21
NoName
Честно говоря, мне тоже не понятен этот ход. 29.3.2007, 11:39
leonid553 Разберемся, надеюсь!
Главная всё-же, проблема ... 29.3.2007, 12:51
NoName Ну эту проблему можно решить с помощью трейлинга о... 29.3.2007, 15:28
leonid553 А я пытался экспериментировать с (sl * Point) в тр... 29.3.2007, 15:42
NoName
Не обязательно. В последних версиях своих советн... 29.3.2007, 16:26
leonid553 Сделал.
extern int ExpertID =1111; ... 29.3.2007, 18:05
NoName Конечно влияет!
Пришли советник, попробую попр... 29.3.2007, 18:31
leonid553 вот он: 29.3.2007, 18:54
leonid553 Поработал пока с версией советника с инд. Фишера .... 30.3.2007, 8:26
NoName Да, действительно, просадка около 2% - отличный ре... 30.3.2007, 8:50
leonid553 Благодарю! Оч. кстати!
Решил выяснить - по... 30.3.2007, 9:09
leonid553 Руки до всего не доходят! - времени не хватает... 30.3.2007, 19:35
leonid553 Вроде так(значения х1-х4 еще не подставил):
------... 30.3.2007, 20:16
NoName Проблема в последнем результирующем слое.
p_1, p_... 30.3.2007, 20:50
leonid553 ДА, ДЕЙСТВИТЕЛЬНО!
С р_1() всё получилось 31.3.2007, 8:43
leonid553 Вставил оптимизированные параметры для каждого инд... 31.3.2007, 9:05
leonid553 Не могу понять, в чем дело!
сделал так с индик... 31.3.2007, 9:42
leonid553 Поскольку тесты с WPR и АС соответствуют здравому... 31.3.2007, 10:10
NoName Попробовал тоже так сделать. Стохастик у меня соше... 31.3.2007, 10:11
leonid553 ОК! Понял. 31.3.2007, 10:17
leonid553 Исправил все недоработки. Система заработала так, ... 31.3.2007, 14:08
leonid553 Если нам удасться правильно организовать взаимодей... 31.3.2007, 14:24
NoName Вот идея появилась навскидку. Тоже может дать инте... 31.3.2007, 14:46
leonid553
Вот идея появилась навскидку. Тоже может дать инт... 31.3.2007, 15:54
leonid553
Вот идея появилась навскидку. Тоже может дать инт... 1.4.2007, 8:17
leonid553 но даже и в этом случае необходим фильтр - для пре... 31.3.2007, 18:30
NoName
На мой взгляд, это делается для обеспечения крас... 1.4.2007, 9:59
leonid553
На мой взгляд, это делается для обеспечения кра... 3.4.2007, 12:48
leonid553 Меня вот крайне удручают частые ситуации показанны... 1.4.2007, 10:17
leonid553 Kola:
"А чего тут всего четыре входа у перцеп... 1.4.2007, 18:49
leonid553 to NoName:
Из любопытства вставил ММ в версию стох... 2.4.2007, 10:35
NoName Ну какой же это мизер?? Советник будет курить пока... 3.4.2007, 19:35
leonid553
Ну какой же это мизер?? Советник будет курить пок... 14.4.2007, 10:36
leonid553 Да, действительно.
И сразу обнаружл то, что не сде... 4.4.2007, 9:14
NoName Сделал индикатор, который отображает значения выда... 14.4.2007, 12:02
leonid553 Благодарю!
Поставил. Оч. полезная штуковина... 14.4.2007, 17:05
NoName Дело оказалось в билде MT! На 203-м работает ... 14.4.2007, 18:08
leonid553 Благодарю! Так и случилось! Сейчас постави... 15.4.2007, 8:06
NoName
В архиве два советника: один открывает только дл... 15.4.2007, 13:01
leonid553 Поставил.
Сходу удалось получить +2550 за три год... 15.4.2007, 17:20
NoName Провёл оптимизацию советника LongOnly по фунту на ... 15.4.2007, 18:38
leonid553 Слушай!
Что-то мне "тревожно" стало ... 16.4.2007, 11:53
NoName На счёт шорта и меня стали сомнения терзать. Сейча... 16.4.2007, 12:10
leonid553 В любом случ. надо код - для ясности 16.4.2007, 12:18
NoName
Действительно, допустил ошибку. В советнике испо... 16.4.2007, 14:33
NoName Приведу, пожалуй, основной код: ShortOnly
#prope... 16.4.2007, 15:03
leonid553 Тоже исправил шкалу.
Но у меня ещё до исправления ... 16.4.2007, 16:01
NoName это не ошибка а предупреждение о том что функция S... 16.4.2007, 16:06
leonid553 никак не могу добиться в шорте профитных результат... 16.4.2007, 18:14
NoName С двухполярным стохастиком результат однозначно ху... 16.4.2007, 19:31
leonid553 Андрей!
По вопросу защиты текущей прибыли в мо... 22.4.2007, 8:29
leonid553 Ещё вот сейчас посмотрел. Кроме стохастика для реа... 22.4.2007, 9:13
leonid553 Поставил версию с Отсечкой.
Но работает некорректн... 23.4.2007, 13:24
leonid553 to NoName:
Прогнал исправленную версию с отсечкой.... 24.4.2007, 10:48
NoName
Это объясняется просто. В советнике все действия... 24.4.2007, 14:44
leonid553 Понял!
но пока сделана часть работы! Значи... 24.4.2007, 15:20
leonid553 Никак не пойму, почему не соблюдается число сделок... 25.4.2007, 12:21
NoName Вчера ночью игрался с разными версиями и заметил в... 25.4.2007, 15:52
NoName Вот на этих отчётах наглядно видно почему происход... 26.4.2007, 7:54
leonid553 Посмотрел. Вник.
Ну и ладно! С "этим дело... 27.4.2007, 6:07
leonid553 Ещё вот соображения:
Прогнал первую версию со стох... 27.4.2007, 16:30
NoName Так сходу не врублюсь, нужно малость обдумать.
... 27.4.2007, 18:36
leonid553 пожалуй, не стоит пока возиться!
По "зако... 27.4.2007, 18:52
leonid553 По версии с разумным тралом.
Взял фунт - м30.
При... 28.4.2007, 12:21
leonid553 Еще вот появились соображения.
По версии с лотами ... 28.4.2007, 17:03![]() ![]() |
|
Текстовая версия | Сейчас: 13.3.2026, 2:07 |