Терминал не видит позицию

 
    positions = PositionsTotal();
    if(positions == 0) return(true);
    for(int i=0; i < positions; i++)//for every position open
      {
       position_symbol = PositionGetSymbol(i);
       ticket = PositionGetInteger(POSITION_TICKET);

Есть три открытых позиции, PositionsTotal() возвращает 3.

Соответственно три прохода цикла. На третьем проходе (i = 2) функция PositionGetSymbol() возвращает пустую строку. Ошибка 4753 - позиция не найдена.

При следующем запуске той же функции, терминал уже видит эту позицию и нормально ее отрабатывает. Но почему в первый раз он ее не видит? 

 
Oleg Shenker:
    positions = PositionsTotal();
    if(positions == 0) return(true);
    for(int i=0; i < positions; i++)//for every position open
      {
       position_symbol = PositionGetSymbol(i);
       ticket = PositionGetInteger(POSITION_TICKET);

Есть три открытых позиции, PositionsTotal() возвращает 3.

Соответственно три прохода цикла. На третьем проходе (i = 2) функция PositionGetSymbol() возвращает пустую строку. Ошибка 4753 - позиция не найдена.

При следующем запуске той же функции, терминал уже видит эту позицию и нормально ее отрабатывает. Но почему в первый раз он ее не видит? 

Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() непосредственно перед обращением за ними....(справка)
 
Alekseu Fedotov:
Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() непосредственно перед обращением за ними....(справка)

Спасибо. Если посмотрите код, то там так и происходит (подчеркнуто мной).

 

PositionGetSymbol

Возвращает символ соответствующей открытой позиции и автоматически выбирает позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString. 

 

https://www.mql5.com/ru/docs/trading/positiongetsymbol 

Документация по MQL5: Торговые функции / PositionGetSymbol
Документация по MQL5: Торговые функции / PositionGetSymbol
  • www.mql5.com
Торговые функции / PositionGetSymbol - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

В английской части форума есть тема: trade.PositionClose() is not working. Ситуация похожая, хотя там позиции закрываются через класс стандартной библиотеки CTrade::PositionClose - но в самом методе CTrade::PositionClose есть такой код:

//--- clean
   ClearStructures();
   do
     {
      //--- check
      if(SelectPosition(symbol))
        {

и сам метод CTrade::SelectPosition

Уточните, пожалуйста первые три строки из вкладки "Журнал", должно быть примерно так:

2016.10.28 08:25:41.372 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
2016.10.28 08:25:41.374 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 3698 / 8077 Mb, HDD: 38140 / 233310 Mb, GMT+02:00
2016.10.28 08:25:41.374 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

и укажите название сервера к которому подключаетесь, а также тип счёта: хедж или неттинг.

trade.PositionClose() is not working
trade.PositionClose() is not working
  • www.mql5.com
Hello Friends I have a interesting problem. This is my source code. This codes are work when i use it in mql5 script file...
 
Vladimir Karputov:

В английской части форума есть тема: trade.PositionClose() is not working. Ситуация похожая, хотя там позиции закрываются через класс стандартной библиотеки CTrade::PositionClose - но в самом методе CTrade::PositionClose есть такой код:

//--- clean
   ClearStructures();
   do
     {
      //--- check
      if(SelectPosition(symbol))
        {

и сам метод CTrade::SelectPosition

Уточните, пожалуйста первые три строки из вкладки "Журнал", должно быть примерно так:

2016.10.28 08:25:41.372 Terminal        MetaTrader 5 x64 build 1455 started (MetaQuotes Software Corp.)
2016.10.28 08:25:41.374 Terminal        Windows 10 Pro (x64 based PC), IE 11.00, UAC, Intel Core i3-3120M  @ 2.50GHz, RAM: 3698 / 8077 Mb, HDD: 38140 / 233310 Mb, GMT+02:00
2016.10.28 08:25:41.374 Terminal        C:\Users\KVN\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075

и укажите название сервера к которому подключаетесь, а также тип счёта: хедж или неттинг.

2016.10.25 13:19:58.053 Terminal        C:\Users\James Paul AV\AppData\Roaming\MetaQuotes\Terminal\9DF863192B2256668BB7189BB5EA0122
2016.10.25 13:19:58.053 Terminal        Windows 7 Professional (x64 based PC), IE 11.00, UAC, Intel Xeon  E5-1607 v2 @ 3.00GHz, RAM: 4465 / 16328 Mb, HDD: 777538 / 941785 Mb, GMT+01:00
2016.10.25 13:19:58.051 Terminal        MetaTrader 5 (VTB24) x64 build 1455 started (Банк ВТБ 24 (публичное акционерное общество))

Тип счета - неттинг. Название сервера VTB24.

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

 
Oleg Shenker:
    positions = PositionsTotal();
    if(positions == 0) return(true);
    for(int i=0; i < positions; i++)//for every position open
      {
       position_symbol = PositionGetSymbol(i);
       ticket = PositionGetInteger(POSITION_TICKET);

Есть три открытых позиции, PositionsTotal() возвращает 3.

Соответственно три прохода цикла. На третьем проходе (i = 2) функция PositionGetSymbol() возвращает пустую строку. Ошибка 4753 - позиция не найдена.

При следующем запуске той же функции, терминал уже видит эту позицию и нормально ее отрабатывает. Но почему в первый раз он ее не видит? 

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

 
Oleg Shenker:
    positions = PositionsTotal();
    if(positions == 0) return(true);
    for(int i=0; i < positions; i++)//for every position open
      {
       position_symbol = PositionGetSymbol(i);
       ticket = PositionGetInteger(POSITION_TICKET);

Есть три открытых позиции, PositionsTotal() возвращает 3.

Соответственно три прохода цикла. На третьем проходе (i = 2) функция PositionGetSymbol() возвращает пустую строку. Ошибка 4753 - позиция не найдена.

При следующем запуске той же функции, терминал уже видит эту позицию и нормально ее отрабатывает. Но почему в первый раз он ее не видит? 

Вы же самое главное утаили в коде - вы их закрываете дальше. А обход делает по списку снизу вверх - выдергиваете .

Это уже притча во языцах

for(int i=positions-1; i >0; i--)//for every position open

 
Rashid Umarov:

Вы же самое главное утаили в коде - вы их закрываете дальше. А обход делает по списку снизу вверх - выдергиваете .

Это уже притча во языцах

Спасибо за подсказку. Я пытался найти обсуждение такой же проблемы где-то на форуме, но не нашел. Иначе бы не стал писать. Может быть стоит разъяснить это где-то, например в известной статье на эту тему: Ордера, позиции и сделки в МетаТрейдер 5.

https://www.mql5.com/ru/articles/211 

Ордерa, позиции и сделки в MetaTrader 5
Ордерa, позиции и сделки в MetaTrader 5
  • 2011.01.05
  • //www.mql5.com/ru/users/MetaQuotes">
  • www.mql5.com
Надежный торговый робот не может быть создан без понимания механизмов работы торговой системы MetaTrader 5. Клиентский терминал получает от торгового сервера информацию о позициях, ордерах и сделках. Чтобы правильно обработать эти данные средствами MQL5 необходимо хорошо представлять как происходит взаимодействие mql5-программы и среды исполнения терминала.
 
Rashid Umarov:

Вы же самое главное утаили в коде - вы их закрываете дальше. А обход делает по списку снизу вверх - выдергиваете .

Это уже притча во языцах

Кстати, а из-за того, что я их закрываю, их номера как-то меняются? Где можно подробнее прочесть?
 
Oleg Shenker:
Кстати, а из-за того, что я их закрываю, их номера как-то меняются? Где можно подробнее прочесть?
смещаются. Удаления/закрытия через цикл всегда с последней! Да, в примере Рашида i>=0 нужно. Иначе первую пропустите.
 
Alexey Kozitsyn:
смещаются. Удаления/закрытия через цикл всегда с последней! Да, в примере Рашида i>=0 нужно. Иначе первую пропустите.
Спасибо!
Причина обращения: