Новая версия платформы MetaTrader 5 build 2190 - страница 45

 
Alexey Viktorov:

В отладчике идентификатор позиции равен НУЛЮ, но выбрать сделки по этому идентификатору, пожалуйста...

Балансовые сделки выбираются. Все в порядке.

 
Ilyas:

Добавьте пожалуйста вывод posID через Print

Какое значение распечатается ?

Печатает тоже ноль.

Print("posID = ", posID);
2019.11.28 19:29:38.744 2018.08.10 10:00:00   posID = 0

Но я в своей проблеме разобрался.

Если я правильно помню, то некоторое время назад сделка в OnTradeTransaction была выбрана автоматом. Либо не закрывалось несколько позиций в цикле, поэтому всё проходило нормально... Теперь чтобы получить идентификатор позиции по тикету сделки, её, сделку сначала надо выбрать функцией HistoryDealSelect(trans.deal);

 
fxsaber:

Балансовые сделки выбираются. Все в порядке.

Балансовая сделка имеет тикет 1


 
Alexey Viktorov:

Балансовая сделка имеет тикет 1

Именно это значение вернет HistoryDealGetTicket(0).

 
fxsaber:

Именно это значение вернет HistoryDealGetTicket(0).

Нет. На снимке видно, что тикет сделки trans.deal = 16 и, если не ошибаюсь, никаким боком тут нулевой в списке. Как-бы там ни было, но при ID позиции равной нулю, выбрать ордера или сделки не может быть возможности. Нумерация всех позиций, сделок или ордеров начинается с единицы.

 
Alexey Viktorov:

Нет. На снимке видно, что тикет сделки trans.deal = 16 и, если не ошибаюсь, никаким боком тут нулевой в списке. Как-бы там ни было, но при ID позиции равной нулю, выбрать ордера или сделки не может быть возможности. Нумерация всех позиций, сделок или ордеров начинается с единицы.

Вы бы хотя бы проверяли.

void OnStart()
{
  if (HistorySelectByPosition(0))
    Print(HistoryDealGetTicket(0));
}
 
fxsaber:

Вы бы хотя бы проверяли.

Я не понимаю как это соотносится с тем кодом о котором идёт речь. Позиция закрылась. Мне надо получить ID этой позиции используя тикет сделки которая её закрыла. Тикет сделки 16. По этому тикету я получаю ID = 0. Но это пол-беды, беда в том, что имея ID позиции ноль, что априори быть не может, тем-не менее какие-то сделки по ID позиции равной нулю выбираются.

Поймите пожалуйста, что индекс позиции или сделки нигде не используется. Используются только тикеты и ID.

 
Alexey Viktorov:

Я не понимаю как это соотносится с тем кодом о котором идёт речь. Позиция закрылась. Мне надо получить ID этой позиции используя тикет сделки которая её закрыла. Тикет сделки 16. По этому тикету я получаю ID = 0. Но это пол-беды, беда в том, что имея ID позиции ноль, что априори быть не может, тем-не менее какие-то сделки по ID позиции равной нулю выбираются.

Поймите пожалуйста, что индекс позиции или сделки нигде не используется. Используются только тикеты и ID.

Нулевой ID получаете, потому что не выбрали сделку 16 для работы с ее историей. Делайте сначала HistoryDealSelect..

Выбор сделок по нулевому ID, что делается дальше, отрабатывает правильно - идет выбор балансовых сделок.

Документация по MQL5: Торговые функции / HistoryDealSelect
Документация по MQL5: Торговые функции / HistoryDealSelect
  • www.mql5.com
Выбирает в истории сделку для дальнейших обращений к ней  через соответствующие функции. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError(). Не следует путать между собой ордера, сделки и позиции. Каждая сделка...
 
fxsaber:

Нулевой ID получаете, потому что не выбрали сделку 16 для работы с ее историей. Делайте сначала HistoryDealSelect..

Выбор сделок по нулевому ID, что делается дальше, отрабатывает правильно - идет выбор балансовых сделок.

Я это и сделал

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 2190

Alexey Viktorov, 2019.11.28 17:38

Печатает тоже ноль.

Print("posID = ", posID);
2019.11.28 19:29:38.744 2018.08.10 10:00:00   posID = 0

Но я в своей проблеме разобрался.

Если я правильно помню, то некоторое время назад сделка в OnTradeTransaction была выбрана автоматом. Либо не закрывалось несколько позиций в цикле, поэтому всё проходило нормально... Теперь чтобы получить идентификатор позиции по тикету сделки, её, сделку сначала надо выбрать функцией HistoryDealSelect(trans.deal);


 
Alexey Viktorov:

Я это и сделал

Выходит, все работает правильно.