Вопрос по OrderType().

 

В справке написано OrderType() возвращает тип операции (OP_BUY, OP_SELL...). Вот хочу посмотреть на это воочию:

ticket[nt]=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit,"Candles", 123,0,Red);

if(OrderSelect(ticket[nt],SELECT_BY_TICKET)) Alert(OrderType()); else Alert("!!!!!!!!");

Ордер устанавливается, но его тип: "0". Пожалуйста, объясните что этот нуль означает?! (желательно с указанием источника информации).

 
grotesque:

В справке написано OrderType() возвращает тип операции (OP_BUY, OP_SELL.. .). Вот хочу посмотреть на это воочию:

ticket[nt]=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit,"Candles", 123,0,Red);

if(OrderSelect(ticket[nt],SELECT_BY_TICKET)) Alert(OrderType()); else Alert("!!!!!!!!");

Ордер устанавливается, но его тип: "0". Пожалуйста, объясните что этот нуль означает?! (желательно с указанием источника информации).


OP_BUY 0 Покупка
OP_SELL 1 Продажа
OP_BUYLIMIT 2 Отложенный ордер BUY LIMIT
OP_SELLLIMIT 3 Отложенный ордер SELL LIMIT
OP_BUYSTOP 4 Отложенный ордер BUY STOP
OP_SELLSTOP 5 Отложенный ордер SELL STOP

https://docs.mql4.com/ru/constants/trading
 

Премного благодарен.

Еще вопросик: как можно выбирать только открытые ордера, или какой функцией проверить?

 
grotesque:

Премного благодарен.

Еще вопросик: как можно выбирать только открытые ордера, или какой функцией проверить?

for(cnt=0;cnt<OrdersTotal();cnt++)               
  {
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); //выбираем ордер
    if (OrderType()<=OP_SELL)                    // если тип ордера бай или селл..
      {
       ...                    
      }
  
  }
 

к сожалению, в этом языке я пока полный ноль..
!. как сделать так чтобы при достижении определенной цены (задаю сам) создавался ОТЛОЖЕННЫЙ ордер на определенное к-во лотов и затем если цена продолжает движение и доходит до следующего уровня, он отменялся?
2. как отменить все ордера и отложенные и уже открытые позиции?

 
shubert писал (а):

к сожалению, в этом языке я пока полный ноль..
!. как сделать так чтобы при достижении определенной цены (задаю сам) создавался ОТЛОЖЕННЫЙ ордер на определенное к-во лотов и затем если цена продолжает движение и доходит до следующего уровня, он отменялся?
2. как отменить все ордера и отложенные и уже открытые позиции?


Первый ваш вопрос можно сделать примерно так:
//установка отложенного ордера при достижении определенной цены
 
   double uroven1;
   double uroven2; 
 
   uroven1=...     // вместо троеточия задаете вашу цену (на первом уровне)
                   // например уровнем какого-нибудь индикатора
   uroven2=...     // вместо троеточия задаете вашу цену (на втором уровне) 
                   // например уровнем какого-нибудь индикатора
 
   if (Bid>=uroven1 && Bid<=uroven1+5*Point)  // допустим цена дошла до вашего
                                              // уровня и находится в 5 пунктах 
                                              // от него
     { 
       //ставится отложенный ордер допустим на 20 пунктов ниже данного уровня

       res=OrderSend(Symbol(),OP_SELLSTOP,1,uroven1-20*Points,3,0,0,"",123456,0,Red);
       return; 
     } 
     
   if (Bid>=uroven2 && Bid<=uroven2+5*Point)  // допустим цена дошла до второго 
                                              // уровня и находится в 5 пунктах 
                                              // от него
 
     {
       for(int j=0;j<OrdersTotal();j++)
            {
             if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break;
             if (OrderSymbol()!=Symbol() || OrderType()<=OP_SELL) continue;
             if (OrderMagicNumber() == 123456)    // если это нужный нам ордер
                 {    
                  OrderDelete(OrderTicket());
                 }
            } 
       return; 
     }
Советую разобрать в данном коде каждое слово с помощью справочника MQL4. Тогда будет все ясно.
Насчет вашего второго вопроса, то открытые позиции можно закрыть с помощью функции OrderClose(), а отложки удалить с помощью OrderDelete() (смотрите в вышенаписанном коде). Удаление открытых позиций можно осуществить также в цикле for. Я понимаю что сейчас этот код страшен и непонятен, но единственным выходом будет посидеть над справочником MQL4 и попытаться понять суть написанного кода

Я тоже чайник, так что если тут допустила ошибку, надеюсь профессионалы поправят. Удачи вам в освоении языка!
 
Aikon писал (а):

for(cnt=0;cnt<OrdersTotal();cnt++)               
  {
    //выбираем ордер
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);     
    // если тип ордера бай или селл..
    if (OrderType()<=OP_SELL)
      {
       ...                    
      }
  
  }

да эт-т понятно... только если проверить...

// устанавливаем ордер
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,
                     Ask-TakeProfit,"Candles",123,0,Red); 
OrderClose(ticket[nt],Lots,Ask,3,CLR_NONE); // закрываем
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET); // выбираем
// выводит invalid ticket for OrderClose function
if(OrderType()<=OP_SELL) Alert("Selected order: ",ticket[nt]); 
// Alert: Selected order: 0
// т.е. условие проходит!

уточняю: только открытые ордера.

 

И даже если сделать так:

if(selord==true) if(OrderType()<=OP_SELL) Alert("Selected order: ",ticket[nt]); // упорно выводит закрытый
 
grotesque:
Aikon писал (а):

for(cnt=0;cnt<OrdersTotal();cnt++)               
  {
    //выбираем ордер
    OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES); 
    // если тип ордера бай или селл..
    if (OrderType()<=OP_SELL)  
      {
       ...                    
      }
  
  }

да эт-т понятно... только если проверить...

// устанавливаем ордер
ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,
                     Ask-TakeProfit,"Candles",123,0,Red); 
OrderClose(ticket[nt],Lots,Ask,3,CLR_NONE); // закрываем
selord=OrderSelect(ticket[nt],SELECT_BY_TICKET); // выбираем
// выводит invalid ticket for OrderClose function
if(OrderType()<=OP_SELL)   
    Alert("Selected order: ",ticket[nt]); 
// Alert: Selected order: 0
// т.е. условие проходит!

уточняю: только открытые ордера.

Так первая переменная в функции ордерслоуз неправильная.. это должен быть порядковый номер ордера. Замените ее на OrderTicket(). Только перед этим он должен быть выбран функцией OrderSelect()
так:
if(OrderSelect(ticket[nt],SELECT_BY_TICKET))      // выбираем
  { 
    OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE); // закрываем
  }
 

Издеваетесь?... извиняюсь, но OrderTicket() - "Возвращает номер тикета. .." и OrderSend() - "Возвращает номер тикета...", в чем разница, зачем использовать один вместо другого?... пробуем:

ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,Ask-TakeProfit,"Candles", 123,0,Red);

OrderSelect(ticket[nt],SELECT_BY_TICKET,);

OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE);

selord=OrderSelect(ticket[nt],SELECT_BY_TICKET);

if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ", ticket[nt]); //Alert: Selected order: 1

другими словами, по номеру тикета (тому что возвращает сервер) невозможно определить открытый он или уже закрытый?

Вот еще косяк в справке (или MACD Sample.mq4?) обнаружил: bool OrderSelect (int index, int select, int pool=MODE_TRADES): pool - Источник данных для выбора. Используется, когда параметр select равен SELECT_BY_POS. Смотрим MACD Sample.mq4: OrderSelect(ticket, SELECT_BY_TICKET,MODE_TRADES) - Спрашивается нафиг?

Давайте тогда перепишем подобным образом, мене уже прикалывается заниматься подобным методом тыка:

ticket[nt]=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+StopLoss,Ask-TakeProfit,"Candles", 123,0,Red);

OrderSelect(ticket[nt],SELECT_BY_TICKET,MODE_TRADES);

OrderClose(OrderTicket(),Lots,Ask,3,CLR_NONE);

selord=OrderSelect(ticket[nt],SELECT_BY_TICKET);

if(selord==true&&OrderType()<=OP_SELL) Alert("Selected order: ", ticket[nt], " ",OrderTicket());

Говорит: invalid ticket for OrderClose function , а почему неправильный номер тика что ticket[nt], что OrderTicket() - возвращают 1...

Вообще про OrderClose(int ticket, double lots, double price, int slippage, color Color=CLR_NONE) сказано: "ticket - Уникальный порядковый номер ордера.", т. е. НЕ номер тикета! Но опять смотрим в MACD Sample.mq4:

OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); - видим противоречие...

Может кто-нибудь тогда точно ответить, первая переменная в функции ОредерКлозе - это номер тикета возвращаемый сервером или номер позиции ордера в списке терминала???

 

все... немогу... пошел следующим путем... но опять что-то не так:


selord=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-StopLoss,Bid+TakeProfit,
                 "Candles",123,0,Red);
ot=OrdersTotal(); 
for(int cnt=0;cnt<=ot;cnt++) 
  {
    OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
    if(OrderType()==OP_BUY) 
        // получается верным для ордеров имеющих порядковый номер '0' и '1', 
        // когда ордера с номер 1 нету!
        Alert("Порядковый номер ордера: ",cnt,"   Тикет ордера:",OrderTicket(),
              "   ИЗ:",ot); 
  }

я что-то не понимаю????? ПОМОГИТЕ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Причина обращения: