Стандартная библиотека. Косяки.

 

На хеджевом счёте запускаем вот такой простой скрипт:

#include <Trade\Trade.mqh>
CTrade         Ctrd;
 
void OnStart()
   {      
      for(int i=PositionsTotal()-1;i>=0;i--) Ctrd.PositionClose(PositionGetSymbol(i));
   }

 и ожидаем что он закроет всё.
Но оказывается, если сделки открыты роботом и им присвоен какой либо магик, то эти сделки не закроются. Смотрим код библиотеки Trade.mqh и видим такую строку под номером 1504:

if(position_symbol==symbol && m_magic==PositionGetInteger(POSITION_MAGIC))

 смотрим в хелпе описание метода PositionClose и ни слова не видим про магик.
Вывод: либо в библиотеке убрать проверку магика либо написать об этом в хелпе.
Или я что то неправильно понимаю ?

 в сервисдеск не пишу по причине отсутствия реакции на предыдущее сообщение. хз чем там народ занят.  все наверное в работе.

 
Alexey Oreshkin:

...

 и ожидаем что он закроет всё.

...

Очень богатая фантазия нужна, что бы такое ждать.
 

На мой взгляд, "это не баг, это фича".

Закрывать позиции, не тобой открытые - с точки зрения класса весьма спорный функционал. 

И, кстати, цикл FOR в приведенном коде - крайне опасно написан.  Если такой цикл будет вставлен в реально работающий эксперт или скрипт - возможна трудно вычислимая ошибка с зацикливанием.

В цикле надо, по возможности, избегать проверки условий с равенством - лучше изменить условия так, чтобы было либо строгое неравенство, либо строгое равенство, в данном случае - строгое неравенство.

 
Dmitry Fedoseev:
Очень богатая фантазия нужна, что бы такое ждать.

Дмитрий - очень информативное сообщение. 

Поясните, почему нужна богатая фантазия ?

 
George Merts:

Дмитрий - очень информативное сообщение. 

Поясните, почему нужна богатая фантазия ?

Потому-что параметр только один: Ctrd.PositionClose(PositionGetSymbol(i));

Сама конструкция:

for(int i=PositionsTotal()-1;i>=0;i--) Ctrd.PositionClose(PositionGetSymbol(i));

 выглядит от этого криво. Давно пора понять что чудес не бывает. Не закроются все ордера одного символа пачкой - это раз. А два - если ордера закрываются по одному, такая конструкция не позволяет их идентифицировать.

 
Dmitry Fedoseev:
 

выглядит от этого криво. Давно пора понять что чудес не бывает. Не закроются все ордера одного символа пачкой - это раз. А два - если ордера закрываются по одному, такая конструкция не позволяет их идентифицировать.

Не анализировал класс  СTrade, но, в МТ5 - позиция совокупная, и в ней не бывает "много ордеров".

Если не ошибаюсь, для хеджирующего счета - ордеров может быть два - прямой, и обратный, и оба они составляют позицию, соответственно, и закрываться должны одновременно одной командой.

Да и для МТ4 класс позиции - должен включать все открытые ордера, и внутри функции PositionClose() - они должны закрываться все, через перебор.

В данном случае - вполне рабочая конструкция.

 

Под ордером имел ввиду позицию. Пока не пробовал хеджирующий счет, но у меня другие представления о его возможностях.

Смотрел этот класс и как раз его код как бы намекает, что позиций может быть несколько. 

 
George Merts:

Не анализировал класс  СTrade, но, в МТ5 - позиция совокупная, и в ней не бывает "много ордеров".

Если не ошибаюсь, для хеджирующего счета - ордеров может быть два - прямой, и обратный, и оба они составляют позицию, соответственно, и закрываться должны одновременно одной командой.

Да и для МТ4 класс позиции - должен включать все открытые ордера, и внутри функции PositionClose() - они должны закрываться все, через перебор.

В данном случае - вполне рабочая конструкция.

Может быть сколько угодно, как и в МТ4.
 
Dmitry Fedoseev:
Очень богатая фантазия нужна, что бы такое ждать.
Начнём с того что всё закрывается на ура. Хотя в рабочих экспертах использую немного другую конструкцию для закрытия всего.
George Merts:

На мой взгляд, "это не баг, это фича".

Закрывать позиции, не тобой открытые - с точки зрения класса весьма спорный функционал. 

И, кстати, цикл FOR в приведенном коде - крайне опасно написан.  Если такой цикл будет вставлен в реально работающий эксперт или скрипт - возможна трудно вычислимая ошибка с зацикливанием.

В цикле надо, по возможности, избегать проверки условий с равенством - лучше изменить условия так, чтобы было либо строгое неравенство, либо строгое равенство, в данном случае - строгое неравенство.

Согласен со всем. Но пример не для олимпиады по программированию, а показывавший  конкретную багу которую нужно исправить и чем проще он будет показан тем быстрее и до большего числа людей он будет понятней, но оказалось что отвечать стали на те вопросы которые я, как тс, не задавал и ответы на них меня не интересуют.

Dmitry Fedoseev:

Потому-что параметр только один: Ctrd.PositionClose(PositionGetSymbol(i));

Сама конструкция:

 выглядит от этого криво. Давно пора понять что чудес не бывает. Не закроются все ордера одного символа пачкой - это раз. А два - если ордера закрываются по одному, такая конструкция не позволяет их идентифицировать.

Тот кто много знает порой плохо спит, потому что отвечает не на поставленные вопросы.

Повторяюсь - в хелпе ни слова нет о том что  метод PositionClose на хеджевом счёте смотрит и за магиком тоже, поэтому надо либо исправить хелп, либо скорректировать указанную выше строку в библиотеке. Собвтенные мысли о том где что будет работать или нет можете оставить при себе.

 
Alexey Oreshkin:
Начнём с того что всё закрывается на ура. Хотя в рабочих экспертах использую немного другую конструкцию для закрытия всего.

Согласен со всем. Но пример не для олимпиады по программированию, а показывавший  конкретную багу которую нужно исправить и чем проще он будет показан тем быстрее и до большего числа людей он будет понятней, но оказалось что отвечать стали на те вопросы которые я, как тс, не задавал и ответы на них меня не интересуют.

Тот кто много знает порой плохо спит, потому что отвечает не на поставленные вопросы.

Повторяюсь - в хелпе ни слова нет о том что  метод PositionClose на хеджевом счёте смотрит и за магиком тоже, поэтому надо либо исправить хелп, либо скорректировать указанную выше строку в библиотеке. Собвтенные мысли о том где что будет работать или нет можете оставить при себе.

Попробуйте так 
#include <Trade\Trade.mqh>
CTrade         Ctrd;
 
void OnStart()
   {      
      for(int i=PositionsTotal()-1;i>=0;i--) Ctrd.PositionCloseByTicket(PositionGetTicket(i));
   }
 
Sergey Gritsay:
Попробуйте так 
Да нет же, вопрос не в том что я не могу закрыть позиции, а в том что в стандартной библиотеке недоработка, вот и всё.
А предложенный вами вариант не будет работать на обычных счетах, не хеджевых.
Причина обращения: