![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
leonid553 |
![]()
Сообщение
#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 Таким образом, если нам известно уравнение некой плоскости и координаты любых точек, то мы можем разделить множество всех точек пространства на два множества точек, разделяемых этой самой плоскостью. ПОСТАНОВКА ЗАДАЧИ Если мы разделим объекты на два класса: открываемые длинные позиции и короткие позиции, а в качестве признаков возьмем значения индикаторов или осцилляторов технического анализа, то остается лишь выяснить уравнение плоскости и попытаться с ее помощью произвести идентификацию. Постановка задачи ясна. Множества точек пересекаются в пространстве и провести четкую разделительную черту между ними невозможно. Единственным и приемлемым решением здесь является линия, которая будет отделять оба множества точек таким образом, чтобы с ее помощью большинство красных объектов оказалось по одну сторону, а синих по другую. На сей раз, мы имеем дело с задачей оптимизации, то есть поиском уравнения разделяющей плоскости или линии, способной максимально разделить два класса объектов друг от друга, но с вероятностью того, что часть точек, принадлежащих одному классу, будет ошибочно идентифицировано, как принадлежащих к классу другому. Попробуем теперь определиться с постановкой задачи, которую мы собираемся решить. Элементарно, что нужно знать трейдеру для прибыльной торговли - это направление движения котировок. То есть если котировки пойдут вверх, то следует открыть длинную позицию. Если вниз, то необходимо открывать позицию короткую. Следовательно, два класса объектов у нас уже есть, а именно, направление движения котировок. Для того, чтобы принять решение, следуя техническому анализу, трейдеры прибегают к исследованию так называемых технических индикаторов или осцилляторов. Мы также будем исследовать осциллятор. Поскольку технические осцилляторы - это гистограммы, значения которых отклоняются от горизонтальной линии, то соответственно и нейронная сеть нам понадобится с линейным фильтром. В качестве признаков объекта, будем брать паттерны, то есть значения осциллятора в четырех точках, взятые с шагом в семь периодов вглубь истории, начиная от текущего момента. Эскизы прикрепленных изображений |
![]() ![]() |
NoName |
![]()
Сообщение
#2
|
![]() Группа: Активный участник Сообщений: 514 Регистрация: 1.5.2006 Из: Украина, Кременчуг Пользователь №: 146 Спасибо сказали: 0 раз(а) ![]() |
Приведу, пожалуй, основной код: ShortOnly
Код #property copyright "NoName" #property link "http://www.tradersforum.net.ru/forum/" //---- input parameters--------- extern double x1=88; extern double x2=123; extern double x3=20; extern double x4=107; //----------- extern int iPeriod=10; extern int StopLoss=60; //-------- extern string _Parameters_Trailing = "----- Параметры Трейлинга -----"; extern bool UseTrailing = false; // Использовать трейлинг extern bool ProfitTrailing = false; // Включать трейлинг когда получен профит extern int TrailingStop = 30; // Фиксированный размер трала extern int TrailingStep = 2; // Шаг трейлинга //======================================================================== //-- Подключаемые модули -- #include <b-Lots.mqh> //======================================================================== int Prefix=1; //для Sell //------------------------------ color clModifyBuy = Green; color clModifySell = Blue; //------------------------------ int Magic; int ExpertBars; int Slippage=2; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- Magic=GetMagic()*10+Prefix; ExpertBars=Bars; //при запуске советника записываем кол-во баров в терминале //---- //в переменную ExpertBars return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- //---- return(0); } //+------------------------------------------------------------------+ double perceptron() { double w1 = x1 - 100; double w2 = x2 - 100; double w3 = x3 - 100; double w4 = x4 - 100; double a1 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 0)-50; double a2 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 7)-50; double a3 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 14)-50; double a4 = iStochastic(NULL, 0, iPeriod, 3, 2, MODE_SMA, 0, MODE_MAIN, 21)-50; return(w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //--------------------- //| здесь проверяется появление нового бара. bool isNewBar=false; //| когда появится новый бар значения ExpertBars if (ExpertBars !=Bars) //| и Bars не совпадут. isNewBar станет true { ExpertBars=Bars; isNewBar=true; } //--------------------- if (isNewBar) { //если появился новый бар bool isExpertSellOrder=false; int spread= MarketInfo(Symbol(),MODE_SPREAD); int _OrdersTotal=OrdersTotal(); for (int i=0; i<_OrdersTotal; i++) { //пробегаем по открытым ордерам if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { //если ордер успешно выбран if (OrderSymbol()==Symbol()) { //если ордер на данном инструменте if (OrderMagicNumber()==Magic) { //если ордер принадлежит данному эксперту if (OrderType()==OP_SELL) { //если ордер на продажу isExpertSellOrder=true; // говорим что ордер эксперта присутсвует if (Ask < (OrderStopLoss() - (StopLoss * 2 + spread)* Point)) { //если мы имеем прибыль превышающую величину 2-х стоплоссов от уровня текущего стоплосса if (perceptron() > 0) { //если перцептрон больше 0 ClosePosition(1); // закрываем Sell //закрываем позицию } } } } } } } if (!isExpertSellOrder) { // если ордера эксперта не нашлись if (perceptron() < 0) Sell(); // если перцептрон меньше 0 - продаём } } // здесь трал по алгоритму Игоря Кима return(0); } P.S. Советники заменил на подправленные. Перекачайте. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 7.5.2025, 21:29 |