Функция OrderType возвращает 0, несмотря на то, что есть ордер на покупку или продажу

 

Здравствуйте, товарищи! Такая ситуация. Есть советник. Советник установлен на нескольких терминалах. Настройки практически одинаковые.

Почему то OrderType() возвращает 0 после чего позиция закрывается. 

Вот что выдает сова при закрытии 

2019.11.12 07:08:37.310 WebEA EURJPY,H1: Position closed, REST, 0 and 70 end

А что самое интересное, что в других трех терминалах эта же функция работает корректно и ничего не закрывает.

В чем может быть проблема подскажите пожалуйста.

void TradeOpen(double price)
{
   int type = OP_BUY;
   if(order_type == "sell") { type = OP_SELL; }
   
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
   {
      if(OrderType()==type && OrderMagicNumber() == magic_number) // если тип открытого ордера и меджик совпадают, новую позицию не открываем
      {
         Print("Skip trade, this type of order already exists");
         return;
      }
      else // в остальных случаях закрываем позицию
      {
         Print("Position closed, REST, "+type+" and "+magic_number+" end");
         TradeClose();
      }
   }  
................. операторы
}
 
Ivan Ovchinnikov:

Здравствуйте, товарищи! Такая ситуация. Есть советник. Советник установлен на нескольких терминалах. Настройки практически одинаковые.

Почему то OrderType() возвращает 0 после чего позиция закрывается. 

Вот что выдает сова при закрытии 

2019.11.12 07:08:37.310 WebEA EURJPY,H1: Position closed, REST, 0 and 70 end

А что самое интересное, что в других трех терминалах эта же функция работает корректно и ничего не закрывает.

В чем может быть проблема подскажите пожалуйста.

0 это позиция типа OP_BUY. У вас в начале функции переменная type инициируется значением OP_BUY (0). Если условие if(OrderType()==type && OrderMagicNumber() == magic_number) ложное то в журнал выводится  Position closed, REST, 0 and  + значение переменной magic_number+ end

Зачем нужно вот эта конструкция мне не понятно if(order_type == "sell") { type = OP_SELL; } И какое значение значение на момент вызова этой функции имеет переменная order_type не известно.


 
Ivan Ovchinnikov:

Здравствуйте, товарищи! Такая ситуация. Есть советник. Советник установлен на нескольких терминалах. Настройки практически одинаковые.

Почему то OrderType() возвращает 0 после чего позиция закрывается. 

Вот что выдает сова при закрытии 

2019.11.12 07:08:37.310 WebEA EURJPY,H1: Position closed, REST, 0 and 70 end

А что самое интересное, что в других трех терминалах эта же функция работает корректно и ничего не закрывает.

В чем может быть проблема подскажите пожалуйста.

ORDER_TYPE_BUY = OP_BUY = 0

Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Vitalii Ananev:

Зачем нужно вот эта конструкция мне не понятно if(order_type == "sell") { type = OP_SELL; } И какое значение значение на момент вызова этой функции имеет переменная order_type не известно. 


order_type может принимать значения buy, sell или notrade

Суть проверки такая: нужно установить совпадает ли order_type с уже открытой позицией и если позиция открыта, пропустить ее, а остальных случаях закрыть.

К примеру order_type = buy и у нас есть открытый ордер на покупку. Вот тогда ничего делать не надо. А в остальных случаях его закрыть.

 

Как я понял, провера условия у меня задана некорректно, поэтому оно всегдла ложное. 

Подскажите тогда пожалуйста, как правильно тут сделать.

 
Получается что OrderType() = OP_BUY, а type = 0
 
Ivan Ovchinnikov:

Как я понял, провера условия у меня задана некорректно, поэтому оно всегдла ложное. 

Подскажите тогда пожалуйста, как правильно тут сделать.

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

 
Ivan Ovchinnikov:
Получается что OrderType() = OP_BUY, а type = 0

Функция OrderType() возвращает тип ордера предварительно выбранного функцией OrderSelect(). Константа OP_BUY это позиция на покупку и имеет цифровое значение равное нулю (0). 

 

А если сделать так то прокатит, как думаете? Будет за строку считаться?


string type = 'OP_BUY';
 
Vitalii Ananev:

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

хочу сделать так. if(если order_type == "sell" и в терминале есть открытые ордера на продажу с нашим меджиком ) {операторы...}

то же самое при order_type == "buy" и в терминале есть открытые ордера на покупку с нашим меджиком.

Желательно все в одно условие.

 
Ivan Ovchinnikov:

А если сделать так то прокатит, как думаете? Будет за строку считаться?


:)

OrderSelect() выбирает ордер по его тикету или по порядковому номеру. У вас используется  SELECT_BY_POS, это значит выбор по порядковому номеру. Функция OrdersTotal() возвращает кол-во всех открытых позиций и ордеров. И теперь подумаете есть ли у вас ордер с порядковым номером  OrdersTotal()-1