Вторник, 2025-07-08, 0:37 AM
Главная Регистрация RSS
Приветствую Вас, Гость

Меню сайта
Форма входа
Категории раздела
Поиск

  • БУДДАРА

  • «ПРИБЫЛЬНЫЕ ФОРЕКС СОВЕТНИКИ ИНДИКАТОРЫ И ТОРГОВЫЕ СИСТЕМЫ БЕСПЛАТНО»
    Ваш e-mail: *
    Ваше имя: *
    Подписчиков:




    Друзья сайта


  • БУДДАРА

  • «ПРИБЫЛЬНЫЕ ФОРЕКС СОВЕТНИКИ ИНДИКАТОРЫ И ТОРГОВЫЕ СИСТЕМЫ БЕСПЛАТНО»
    Ваш e-mail: *
    Ваше имя: *
    Подписчиков:







    Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0
    Главная » Статьи » Форекс Советники

    Рождение форекс эксперта. Стохастическая Система ч2

    Рождение форекс эксперта. Стохастическая Система ч2

    Рождение форекс эксперта. Стохастическая Система ч1

    В таком состоянии эксперта можно откомпилировать и запустить на выполнение, чтобы получить возможность проанализировать его работу. По крайней мере, тех функций и правил, которые в него уже заложены. Делается это очень просто. Берем график EUR/USD M5, накладываем на него индикатор Stochastic с теми же параметрами, что и индикатор, используемый в эксперте. Этот индикатор будет использоваться для определения значений Стохастика в определенные моменты времени. Затем запускаем эксперта на небольшом участке истории, например 3 дня и смотрим, какие сделки совершал эксперт и когда. При этом проверяем, используя график Стохастика, были ли на самом деле сигналы на открытие ордеров. Так же проверяем выполнение условий для закрытия ордеров. Все должно соответствовать тем правилам, которые были заложены в эксперта. Таким образом, вручную, проверяется работоспособность любого эксперта.Если все хорошо, то следуем дальше. Нам еще надо реализовать выход с рынка при 2-ом снижении (повышении) Стохастика, ну и защитить от обратного движения.

    Сначала поставим защиту от обратного движения Стохастика:

    1. // блок закрытия всех открытых ордеров в случае, если рынок пошел не в нашу сторону 
    2. if (OrdersTotal()>=1) 
    3.    { 
    4.      if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) 
    5.        { 
    6.           if(OrderType()==OP_BUY) 
    7.             { 
    8.               if(stoch_1<=40) 
    9.                 while(OrdersTotal()>0) 
    10.                  { 
    11.                    CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); 
    12.                  } 
    13.             } 
    14.           if(OrderType()==OP_SELL) 
    15.             { 
    16.               if(stoch_1>=60) 
    17.                 while(OrdersTotal()>0) 
    18.                  { 
    19.                    CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); 
    20.                  } 
    21.             } 
    22.         } 
    23.         else 
    24.           { 
    25.             Print("ОШИБКА в Start()(блок закрытия при обратном движении) :OrderSelect() - ",GetLastError()); 
    26.             return(-1); 
    27.           } 
    28.       }  

    Здесь все просто: в этот блок заходим только, если OrdersTotal()>0, т.е. есть открытые ордера, иначе нам просто незачем туда заходить. Далее, с помощью функции OrderSelect(), выбираем первый ордер (порядковый номер 0), затем, если тип выбранного ордера - BUY, то проверяем значение Стохастика и, если оно меньше 40, то закрываем все открытые позиции:

    1. if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) 
    2.   { 
    3.     if(OrderType()==OP_BUY) 
    4.       { 
    5.         if(stoch_1<=40) 
    6.           while(OrdersTotal()>0) 
    7.             { 
    8.               CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); 
    9.             }    

    Аналогично работает блок для закрытия позиции SELL. На данный момент у нас имеется эксперт, который открывает сделки в период с 13.00 по 21.00 CET, закрывает часть позиции (один из двух ордеров) при достижении профита в 10 пунктов и закрывает все позиции, если Стохастик идет в противоположную сторону.Нам осталось реализовать закрытие BUY-позиции на 2-ом снижении линии %К, а так же закрытие SELL-позиции на 2-ом повышении линии %К. На MQL4 это выглядит следующим образом:

    1. // блок закрытия на 2-ом снижении (повышении) Стохастика. 
    2. if (OrdersTotal()>=1) 
    3.   { 
    4.     if ((stoch_1<stoch_2)&&(stoch_3<stoch_2)) down++; 
    5.     if ((stoch_1>stoch_2)&&(stoch_3>stoch_2)) up++; 
    6.  
    7.     if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) 
    8.       { 
    9.         if(OrderType()==OP_BUY) 
    10.           { 
    11.             if(down==NWave) 
    12.               while(OrdersTotal()>0) 
    13.               { 
    14.                  CloseDirect(0,"Закрытие всех BUY-сделок после второго подъема, ticket="); 
    15.               } 
    16.           } 
    17.         if(OrderType()==OP_SELL) 
    18.           { 
    19.             if(up==NWave) 
    20.                while(OrdersTotal()>0) 
    21.                { 
    22.                   CloseDirect(0,"Закрытие всех SELL-сделок после второго подъема, ticket="); 
    23.                } 
    24.           } 
    25.       } 
    26.       else 
    27.           { 
    28.             Print("ОШИБКА в Start():OrderSelect() - ",GetLastError()); 
    29.             return(-1); 
    30.           } 
    31.    }     

    Как видите здесь тоже все просто. В блоке используются две глобальные переменные – down и up. Переменная down это счетчик понижений, который считает, сколько понижений Стохастика прошло после открытия сделки. Переменная up считает, соответственно, количество повышений Стохастика. Эти переменные объявляются вместе с переменной K_level и должны обнуляться во время открытия сделки, поэтому в блоки открытия сделок добавляем строчки обнуления переменных down и up.

    Идем дальше. В строке:

    1. if ((stoch_1<stoch_2)&&(stoch_3<stoch_2)) down++;  

    происходит проверка на наличие очередного понижения Стохастика, если таковое было, то счетчик увеличивается на 1 (оператор down++). Наличие понижения определяется очень просто – сравниваются значения Стохастика один бар назад, два бара назад и три бара назад, переменные - stoch_1, stoch_2 и stoch_3 соответственно. Понижение было, если stoch_3stoch_1. Аналогично проверяется наличие повышения.

    Переменная NWave содержит в себе значение равное количеству понижений (повышений) после которого необходимо закрывать сделку. Изначально, по правилам системы, это значение равно 2, но я решил иметь возможность изменять этот параметр во время тестирования эксперта. Поэтому переменная NWave объявлена как внешняя.

    Далее, если число повышений (понижений) Стохастика равно NWave, то происходит закрытие ордеров с помощью функции CloseDirect(…). Эту функцию мы уже разбирали. Вот и все. Но, забегая вперед, хочу отметить, что при тестировании эксперта выявилось следующее: при значениях переменных stoch_2 >50, stoch_1<30, K_level=70, т.е. когда Стохастик находившийся выше линии 70 пересекает сверху вниз линию 50 при этом, достигая уровня ниже 30, по правилам системы имеем сигнал на продажу, но сделка не совершается. Причина, как выяснилось, в том, что значение Стохастика (переменная stoch_1) меньшее тридцати переключает значение переменной K_level в 30 вот в этой строчке:

    1. if (stoch_1<30) K_level=30; 

    Но нас это не устраивает, поэтому внесем изменения в код и заменим строки:

    1. if (stoch_1>70) K_level=70; 
    2. if (stoch_1<30) K_level=30;   

    на код:

    1. if ((stoch_1>70)&&(stoch_2>50)) K_level=70; 
    2. if ((stoch_1<30)&&(stoch_2<50)) K_level=30;    

    Тем самым, добавив дополнительную проверку на отсутствие пересечения с линией 50 при входе в зону, где изменяется значение переменной K_level. Таким образом, теперь, прежде чем изменить значение переменной K_level мы, дополнительно проверяем, не было ли пересечения уровня 50.

    Теперь все, и наш эксперт принял окончательный вид:

    1. //+------------------------------------------------------------------+ 
    2. //|                                             stochastic_system.mq4| 
    3. //|                                                    Павел Смирнов | 
    4. //|                                                 www.autoforex.ru | 
    5. //+------------------------------------------------------------------+ 
    6. #property copyright "Павел Смирнов" 
    7. #property link      "www.autoforex.ru" 
    8.  
    9. extern int TakeProfit=10; 
    10. extern int NWave=2; 
    11.  
    12. extern int K=9; 
    13. extern int D=3; 
    14. extern int slowing=5; 
    15. extern int Average_method=2; 
    16. extern int price_field=0; 
    17.  
    18. int K_level=0; 
    19. int down=0; 
    20. int up=0; 
    21.  
    22. void CloseDirect(int cntr, string comm) 
    23.   { 
    24.     double closeprice; 
    25.     if(OrderSelect(cntr,SELECT_BY_POS,MODE_TRADES)) 
    26.       { 
    27.         RefreshRates(); 
    28.         if (OrderType()==OP_BUY) 
    29.           closeprice=Bid; 
    30.         else 
    31.           closeprice=Ask; 
    32.         if (OrderClose(OrderTicket(),OrderLots(),closeprice,10,Green)) 
    33.         { 
    34.           Print(comm, OrderTicket()); 
    35.         } 
    36.         else 
    37.           { 
    38.             Print("ОШИБКА в CloseDirect():OrderClose() - ",GetLastError()); 
    39.           } 
    40.       } 
    41.     else 
    42.       { 
    43.         Print("ОШИБКА в CloseDirect():OrderSelect() - ",GetLastError()); 
    44.       } 
    45.   } 
    46.  
    47. int init() 
    48.   { 
    49.    return(0); 
    50.   } 
    51.  
    52. int deinit() 
    53.   { 
    54.    return(0); 
    55.   } 
    56.  
    57. int start() 
    58.   { 
    59.     int ticket=0; 
    60.     double stoch_1=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,1); 
    61.     double stoch_2=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,2); 
    62.     double stoch_3=iStochastic(NULL,0,K,D,slowing,Average_method,price_field,MODE_MAIN,3); 
    63.     int Hour_curr=TimeHour(TimeCurrent()); 
    64.  
    65.     if ((stoch_1>70)&&(stoch_2>50)) K_level=70; 
    66.     if ((stoch_1<30)&&(stoch_2<50)) K_level=30; 
    67.     if(OrdersTotal()<1) 
    68.       { 
    69.         if((Hour_curr>=13)&&(Hour_curr<21))//проверка сигналов только в этот промежуток времени 
    70.           { 
    71.             if((K_level==30)&&(stoch_1>50.0))//сигнал на покупку 
    72.               { 
    73.                 RefreshRates(); 
    74.                 ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,0,"buy_order1",1,0,Red); 
    75.                 ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,10,0,Ask+TakeProfit*Point,"buy_order2",2,0,Red); 
    76.                 K_level=50; 
    77.                 down=0; 
    78.               } 
    79.             if((K_level==70)&&(stoch_1<50.0))//сигнал на продажу 
    80.               { 
    81.                 RefreshRates(); 
    82.                 ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,0,"sell_order1",1,0,Blue); 
    83.                 ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,10,0,Bid-TakeProfit*Point,"sell_order2",2,0,Red); 
    84.                 K_level=50; 
    85.                 up=0; 
    86.               } 
    87.           } 
    88.       } 
    89.  
    90.     // блок закрытия всех открытых ордеров в случае, если рынок пошел не в нашу сторону 
    91.     if (OrdersTotal()>=1) 
    92.       { 
    93.         if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) 
    94.           { 
    95.             if(OrderType()==OP_BUY) 
    96.               { 
    97.                 if(stoch_1<=40) 
    98.                   while(OrdersTotal()>0) 
    99.                     { 
    100.                       CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); 
    101.                     } 
    102.               } 
    103.             if(OrderType()==OP_SELL) 
    104.               { 
    105.                 if(stoch_1>=60) 
    106.                   while(OrdersTotal()>0) 
    107.                     { 
    108.                       CloseDirect(0,"Принудительное закрытие сделки при обратном движении рынка, ticket="); 
    109.                     } 
    110.               } 
    111.           } 
    112.         else 
    113.           { 
    114.             Print("ОШИБКА в Start()(блок закрытия при обратном движении) :OrderSelect() - ",GetLastError()); 
    115.             return(-1); 
    116.           } 
    117.       } 
    118.  
    119.     // блок закрытия на 2-ом снижении (повышении) Стохастика. 
    120.     if (OrdersTotal()>=1) 
    121.       { 
    122.         if ((stoch_1<stoch_2)&&(stoch_3<stoch_2)) down++; 
    123.         if ((stoch_1>stoch_2)&&(stoch_3>stoch_2)) up++; 
    124.  
    125.         if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES)) 
    126.           { 
    127.             if(OrderType()==OP_BUY) 
    128.               { 
    129.                 if(down==NWave) 
    130.                    while(OrdersTotal()>0) 
    131.                     { 
    132.                       CloseDirect(0,"Закрытие всех BUY-сделок после второго подьема, ticket="); 
    133.                     } 
    134.               } 
    135.             if(OrderType()==OP_SELL) 
    136.               { 
    137.                 if(up==NWave) 
    138.                   while(OrdersTotal()>0) 
    139.                     { 
    140.                       CloseDirect(0,"Закрытие всех SELL-сделок после второго подьема, ticket="); 
    141.                     } 
    142.               } 
    143.           } 
    144.         else 
    145.           { 
    146.             Print("ОШИБКА в Start():OrderSelect() - ",GetLastError()); 
    147.             return(-1); 
    148.           } 
    149.       } 
    150.  
    151.     if (Hour_curr>=22)//безусловное закрытие всех позиций 
    152.       { 
    153.         while(OrdersTotal()>0) 
    154.           { 
    155.             CloseDirect(0,"Принудительное закрытие сделки в 22.00, ticket="); 
    156.           } 
    157.       } 
    158.  
    159.     return(0); 
    160.   }  

    Теперь можно тестировать его, оптимизировать, изменять, словом делать с ним все, что душе угодно.

    Надеюсь, написание эксперта Вам не показалось сложным. Все, на самом деле достаточно просто, если писать программу по частям, разделив ее на небольшие блоки. Такая, блочная структура программы, очень практична, т.к. отдельные блоки, с небольшими изменениями, можно будет использовать в будущем в других экспертах. Это несколько облегчает труд программирования на MQL4.

    Категория: Форекс Советники | Добавил: forex_s (2009-10-25)
    Просмотров: 2170 | Рейтинг: 0.0/0
    Всего комментариев: 0
    Имя *:
    Email *:
    Код *:
    СВЕРХПРИБЫЛЬНЫЕ СОВЕТНИКИ И ИНДИКАТОРЫ ДЛЯ ФОРЕКС >>>Торговые системы для Forex !