PositionSelect() - страница 2

 
Interesting:

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

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

Что значит "ошибки исполнения не будет"?

Если софт грамотно написан (а я считаю, что МетаКвоты в этом плане молодцы), клиент при отработке данного запроса на сервер должен обязательно дождаться ответа: либо явно "есть позиция", либо явно "нет позиции".

Если ответа клиент не получает, то ошибка запроса просто обязана быть зарегистрирована! Какая именно ошибка - вопрос вне данной дискуссии. Но явно клиент должен знать: получил ответ от сервера или нет. Если ответа нет - регистрирует ошибку, если ответ пришел, регистрации ошибки исполнения не происходит и мы получаем гарантированный ответ сервера.

 

Равно как и в соседней теме, убедительно прошу разработчиков дать однозначный ответ: конструкция гарантирует достоверность ответа или нет?

 
voix_kas:

Что значит "ошибки исполнения не будет"?

Если софт грамотно написан (а я считаю, что МетаКвоты в этом плане молодцы), клиент при отработке данного запроса на сервер должен обязательно дождаться ответа: либо явно "есть позиция", либо явно "нет позиции".

Если ответа клиент не получает, то ошибка запроса просто обязана быть зарегистрирована! Какая именно ошибка - вопрос вне данной дискуссии. Но явно клиент должен знать: получил ответ от сервера или нет. Если ответа нет - регистрирует ошибку, если ответ пришел, регистрации ошибки исполнения не происходит и мы получаем гарантированный ответ сервера.

 

Равно как и в соседней теме, убедительно прошу разработчиков дать однозначный ответ: конструкция гарантирует достоверность ответа или нет?

1. Все очень просто, в версии с булевым результатом теоретически false можно получить и по тайм-ауту.

При этом вроде как мы пытаемся поймать ошибку. Посмотрим какая это ошибка может быть: Ошибки компиляции - явно нет; предупреждение компилятора - тоже не то; Ошибки времени выполнения - может быть (но я лично ничего соответствующего там не нарыл); Коды возврата торгового сервера - так они к OrderSend() относятся и к нашей теме опять же никаким боком.

Так какую ошибку отлавливать будем?

2. Теперь о птичках. Читаем справку и видим там следующее

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

Хорошо, в принципе ошибку выполнения обнаружить и обработать можно. Но кто сказал что вылет по тайм-ауту будет являться ошибкой (Мы попытались, ничего не вышло).

Результат булевой логики не позволят точно узнать позиция отсутствует или функция просто не смогла ее вовремя (и правильно) обнаружить и корректно обработать.

3. Читаем дальше.

Примечание

Функция PositionSelect() копирует данные о позиции в программное окружение, и последующие вызовы PositionGetDouble(), PositionGetInteger() и PositionGetString() возвращают ранее скопированные данные. Это означает, что самой позиции может уже и не быть (или же она изменилась по объему, направлению и т.д.), а данные этой позиции можно еще получать. Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() непосредственно перед обращением за ними.

Думаю, что правильные выводы сделать не сложно (особенно учитывая примечание).

PS

Другое дело если вот этот вариант будет учтен разработчиками (или что-то в этом роде)

sergeev:

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

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

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

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

 
Interesting:

1. Все очень просто, в версии с булевым результатом теоретически false можно получить и по тайм-ауту.

При этом вроде как мы пытаемся поймать ошибку. Посмотрим какая это ошибка может быть: Ошибки компиляции - явно нет; предупреждение компилятора - тоже не то; Ошибки времени выполнения - может быть (но я лично ничего соответствующего там не нарыл); Коды возврата торгового сервера - так они к OrderSend() относятся и к нашей теме опять же никаким боком.

Так какую ошибку отлавливать будем?

2. Теперь о птичках. Читаем справку и видим там следующее

Хорошо, в принципе ошибку выполнения обнаружить и обработать можно. Но кто сказал что вылет по тайм-ауту будет являться ошибкой (Мы попытались, ничего не вышло).

Результат булевой логики не позволят точно узнать позиция отсутствует или функция просто не смогла ее вовремя (и правильно) обнаружить и корректно обработать.

3. Читаем дальше.

Думаю, что правильные выводы сделать не сложно (особенно учитывая примечание).

PS

Другое дело если вот этот вариант будет учен разработчиками (или что-то в этом роде)

Либо вариант sergeev, либо гарантированная генерация ошибки при отсутствии однозначного ответа от сервера.
 
voix_kas:
Либо вариант sergeev, либо гарантированная генерация ошибки при отсутствии однозначного ответа от сервера.

Даже если сменить логику с булевой на +1/0/-1 (как предложил Sergeev) если я правильно понимаю мы только от тайм-аута избавимся по большому счету.

А вот это примечание еще долго будет в силе, при любом раскладе

Примечание

Функция PositionSelect() копирует данные о позиции в программное окружение, и последующие вызовы PositionGetDouble(), PositionGetInteger() и PositionGetString() возвращают ранее скопированные данные. Это означает, что самой позиции может уже и не быть (или же она изменилась по объему, направлению и т.д.), а данные этой позиции можно еще получать. Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() непосредственно перед обращением за ними.

Тут ключевой момент - Даже если вернется true либо +1 (в зависимости от реализации) - это совсем не означает что сразу после удачного выполнения запроса позиция не перестала существовать.

При работе с рынка, рядом с ценой открытия/закрытия позиции, либо при работе нескольких стратегий на символе, следует помнить, что даже успешное выполнение не гарантирует существования позиции уже в следующий момент времени (даже не тик). Позиция может измениться либо и вовсе перестать существовать!

 
voix_kas:

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

нельзя. полную гарантию может дать только страховой полис)

Например: PositionSelect() при срабатывании sl или tp может возвратить true. Т.е. возможно получение данных о уже не существующей позиции.

 
Swan:

нельзя. полную гарантию может дать только страховой полис)

Например: PositionSelect() при срабатывании sl или tp может возвратить true. Т.е. возможно получение данных о уже не существующей позиции.


Я об этом уже 10-тый пост пишу :)
 

Ребят, не хочу показаться неуважительным. Предлагаю не превращать обсуждение серьезного вопроса в фарс.

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

 
voix_kas:

Ребят, не хочу показаться неуважительным. Предлагаю не превращать обсуждение серьезного вопроса в фарс.

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

Еще раз о птичках (ключевые слова выделены).

Примечание

Функция PositionSelect() копирует данные о позиции в программное окружение, и последующие вызовы PositionGetDouble(), PositionGetInteger() и PositionGetString() возвращают ранее скопированные данные. Это означает, что самой позиции может уже и не быть (или же она изменилась по объему, направлению и т.д.), а данные этой позиции можно еще получать. Для гарантированного получения свежих данных о позиции рекомендуется вызывать функцию PositionSelect() непосредственно перед обращением за ними.

Все что хотели сказать разработчики по этому поводу они уже сказали, в примечании к функции PositionSelect().

Если есть дополнительные пожелания то пишем о них тут, либо в СД (если есть конкретные предложения и аргументация по ним).

 
voix_kas:

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

Конкретный момент времени - приход тика, цена которого равна sl или tp. PositionSelect() в это время(на этом тике) может возвратить true.

 

Давайте разделим момент открытия (закрытия) позиции на сервере (или совершения сделки, что и является фактом открытия, закрытия или изменения позиции) и моментом того же изменения её в терминале. Ясно, что первый всегда раньше второго (хотя бы из-за задержек связи). А вот какое время может быть между этими событиями, остаётся только гадать, так как мы не знаем, как обновляется торговая информация в терминале (По крайней мере, я не помню такого ни в документации, ни в статьях, может быть пропустил). Ценовая информация обновляется с приходом нового тика. А вот когда именно обновляется торговая информация (при установке ордеров, совершении сделок) не ясно. Возможно, с приходом соответствующего сообщения о событии с сервера, возможно, оно ставится в очередь, и ждёт своей очереди обработки.

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

Попробуйте меня в этом разубедить !

Причина обращения: