Циклы и закрытие или удаление заказов - страница 2

 

Что произойдет, если OrderSelect не сможет выбрать заказ?
Условие OrderMagicNumber==MagicNo никогда не будет истинным. Поэтому нет необходимости проверять результат OrderSelect и продолжать, если он неверен.

Лучше, если вы хотите проверить OrderSelect, чтобы уменьшить переменную цикла. Пример:

for(PositionIndex = 0; PositionIndex < OrdersTotal() ; PositionIndex ++)  
   {
   if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }
 
  1. Если OrderSelect не сработает, вы можете получить магический номер последнего выбранного заказа или что-то оставшееся в памяти, и это может совпасть. Всегда проверяйте.
  2. Вы ВСЕГДА должны вести обратный отсчет. Предположим, пока вы работали над позицией 3, позиция 0 закрылась. Следующий ордер, над которым вы хотели поработать, был в позиции 4, но когда вы зациклитесь и увеличите positionIndex до 4, он будет в позиции 3. Теперь вы пропустили один. При обратном отсчете вы можете обработать тот же самый заказ во второй раз, но не пропустите ни одного.
 
WHRoeder:
  1. Если OrderSelect не сработает, вы можете получить магический номер последнего выбранного заказа или что-то оставшееся в памяти, и это может совпасть. Всегда проверяйте.
  2. Вы должны ВСЕГДА вести обратный отсчет. Предположим, пока вы работали над позицией 3, позиция 0 закрылась. Следующий заказ, над которым вы хотели поработать, был позицией 4, но он будет в позиции 3, когда вы зациклитесь и увеличите positionIndex до 4. Теперь вы пропустили один заказ. При обратном отсчете вы можете обработать тот же самый заказ во второй раз, но не пропустите ни одного.

1- Кто вам это сказал? И о какой памяти вы говорите?


2 - Я не упоминал отсчет вниз или вверх. В представленном коде нет отсчета вниз.

 
  1. OrderMagicNumber() и другие ВСЕГДА что-то возвращают. Если OrderSelect() не сработала, вы получаете случайный мусор, остатки, возможно, от предыдущего успешного выбора, возможно, значение из последнего закрытого заказа, возможно, то, что находится в регистре. Вы когда-нибудь пытались разыменовать указатель на удаленный объект? Память, это маленький черный чип на печатной плате. Попробуйте это
    int start(){    Print(Whatever()); }
    double Whatever(){
       for(i=0; i<10; i++) double tmp=Close[i];
       // no value returned
    }
    и выложите результаты.
  2. Я знаю, что "предоставленный код сам по себе не ведет отсчет". В этом и проблема. Всегда ведите обратный отсчет! Ваш декремент НЕ РАБОТАЕТ и является потенциальным бесконечным циклом.
    if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) { PositionIndex--; continue; }

 

Есть ли конкретная причина, по которой вы закодировали:

if( ! OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) ) continue;

вместо (?).

if( OrderSelect(PositionIndex, SELECT_BY_POS, MODE_TRADES) )
{
  // statements if true
}

Я знаю, что по некоторым стандартам кодирования это считается запретом. Дает ли это лучшую производительность или это просто предпочтение?

 
burgie:

Есть ли конкретная причина, по которой вы закодировали:

вместо (?).

Я знаю, что по некоторым стандартам кодирования это считается запретом. Дает ли это лучшую производительность или это просто предпочтение?

Никакой конкретной причины я не помню... Я не знаю, что логичнее всего сделать, почему OrderSelect() должен когда-нибудь не сработать? и если он сработает, что делать?
 
burgie:

Есть ли конкретная причина, по которой вы закодировали:

вместо (?).

Я знаю, что по некоторым стандартам кодирования это считается запретом. Дает ли это лучшую производительность или это просто предпочтение?


Внутри цикла все точно так же, выбирайте, что вам больше нравится.
 
burgie:

Есть ли конкретная причина, по которой вы закодировали:

вместо (?).

Я знаю, что по некоторым стандартам кодирования это считается запретом. Дает ли это лучшую производительность или это просто предпочтение?

 

if(orderselect(......)) execute this //--- no going back

if(!orderselect(.......))continue //- вернуться и проверить

 
MirTD:

if(orderselect(......)) execute this //--- no going back

if(!orderselect(.......))continue //- вернуться и проверить

Я уже ответил на вопрос, который мне задали по поводу моего кодирования...