PositionSelect()

 

 Из справки: 

PositionSelect

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

....

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

 

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

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

 

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

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

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

 

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

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

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

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

 
Integer писал(а)  :

 Из справки: 

 

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

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

 

 

 

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

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

                                   ....

                              }

 

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

 

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

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

                                   ....

                              }

 

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

 

 

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

 

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

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

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

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

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

 
voix_kas:

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

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

 

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

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

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

К сожалению, мы с Вами о разном говорим.

Повторю свой вопрос, можно ли строго утверждать, что следующая конструкция дает гарантированно верный ответ (три состояния)?:

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

К сожалению, мы с Вами о разном говорим.

Повторю свой вопрос, можно строго утверждать, что следующая конструкция дает гарантированно верный ответ (три состояния)?:

Гарантированно верный - не эмпирически, а теоретически (понятие более широкое). :-)

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

Но это все теория, а нам нужны практические доказательства...