Как выбрать ордер по тикету?

 

Здравствуйте.

При открытии каждого ордера в коммент. записываю баланс на данный момент,и назначаю тикет (ticket1,ticket2  и т.д.). Потом  закрываю ордера относительно баланса последнего ордера.

По аллерту смотрю, если по трэйдам SELECT_BY_POS выбирать

for(int i=1; i<=OrdersTotal(); i++)  //это последний открытый ордер

то получается. А по тикету никак.Как исправить?


double comment2()
{ 
  datetime time=0;
  int ticket2;//тикет назначенный второму ордеру
 for(int i=1; i<=OrdersTotal(); i++)
    {
  if(OrderSelect(ticket2, SELECT_BY_TICKET))  
    {   
  if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
         { 
           ticket2 = OrderTicket();         
           double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера
         }  
     }
    }
  return(comment2); 
}
 
Dima DD:

Здравствуйте.

При открытии каждого ордера в коммент. записываю баланс на данный момент,и назначаю тикет (ticket1,ticket2  и т.д.). Потом  закрываю ордера относительно баланса последнего ордера.

По аллерту смотрю, если по трэйдам SELECT_BY_POS выбирать

for(int i=1; i<=OrdersTotal(); i++)  //это последний открытый ордер

то получается. А по тикету никак.Как исправить?

double comment2()
{ 
  datetime time=0;
  int ticket2;//тикет назначенный второму ордеру
 for(int i=1; i<=OrdersTotal(); i++)
    {
  if(OrderSelect(ticket2, SELECT_BY_TICKET))  
    {   
  if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic )
         { 
           ticket2 = OrderTicket();         
           double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера
         }  
     }
    }
  return(comment2); 
}

Тикет должен быть назначен до попытки выбрать ордер по тикету. Как правило это делается при открытии ордера.

Возвращаемое значение

Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи.

 
Alexey Viktorov:

Тикет должен быть назначен до попытки выбрать ордер по тикету. Как правило это делается при открытии ордера.

Так и делаю.При открытии ордера назначаю тикет.
 

Сделал советник, в тестере прогнал, всё определяет по тикету нормально.На демо поставил, утром смотрю сделки висят, не закрываются. Искал, оказалось тикет не определяет.

 for( trade = OrdersTotal()-1; trade >= 0; trade--)//так ставил,это первый ордер
  {
  OrderSelect(ticket2, SELECT_BY_TICKET, MODE_TRADES );
     

      Иногда требуется сравнить баланс при открытии ticket2 и ticket 5, не только при 1-ом и последнем.

 

Два вопроса:

1) Зачем цикл, если Вы выбираете сделку по тикету? Цикл нужен, чтобы выбирать её по номеру в списке ордеров.

2) Почему Вы пытаетесь выбрать сделку по тикету, но тикет не указываете (переменная ticket2 не инициализирована)?


Должно быть примерно так:

double comment2()
  {
   int ticket2=123;//тикет назначенный второму ордеру

   if(OrderSelect(ticket2,SELECT_BY_TICKET))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         double comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера
        }
     }
   return(comment2);
  }

Т.е. тикет (в данном примере это "123", т.е. ордер с тикетом 123) Вы должны знать и задать до вызова функции OrderSelect с SELECT_BY_TICKET. Иначе, если Вы его не знаете, нужно перебирать все ордера в списке, пока какой-то не подойдёт заданным параметрам (символ, магический номер).


А если Вы не знаете тикет, и ищете ордер просто с нужным символов и магическим номером, то должно быть примерно так:

double comment2()
  {
   double comment2 = 0;
 
   for(int i=0; i<OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            comment2=StrToDouble(OrderComment());//баланс при открытии второго ордера
           }
        }
     }
   return(comment2);
  }
 
Sergey Eremin:

Три вопроса:

1) Почему проход идёт в цикле от индекса 1, а не 0? Если у Вас всего одна сделка, то по идее этот цикл не выполнит ни одной итерации. UPD этот вопрос уже не актуален, вижу, что в последнем варианте уже до нуля доходит.

2) Зачем цикл, если Вы выбираете сделку по тикету? Цикл нужен, чтобы выбирать её по номеру в списке ордеров.

3) Почему Вы пытаетесь выбрать сделку по тикету, но тикет не указываете (переменная ticket2 не инициализирована)?


Должно быть примерно так:

Т.е. тикет (в данном примере это "123", т.е. ордер с тикетом 123) Вы должны знать и задать до вызова функции OrderSelect с SELECT_BY_TICKET. Иначе, если Вы его не знаете, нужно перебирать все ордера в списке, пока какой-то не подойдёт заданным параметрам (символ, магический номер).


А если Вы не знаете тикет, и ищете ордер просто с нужным символов и магическим номером, то должно быть примерно так:

   Спасибо за ответ. Первый вариант без цикла не идёт "0". Второй, это перебор ордеров не по тикету.Так не найти 2-й, 3-й и т.д.Тикет указываю перед OrderSend.
 
Dima DD:
   Спасибо за ответ. Первый вариант без цикла не идёт "0". Второй, это перебор ордеров не по тикету.Так не найти 2-й, 3-й и т.д.Тикет указываю перед OrderSend.

Хммм, как Вы можете задать тикет до OrderSend, если его назначает не пользователь, а сервер? Тикет это номер ордера на сервере.

Покажите код, как Вы это делаете :)

 
Sergey Eremin:

Хммм, как Вы можете задать тикет до OrderSend, если его назначает не пользователь, а сервер? Тикет это номер ордера на сервере.

Покажите код, как Вы это делаете :)

ticket2=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP,comment, Magic, 0, Blue);  
ticket3=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP,comment, Magic, 0, Blue); 
ticket4=OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, SL, TP,comment, Magic, 0, Blue);   
Потом через
OrderTicket();  
узнаю номер.
 
Понял. Но смотрите, в функции comment2() вы объявляете новую переменную ticket2 и она уже не знает ничего о том значении, которое Вы получили при выставлении ордера. Или Вы просто не весь код функции comment2() показываете?
 
Sergey Eremin:
Понял. Но смотрите, в функции comment2() вы объявляете новую переменную ticket2 и она уже не знает ничего о том значении, которое Вы получили при выставлении ордера. Или Вы просто не весь код функции comment2() показываете?
   полностью, так стоит.
 

Тогда точно неправильно :)

Должно быть примерно так:

1) Выставили ордер, запомнили его тикет (например, в глобальную переменную терминала).
2) В нужной функции выбрали ордер с запомненным тикетом и работаете с ним.

Но это плохое решение. лучше завести три магических номера и уже по ним выбирать ордера перебором в цикле, так будет работать надёжней.
Глобальные переменные клиентского терминала - Документация на MQL4
  • docs.mql4.com
Глобальные переменные клиентского терминала - Документация на MQL4
Причина обращения: