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() непосредственно перед обращением за ними....(справка)
Спасибо. Если посмотрите код, то там так и происходит (подчеркнуто мной).
PositionGetSymbol
Возвращает символ соответствующей открытой позиции и автоматически выбирает позицию для дальнейшей работы с ней при помощи функций PositionGetDouble, PositionGetInteger, PositionGetString.
https://www.mql5.com/ru/docs/trading/positiongetsymbol
- www.mql5.com
В английской части форума есть тема: trade.PositionClose() is not working. Ситуация похожая, хотя там позиции закрываются через класс стандартной библиотеки CTrade::PositionClose - но в самом методе CTrade::PositionClose есть такой код:
ClearStructures();
do
{
//--- check
if(SelectPosition(symbol))
{
и сам метод CTrade::SelectPosition
Уточните, пожалуйста первые три строки из вкладки "Журнал", должно быть примерно так:
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
и укажите название сервера к которому подключаетесь, а также тип счёта: хедж или неттинг.
- www.mql5.com
В английской части форума есть тема: trade.PositionClose() is not working. Ситуация похожая, хотя там позиции закрываются через класс стандартной библиотеки CTrade::PositionClose - но в самом методе CTrade::PositionClose есть такой код:
ClearStructures();
do
{
//--- check
if(SelectPosition(symbol))
{
и сам метод CTrade::SelectPosition
Уточните, пожалуйста первые три строки из вкладки "Журнал", должно быть примерно так:
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 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 на демо счете не открылась одна позиция, но это уже другой вопрос, с которым еще надо разобраться).
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 - позиция не найдена.
При следующем запуске той же функции, терминал уже видит эту позицию и нормально ее отрабатывает. Но почему в первый раз он ее не видит?
Подготовьте, пожалуйста, пример который можно запустить.
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
Вы же самое главное утаили в коде - вы их закрываете дальше. А обход делает по списку снизу вверх - выдергиваете .
Это уже притча во языцах
Спасибо за подсказку. Я пытался найти обсуждение такой же проблемы где-то на форуме, но не нашел. Иначе бы не стал писать. Может быть стоит разъяснить это где-то, например в известной статье на эту тему: Ордера, позиции и сделки в МетаТрейдер 5.
https://www.mql5.com/ru/articles/211
- 2011.01.05
- //www.mql5.com/ru/users/MetaQuotes">
- www.mql5.com
Вы же самое главное утаили в коде - вы их закрываете дальше. А обход делает по списку снизу вверх - выдергиваете .
Это уже притча во языцах
Кстати, а из-за того, что я их закрываю, их номера как-то меняются? Где можно подробнее прочесть?
смещаются. Удаления/закрытия через цикл всегда с последней! Да, в примере Рашида i>=0 нужно. Иначе первую пропустите.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
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 - позиция не найдена.
При следующем запуске той же функции, терминал уже видит эту позицию и нормально ее отрабатывает. Но почему в первый раз он ее не видит?