Скачать MetaTrader 5

PositionSelect()

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Dmitry Fedoseev
43469
Dmitry Fedoseev 2010.04.26 20:02 

 Из справки: 

PositionSelect

Выбирает открытую позицию для дальнейшей работы с ней. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().

....

В случае неудачного выполнения функции по таймауту будет сгенерирована ошибка 4757.

 

Если нет открытой позиции функция возвращает false. Это кажется это неправильно. Если позиции нет, она должна выделяться, а потом объем смотреть, если объем 0 - значит нет позиции. А так как есть непонятно - нет ли позиции, или какие-то проблемы при попытке ее выделения.

Похоже, что функция не позволят подлинно определить налчие или отсутствие позиции.

MetaQuotes
Админ
25027
Renat Fatkhullin 2010.04.26 20:10  

В результате нужно будет делать еще одно сравнение, да еще иметь потенциальную засаду с пустыми значениями, которые неминуемо будут пытаться использовать без проверок?

Функция очень удобна и хорошо подходит для быстрого определения наличия открытой позиции.

Чтобы словить false по таймауту, надо очень сильно постараться (фактически это означает самые серьезные сетевые проблемы и неинициализированность торговой части терминала).

o_o
Модератор
23862
o_o 2010.04.26 20:11  

ну или как вариант сделать возврат не true/false, а -1/0/1

-1 - если неудача

0 - если удачно, но позиций нет

1 - если удачно и позиции есть.

Dimitar Manov
2761
Dimitar Manov 2010.04.26 20:11  
Integer писал(а)  :

 Из справки: 

 

Если нет открытой позиции функция возвращает false. Это кажется это неправильно. Если позиции нет, она должна выделяться, а потом объем смотреть, если объем 0 - значит нет позиции. А так как есть непонятно - нет ли позиции, или какие-то проблемы при попытке ее выделения.

Похоже, что функция не позволят подлинно определить налчие или отсутствие позиции.

 

 

 

for(int i=0;i<PositionsTotal();i++) 

    {if(PositionGetSymbol(i)==Sym){Volum=PositionGetDouble(POSITION_VOLUME);

                                   ....

                              }

 

Работает... :) 

 

Dmitry Fedoseev
43469
Dmitry Fedoseev 2010.04.27 11:22  
Manov:
for(int i=0;i<PositionsTotal();i++) 

    {if(PositionGetSymbol(i)==Sym){Volum=PositionGetDouble(POSITION_VOLUME);

                                   ....

                              }

 

Работает... :) 

 

 

Yes! Похоже то, что надо. 

voix_kas
681
voix_kas 2011.06.01 22:18  

Также задался этим вопросом.

К сожалению, ни PositionSelect(), ни конструкция Manov не дают гарантированного ответа "нет открытой позиции на данном символе".

Предлагаю к вашему вниманию и критике следующую конструкцию для гарантированного определения, есть или нет позиции:

ResetLastError(); // обнуляем код ошибки.
if (PositionSelect(_Symbol)) {
  // позиция гарантированно есть (volume > 0).
{
else {
  if (_LastError) {
    // произошла ошибка. неопределенная ситуация. можно зациклить данную конструкцию со "слипом" при попадании в данное ветвление логики.
  }
  else {
    // позиции гарантированно нет (volume = 0).
  }
}

 Прошу гуру и, в первую очередь, разработчиков критически оценить данную конструкцию. Достоверны ли ее выводы? Можно ли даже в теории смоделировать ситуацию, когда конструкция ошибется?

Vladimir Gomonov
8283
Vladimir Gomonov 2011.06.01 23:15  
voix_kas:

Также задался этим вопросом.

К сожалению, ни PositionSelect(), ни конструкция Manov не дают гарантированного ответа "нет открытой позиции на данном символе".

Предлагаю к вашему вниманию и критике следующую конструкцию для гарантированного определения, есть или нет позиции:

 Прошу гуру и, в первую очередь, разработчиков критически оценить данную конструкцию. Достоверны ли ее выводы? Можно ли даже в теории смоделировать ситуацию, когда конструкция ошибется?

Я больше года  использую  PositionSelect() для определения факта наличия открытой позиции. С проблемами пока не сталкивался.

Но всё же напрягает необходимость проверять ошибку на ровном месте.  Одобряю вариант Алекса Сергеева  (+1, 0, -1).

Vladimir Batrudinov
4928
Vladimir Batrudinov 2011.06.01 23:20  
MetaDriver:
Я больше года  использую  PositionSelect() для определения факта наличия открытой позиции. С проблемами пока не сталкивался.

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

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

Alexander Laur
7781
Alexander Laur 2011.06.01 23:22  
Integer:

 Из справки: 

 

Если нет открытой позиции функция возвращает false. Это кажется это неправильно. Если позиции нет, она должна выделяться, а потом объем смотреть, если объем 0 - значит нет позиции. А так как есть непонятно - нет ли позиции, или какие-то проблемы при попытке ее выделения.

Похоже, что функция не позволят подлинно определить налчие или отсутствие позиции.

 

 

 

Как можно выделить то, чего нет. Приведите пример для наглядности. Я тоже давно пользуюсь PositionSelect() и пока с проблемами определения наличия позиции не сталкивался.
voix_kas
681
voix_kas 2011.06.01 23:36  

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

Вот простой пример:

Каждый тик формирую прогноз и передаю его в торговую функцию.

Торговая функция при преодолении минимального порога этого значения:

1. ищет наличие открытой позиции.

2. если ее нет, открывает позицию.

 

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

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

Alexander Laur
7781
Alexander Laur 2011.06.01 23:44  
voix_kas:

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

Вот простой пример:

Каждый тик формирую прогноз и передаю его в торговую функцию.

Торговая функция при преодолении минимального порога этого значения:

1. ищет наличие открытой позиции.

2. если ее нет, открывает позицию.

 

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

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

На паре EURUSD порядка 67000 тиков в сутках. Если за такое количество тиков у Вас эксперт не может определить наличие открытой позиции, то дело не в PositionSelect().
123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий