В результате нужно будет делать еще одно сравнение, да еще иметь потенциальную засаду с пустыми значениями, которые неминуемо будут пытаться использовать без проверок?
Функция очень удобна и хорошо подходит для быстрого определения наличия открытой позиции.
Чтобы словить false по таймауту, надо очень сильно постараться (фактически это означает самые серьезные сетевые проблемы и неинициализированность торговой части терминала).
ну или как вариант сделать возврат не true/false, а -1/0/1
-1 - если неудача
0 - если удачно, но позиций нет
1 - если удачно и позиции есть.
Из справки:
Если нет открытой позиции функция возвращает false. Это кажется это неправильно. Если позиции нет, она должна выделяться, а потом объем смотреть, если объем 0 - значит нет позиции. А так как есть непонятно - нет ли позиции, или какие-то проблемы при попытке ее выделения.
Похоже, что функция не позволят подлинно определить налчие или отсутствие позиции.
{if(PositionGetSymbol(i)==Sym){Volum=PositionGetDouble(POSITION_VOLUME);
....
}
Работает... :)
{if(PositionGetSymbol(i)==Sym){Volum=PositionGetDouble(POSITION_VOLUME);
....
}
Работает... :)
Yes! Похоже то, что надо.
Также задался этим вопросом.
К сожалению, ни PositionSelect(), ни конструкция Manov не дают гарантированного ответа "нет открытой позиции на данном символе".
Предлагаю к вашему вниманию и критике следующую конструкцию для гарантированного определения, есть или нет позиции:
ResetLastError(); // обнуляем код ошибки. if (PositionSelect(_Symbol)) { // позиция гарантированно есть (volume > 0). { else { if (_LastError) { // произошла ошибка. неопределенная ситуация. можно зациклить данную конструкцию со "слипом" при попадании в данное ветвление логики. } else { // позиции гарантированно нет (volume = 0). } }
Прошу гуру и, в первую очередь, разработчиков критически оценить данную конструкцию. Достоверны ли ее выводы? Можно ли даже в теории смоделировать ситуацию, когда конструкция ошибется?
Также задался этим вопросом.
К сожалению, ни PositionSelect(), ни конструкция Manov не дают гарантированного ответа "нет открытой позиции на данном символе".
Предлагаю к вашему вниманию и критике следующую конструкцию для гарантированного определения, есть или нет позиции:
Прошу гуру и, в первую очередь, разработчиков критически оценить данную конструкцию. Достоверны ли ее выводы? Можно ли даже в теории смоделировать ситуацию, когда конструкция ошибется?
Я больше года использую PositionSelect() для определения факта наличия открытой позиции. С проблемами пока не сталкивался.
Но всё же напрягает необходимость проверять ошибку на ровном месте. Одобряю вариант Алекса Сергеева (+1, 0, -1).
Я больше года использую PositionSelect() для определения факта наличия открытой позиции. С проблемами пока не сталкивался.
Аналогично, даже представить страшно что должно произойти при разумной и корректной работе совы чтобы нарваться на подобную проблему.
За плохой нет сказать не могу, при всех проблемах с нетом которые я имел за последний год к качеству связи с торговым сервером по большому счету вопросов нет.
Прошу не считать меня параноиком, но если данная брешь имеется, грамотный код должен ее учитывать.
Вот простой пример:
Каждый тик формирую прогноз и передаю его в торговую функцию.
Торговая функция при преодолении минимального порога этого значения:
1. ищет наличие открытой позиции.
2. если ее нет, открывает позицию.
Так вот, неправильная интерпретация результата наличия открытой позиции может сказаться на результатах торговли. А если шанс есть, он обязательно будет.
Говорить "сколько пользуюсь, никогда не сталкивался" - отчасти дилетантский подход. Не укора ради говорю, алгоритмизация должна быть четкой.
На паре EURUSD порядка 67000 тиков в сутках. Если за такое количество тиков у Вас эксперт не может определить наличие открытой позиции, то дело не в PositionSelect().
К сожалению, мы с Вами о разном говорим.
Повторю свой вопрос, можно ли строго утверждать, что следующая конструкция дает гарантированно верный ответ (три состояния)?:
ResetLastError(); // обнуляем код ошибки. if (PositionSelect(_Symbol)) { // позиция гарантированно есть (volume > 0). { else { if (_LastError) { // произошла ошибка. неопределенная ситуация. можно зациклить данную конструкцию со "слипом" при попадании в данное ветвление логики. } else { // позиции гарантированно нет (volume = 0).} }Гарантированно верный - не эмпирически, а теоретически (понятие более широкое). :-)
К сожалению, мы с Вами о разном говорим.
Повторю свой вопрос, можно строго утверждать, что следующая конструкция дает гарантированно верный ответ (три состояния)?:
Гарантированно верный - не эмпирически, а теоретически (понятие более широкое). :-)Нет не дает. Поскольку теоретически при открытой позиции (если мы все параноики) функция может вернуть false и это никак не обнаружится (ошибки исполнения не будет).
Но это все теория, а нам нужны практические доказательства...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Из справки:
PositionSelect
Выбирает открытую позицию для дальнейшей работы с ней. Возвращает true при успешном завершении функции. Возвращает false при неудачном завершении функции. Чтобы получить информацию об ошибке, необходимо вызвать функцию GetLastError().
....
В случае неудачного выполнения функции по таймауту будет сгенерирована ошибка 4757.
Если нет открытой позиции функция возвращает false. Это кажется это неправильно. Если позиции нет, она должна выделяться, а потом объем смотреть, если объем 0 - значит нет позиции. А так как есть непонятно - нет ли позиции, или какие-то проблемы при попытке ее выделения.
Похоже, что функция не позволят подлинно определить налчие или отсутствие позиции.