Скачать MetaTrader 5

контроль открытых и отложеных ордеров

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Olezka
21
Olezka 2008.04.25 23:01 

Задача следующая .. открывается 2 отложенных ордера .. необходимо при открытии одного их ордеров ..второй удалился.

int i;
 int g;
 if (total >1)  
 {
 OrderSelect(total-1, SELECT_BY_POS);
 if (OrderType()==4 || OrderType()==5) i=1;
 OrderSelect(total, SELECT_BY_POS);
 if (OrderType()==4 || OrderType()==5) g=1;
 Print ("i=",i," g=",g);
 if (i==1 || g==0)  
 {
 OrderSelect(2, SELECT_BY_POS);  
 OrderDelete(OrderTicket());
 Print ("Order=",OrderTicket());
 }
 if (i==0 || g==1)  
 {
 OrderSelect(2, SELECT_BY_POS);
 OrderDelete(OrderTicket());
 Print ("Order=",OrderTicket());
 }
 }

следующий код почему то не работает .. причину никак не могу понять :(.. постоянно пишет что  Order=0 и i=1 g=0.

Igor Malcev
1925
Igor Malcev 2008.04.25 23:26  
Olezka:

Задача следующая .. открывается 2 отложенных ордера .. необходимо при открытии одного их ордеров ..второй удалился.


int start(){
//----
    int TekOrd;
    int magik = 127001;
    if(OrdersTotal()>0){
       TekOrd=SelectOrder(Symbol(),OP_BUY,magik);
       if(TekOrd>0){                                                         //Если Сработал BUY  
          TekOrd=SelectOrder(Symbol(),OP_SELLSTOP,magik);
          if(TekOrd>0){                                                      //Удалим если есть отложенный SELL
             if(!OrderDelete(TekOrd,Black)){Print("Неудалось удалить SELLSTOP ",TekOrd);}
       }}
       TekOrd=SelectOrder(Symbol(),OP_SELL,magik);
       if(TekOrd>0){                                                         //Если Сработал SELL 
          TekOrd=SelectOrder(Symbol(),OP_BUYSTOP,magik);
          if(TekOrd>0){                                                      //Удалим если есть отложенный BUY
                if(!OrderDelete(TekOrd,Black)){Print("Неудалось удалить BUYSTOP ",TekOrd);}
     }}}
//----
   return(0);
  }
//+------------------------------------------------------------------+

int SelectOrder(string Sym,int Tip,int magik){
    int TotOrd=OrdersTotal();
    int OrdTick=-1;
    for(int OrdPos=TotOrd-1;OrdPos>=0;OrdPos--){
        if(OrderSelect(OrdPos, SELECT_BY_POS, MODE_TRADES)==true){
           if(OrderSymbol()==Sym){                                           //Есть ли ордера с нужным символом
              if(OrderType()==Tip){                                          //Если ли нужный тип ордера  
                 if(magik==0){magik=OrderMagicNumber();}                     //Если магик = 0,неучитывать
                 if(OrderMagicNumber() == magik){                            //Есть ли ордера с нужным Магик номером
                    OrdTick = OrderTicket(); break;                          //Запишем в переменную его тикет и прервем цикл 
    }}}}}
    return(OrdTick);                                                         //Возвращает тикет найденного ордера или -1
}
надеюсь подойдет
Olezka
21
Olezka 2008.04.25 23:53  

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

нужно удалить неоткрывшийся ордер .. а тут я что то не пойму где удаляется оредр :(

по вашему коду не получается задуманное :(

Александр
1082
Александр 2008.04.26 06:05  
Olezka:

Задача следующая .. открывается 2 отложенных ордера .. необходимо при открытии одного их ордеров ..второй удалился.

int i;
 int g;
 if (total >1)  
 {
 OrderSelect(total-1, SELECT_BY_POS);
 if (OrderType()==4 || OrderType()==5) i=1;
 OrderSelect(total, SELECT_BY_POS);
 if (OrderType()==4 || OrderType()==5) g=1;
 Print ("i=",i," g=",g);
 if (i==1 || g==0)  
 {
 OrderSelect(2, SELECT_BY_POS);  
 OrderDelete(OrderTicket());
 Print ("Order=",OrderTicket());
 }
 if (i==0 || g==1)  
 {
 OrderSelect(2, SELECT_BY_POS);
 OrderDelete(OrderTicket());
 Print ("Order=",OrderTicket());
 }
 }

следующий код почему то не работает .. причину никак не могу понять :(.. постоянно пишет что Order=0 и i=1 g=0.

Так у вас определяется total? Если как OrdersTotal(), то функция возвращает общее количество открытых и отложенных ордеров, а нумерация ордеров попозиционно начинается с нуля, во 2-м стоит OrderSelect(total...), а нужно total-2 для вашего варианта.

Igor Malcev
1925
Igor Malcev 2008.04.26 06:08  
Olezka:

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

нужно удалить неоткрывшийся ордер .. а тут я что то не пойму где удаляется оредр :(

по вашему коду не получается задуманное :(

Именно то что вы описали и выполняет этот код:


Так понятнее?

Olezka
21
Olezka 2008.04.26 10:50  

xeon  - большое Вам спсб. помогли ..

интересно почему мой вариант не работал .. тотал -2 тоже пробывал :(

Александр
1082
Александр 2008.04.26 20:46  
Olezka:

xeon - большое Вам спсб. помогли ..

интересно почему мой вариант не работал .. тотал -2 тоже пробывал :(


Ну а ниже выделенной мной строки, что идет? Если ордера всего два, то их порядковые номера 0 и 1, а у вас

OrderSelect(2, SELECT_BY_POS);
Внимательнее надо быть, особено после ответа про total.
trance2008
6
trance2008 2013.04.23 17:44  
подскажите, как єтот скрипт сделать теперь с єтим кодом, я вообще не понимаю в программировании этом, помогите
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий