Скачать MetaTrader 5

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

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

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

#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 и ни слова не видим про магик.
Вывод: либо в библиотеке убрать проверку магика либо написать об этом в хелпе.
Или я что то неправильно понимаю ?

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

Dmitry Fedoseev
44531
Dmitry Fedoseev  
Alexey Oreshkin:

...

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

...

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

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

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

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

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

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

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

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

Dmitry Fedoseev
44531
Dmitry Fedoseev  
George Merts:

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

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

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

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

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

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

George Merts
4005
George Merts  
Dmitry Fedoseev:
 

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

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

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

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

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

Dmitry Fedoseev
44531
Dmitry Fedoseev  

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

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

Alexey Volchanskiy
18701
Alexey Volchanskiy  
George Merts:

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

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

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

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

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

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

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

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

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

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

Dmitry Fedoseev:

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

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

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

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

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

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

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

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

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

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