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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ivan Ovchinnikov
1827
Ivan Ovchinnikov  

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

Почему то 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();
      }
   }  
................. операторы
}
Vitalii Ananev
11027
Vitalii Ananev  
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 не известно.


Artyom Trishkin
Модератор
56539
Artyom Trishkin  
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
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
Ivan Ovchinnikov
1827
Ivan Ovchinnikov  
Vitalii Ananev:

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


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

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

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

Ivan Ovchinnikov
1827
Ivan Ovchinnikov  

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

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

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

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

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

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

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

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

Ivan Ovchinnikov
1827
Ivan Ovchinnikov  

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


string type = 'OP_BUY';
Ivan Ovchinnikov
1827
Ivan Ovchinnikov  
Vitalii Ananev:

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

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

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

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

Vitalii Ananev
11027
Vitalii Ananev  
Ivan Ovchinnikov:

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


:)

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

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий