Почему функция не выполняется до конца?

 

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

void ClosePosBy()//закрытие перекрытых ордеров
{
int longticket = -1;
   int shortticket = -1;
   int longlots = 0;
   int shortlots = 0;
   int total = OrdersTotal();   
//----
   for(int i = total - 1; i >= 0; i--) {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
       // check for symbol & magic number
       if(OrderSymbol() == Symbol()) {
         // check for long opened position
         if (OrderType() == OP_BUY) {
            longticket = OrderTicket();
            longlots = OrderLots();
         }
         // check for short opened position
         if (OrderType() == OP_SELL) {
            shortticket = OrderTicket();
            shortlots = OrderLots();
         }
       }
   }
   // check for trade allowed
   if(IsTradeAllowed()) {
       RefreshRates();
   } else {
       return(0);
   }
   
   // Close by
   if ((longticket >= 0) && (shortticket > 0)) {
      if (longlots > shortlots) {
         if (! OrderCloseBy(longticket, shortticket, Red)) {
            Sleep(15000);
         }
      } else {
         if (! OrderCloseBy(shortticket, longticket, Blue)) {
            Sleep(15000);
         }
      }
   }
}
 
TheXpert писал(а) >>
Странный вопрос -- в функции запрограммировано однократное удаление.
Зациклите до тех пор, пока один из тикетов не будет невалидным. И будет Вам щасте.


Спасибо. Виноват, не заметил одну скобку.
 

Вот так вроде нормально. Функция Решетова, сразу не врубился.

void ClosePosBy()//закрытие перекрытых ордеров
{
   int longticket = -1;
   int shortticket = -1;
   int longlots = 0;
   int shortlots = 0;
// check for opened position
   int total = OrdersTotal();   
//----
   bool end;   
   while(!end){      
   for(int i = total - 1; i >= 0; i--) {
       OrderSelect(i, SELECT_BY_POS, MODE_TRADES); 
       // check for symbol & magic number
       if(OrderSymbol() == Symbol()) {
         // check for long opened position
         if (OrderType() == OP_BUY) {
            longticket = OrderTicket();
            longlots = OrderLots();
         }
         // check for short opened position
         if (OrderType() == OP_SELL) {
            shortticket = OrderTicket();
            shortlots = OrderLots();
         }
       }
    }
   // check for trade allowed
   if(IsTradeAllowed()) {
       RefreshRates();
   } else {
       return(0);
   }
   
   // Close by
   
   if ((longticket >= 0) && (shortticket > 0)) {
      if (longlots > shortlots) {
         if (! OrderCloseBy(longticket, shortticket, Red)) {
            Sleep(1000);
         }
      } else {
         if (! OrderCloseBy(shortticket, longticket, Blue)) {
            Sleep(1000);
         }
      if((shortlots==0 && longlots!=0) || (shortlots!=0 && longlots==0))
      {
       end=true;
      }
      }
   }
}
}

	          
 
Нет. переменные надо инициализировать перед каждым прогоном, а сейчас только в начале функции.
 
TheXpert писал(а) >>
Нет. переменные надо инициализировать перед каждым прогоном, а сейчас только в начале функции.


А на демке закрывает нормально.
 
khorosh >>:

Вот так вроде нормально.

ИМХО - не совсем.  Лучше перенести определение количества открытых

int total = OrdersTotal();  

  внутрь "вайл", как и остальных переменных. 

И еще: после первого удаления будет пауза и по условию 

// check for trade allowed
if(IsTradeAllowed()) {
RefreshRates();
} else {
return(0);
}
 
можно вылететь из функции.
Лучше так:

int n=0;
while(!IsTradeAllowed()&& n<limit) {Sleep(500);n++;}
RefreshRates();

Удачи.
ЗЫ уже ответили :)
 
VladislavVG писал(а) >>

ИМХО - не совсем. Лучше перенести определение количества открытых

int total = OrdersTotal();

внутрь "вайл", как и остальных переменных.

И еще: после первого удаления будет пауза и по условию

// check for trade allowed
if(IsTradeAllowed()) {
RefreshRates();
} else {
return(0);
}

можно вылететь из функции.
Лучше так:

int n=0;
while(!IsTradeAllowed()&& n<limit) {Sleep(500);n++;}
RefreshRates();

Удачи.
ЗЫ уже ответили :)

Спасибо.
 

А почему лоты не десятичные, а целые?

 
Roger писал(а) >>

А почему лоты не десятичные, а целые?

Правильно заметили, непорядок. Спасибо. Там ещё и
  if((shortlots==0 && longlots!=0) || (shortlots!=0 && longlots==0))
      {
       end=true;
      }
Не в том месте вставлено. Но это я у себя поправил.