Стоит ли проверять каждую операцию, выполнена ли она?

 
 Уже неоднократно обращаю внимания, что многие функции, например, PositionGetString дублируются. Один вариант возвращает значение. а другой это же значение, только через параметр, а посредством типа факт успешности выполнения. Но, я ни разу не встречал ни в статьях, ни в коде, что бы кто-то проверял получение из каждой функции успешность её выполнения. Оно вообще нужно или нет? Бывали ли у кого-нибудь ситуации когда эти функции не возвращали ничего?
 
for( int cnt=0; cnt<PositionsTotal(); cnt++)
{
     if( PositionGetTicket( cnt ) == 0 )                   continue;
     if( PositionGetString(POSITION_SYMBOL) ) != _Symbol ) continue;
     /* что-то делаем */
}
for( int cnt=0; cnt<PositionsTotal(); cnt++)
{
     if( PositionGetSymbol( cnt ) != _Symbol ) continue;
     /* что-то делаем */
}

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

 
Konstantin Nikitin:

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

Konstantin Nikiti, Вы не внимательно прочитали мой вопрос. Вот смотрите на Вашем примере:

if( PositionGetString(POSITION_SYMBOL) ) != _Symbol ) continue;

Здесь используется первый вариант получения символа функцией PositionGetString(), возвращающий string как тип. Но есть и другой, возвращающий тип boolean. И в справке написано, что Тру вернётся только, если функция выполнена успешно. Я делаю вывод, что функция может выполнится не успешно. Я прав? Тогда первый вариант вызова, который используется у Вас в коде не совсем актуален, т.к. не гарантирует факт того, что символ торгуемого инструмента получен вообще...

 
hoz:

Konstantin Nikiti, Вы не внимательно прочитали мой вопрос. Вот смотрите на Вашем примере:

Здесь используется первый вариант получения символа функцией PositionGetString(), возвращающий string как тип. Но есть и другой, возвращающий тип boolean.

Если вы имели ввиду PositionSelect, то там есть подводный камень в виде примечания, которое стоит почитать.

hoz:

Konstantin Nikiti,
Тогда первый вариант вызова, который используется у Вас в коде не совсем актуален, т.к. не гарантирует факт того, что символ торгуемого инструмента получен вообще...

PositionGetTicket

Возвращаемое значение

Тикет позиции. В случае неудачного выполнения возвращает 0.
Если вы имели ввиду эту разницу
string symbol,
       _symbol = PositionGetString( POSITION_SYMBOL );
bool result =  PositionGetString( POSITION_SYMBOL, symbol);
Так это вообще не вопрос. Все зависит от ситуации как использовать. Даже внимания ни когда не обращаю на это, использую как мне удобней.
 
Хотя, действительно, я этот момент прочёл между строк. Что бы гарантированно получить свойства нужно лишь использовать PositionSelect(). Вопрос снял. Благодарю за подсказку!
 
hoz:
Хотя, действительно, я этот момент прочёл между строк. Что бы гарантированно получить свойства нужно лишь использовать PositionSelect(). Вопрос снял. Благодарю за подсказку!

Прочитайте внимательно примечание PositionSelect, чтоб потом не возникли проблемы, что работает не со всеми позициями.

 
hoz:
 Уже неоднократно обращаю внимания, что многие функции, например, PositionGetString дублируются. Один вариант возвращает значение. а другой это же значение, только через параметр, а посредством типа факт успешности выполнения. Но, я ни разу не встречал ни в статьях, ни в коде, что бы кто-то проверял получение из каждой функции успешность её выполнения. Оно вообще нужно или нет? Бывали ли у кого-нибудь ситуации когда эти функции не возвращали ничего?

Если ошибка гипотетически может произойти, то она произойдёт обязательно.

поэтому всегда надо проверять всё что только можно проверить и никогда нельзя доверять никому/ничему.

 
Konstantin Nikitin:

Прочитайте внимательно примечание PositionSelect, чтоб потом не возникли проблемы, что работает не со всеми позициями.

Прочитал. Кстати, а "неттинговый" учёт позиций до сих пор актуален? Я некоторых ДЦ проверял, так там открываться можно в любую сторону т.е. хеджирование есть и позиции не суммируются. Я так понимаю, можно работать только с ордерами, а позиции как таковые в данном случае не актуальны.

 
hoz:
 Уже неоднократно обращаю внимания, что многие функции, например, PositionGetString дублируются. Один вариант возвращает значение. а другой это же значение, только через параметр, а посредством типа факт успешности выполнения. Но, я ни разу не встречал ни в статьях, ни в коде, что бы кто-то проверял получение из каждой функции успешность её выполнения. Оно вообще нужно или нет? Бывали ли у кого-нибудь ситуации когда эти функции не возвращали ничего?

Я ВСЕГДА использую только вариант, возвращающий признак выполнения.

И ВСЕГДА проверяю коды возврата.

Считаю, что проверка возвращаемых значений и обработка ошибок - это важнейшая часть кода.

 
Konstantin Nikitin:

Прочитайте внимательно примечание PositionSelect, чтоб потом не возникли проблемы, что работает не со всеми позициями.

То есть как это "не со всеми" ???

А с какими не работает ?

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

 

Самое неприятное, что даже если выполнение PositionSelect, OrderSend и иже с ними подтверждено, это не гарантирует того, что результат верный. 

Столкнулся с этим, когда делал высокочастотного робота. Причина - терминал не успевает обновлять список ордеров у себя в памяти. Например, в его перечне может встретиться одновременно отложка и результат её активации. Либо при успешном PositionSelect и последующей попытке его закрыть - сервер возвращает, что ордера уже нет.

Пришлось подставлять костыль в виде цикла, который ожидает когда тикет действительно пропадёт из перечня. (С отложкой не нашёл хорошего решения).

Справедливости ради, скажу, что на домашнем терминале всё работало отлично, а повылазило вышеописанное на VPS с пингом менее 1мс и быстрым исполнением (порядка 15мс).

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