Скачать MetaTrader 5

Первые шаги - нужна консультация

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Все статьи доступны из MetaTrader 5. Поделись и ты своей!
jeans
12
jeans 2011.02.03 10:34 

Добрый день !

Мой первый опыт написания советника, так что нужна консультация.

Идея была такова, советник выставляет отложенные ордера в обе стороны, по 2 в каждую сторону, со своими размерами лотов и ТР.

Условие выставления - классика от Била - фрактал выше(ниже) пасти аллигатора.

Ограничения - размер возможного убытка не более заданной величины, т.е. если превышаем - ордера не выставляются.

Вот что получилось:

//-----------------------Изменяемые параметры------------------------
    
    extern double   Lot1=1;          //размер лота 1
    extern double   Lot2=2;          //размер лота2
    extern double   Rdist=1000;      //допустимый убыток
    extern double   TP1=200;         //ТP1
    extern double   TP2=100;         //TP2
    extern double   Bep=30;          //проскальзывание

//-----------------------Торговые условия----------------------------
int start()
  {
    
    double PriceH=0.0;                      // Цена Хай фрактала Up
    double PriceL=0.0;                      // Цена Low Фрактала Low
    double RD;
    int ticket, total;
    static int TotB=0;                     //счетчик отложеных ордеров Buy
    static int TotS=0;                     //счетчик отложеных ордеров Sell
    int j=2;
    
    double A_jaw=iAlligator(NULL,0,13,8,8,5,5,3,MODE_EMA,PRICE_TYPICAL,MODE_GATORJAW,j);   // задание пасти аллигатора
    
    while(NormalizeDouble(PriceH,Digits)==0){ j++; PriceH=iFractals(NULL,0,MODE_UPPER,j);} //задание цены Hi фрактала
    while(NormalizeDouble(PriceL,Digits)==0){ j++; PriceL=iFractals(NULL,0,MODE_LOWER,j);} //задание цены Low фрактала
    
    RD=(PriceH-PriceL);
    
    if (PriceH > A_jaw)    //фрактал выше пасти
    if (RD<Rdist*Point)    //размер возможного убытка
    if (TotB<2)            //кол-во отложенных ордеров не более 2
      {
        ticket=OrderSend(Symbol(),OP_BUYSTOP,Lot1,PriceH+Bep*Point,0,PriceL-Bep*Point,PriceH+TP1*Point,"Frank",777,0,CLR_NONE);
        if (ticket>0)
        TotB=TotB+1;
    
        ticket=OrderSend(Symbol(),OP_BUYSTOP,Lot2,PriceH+Bep*Point,0,PriceL-Bep*Point,PriceH+TP2*Point,"Frank",777,0,CLR_NONE);
        if (ticket>0)
        TotB=TotB+1;
       }
   
    if (PriceL < A_jaw)   //фрактал ниже пасти
    if (RD<Rdist*Point)    //размер возможного убытка
    if (TotS<2)            //кол-во отложенных ордеров не более 2 
      {
        ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot1,PriceL-Bep*Point,0,PriceH+Bep*Point,PriceL-TP1*Point,"Frank",777,0,CLR_NONE);
        if (ticket>0)
        TotS=TotS+1;         
                 
        ticket=OrderSend(Symbol(),OP_SELLSTOP,Lot2,PriceL-Bep*Point,0,PriceH+Bep*Point,PriceL-TP2*Point,"Frank",777,0,CLR_NONE);
        if (ticket>0)
        TotS=TotS+1;
       }


   }   
return(0);
jeans
12
jeans 2011.02.03 10:39  

А теперь сам вопрос. Данный код работает, но неверно. Когда есть явные фракталы по 1 с каждой стороны - все правильно выставляет. Но если есть 2 фрактала в одну сторону, то он выбирает Первый отвечающий параметру > или < пасти, а необходимо чтобы он всегда выбирал самый "свежий" фрактал, т.е. последний.

Как смог написал счетчик отложенных ордеров чтобы выставить ограничение на количество, он работает, но может подскажете другой вариант, потому что дальше мне не понятно как его моделировать чтобы он отнимал -1 когда отложенный ордер станет исполненным.

Спасибо.

Alexey Subbotin
4998
Alexey Subbotin 2011.02.03 10:48  

Обратите внимание, в строчках

while(NormalizeDouble(PriceH,Digits)==0){ j++; PriceH=iFractals(NULL,0,MODE_UPPER,j);} //задание цены Hi фрактала
while(NormalizeDouble(PriceL,Digits)==0){ j++; PriceL=iFractals(NULL,0,MODE_LOWER,j);} //задание цены Low фрактала

поиск начинается с бара j=3, а не 2, не знаю, так ли задумано или нет.

По поводу ордеров - сделайте их подсчет с учетом магика в начале функции start(), после объявления TotB и TotS, статику уберите, она тогда никчему.

Alexey Subbotin
4998
Alexey Subbotin 2011.02.03 10:49  
TotS=TotS+1;

TotB=TotB+1;


тоже уберите.

jeans
12
jeans 2011.02.03 11:12  
alsu:

Обратите внимание, в строчках

поиск начинается с бара j=3, а не 2, не знаю, так ли задумано или нет.

По поводу ордеров - сделайте их подсчет с учетом магика в начале функции start(), после объявления TotB и TotS, статику уберите, она тогда никчему.

так было задумано, фрактал не может образоваться ранее 3 бара, хотя на графике он рисуется, j=2 я выставил чтобы не "поймать" ложный фрактал.

Alexey Subbotin
4998
Alexey Subbotin 2011.02.03 11:20  
jeans:

так было задумано, фрактал не может образоваться ранее 3 бара, хотя на графике он рисуется, j=2 я выставил чтобы не "поймать" ложный фрактал.


ага, я так и подумал. Если со счетчиком ордеров будут проблемы, пишите. Будете перебирать ордера, делайте "с конца", а не с 0

for(i=OrdersTotal()-1; i>=0; i--) 
{ 
   OrderSelect(i, SELECT_BY_POS); 
   .....
}
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий