Закрытие всех ордеров

 

Народ, здрасти..

вот не пойму что за хрень

вот отрывок из советника:

Orders=OrdersTotal();

for(i=0;i<Orders;i++){
if(OrderSelect(i,SELECT_BY_POS)==false) continue;

if(OrderType()==OP_SELL) tmp=Ask;
if(OrderType()==OP_BUY) tmp=Bid;
for(j=1;j<10;j++){
if(OrderClose(OrderTicket(),OrderLots(),tmp,Slippage)==true){
j=11;
PlaySound("ok.wav");
}
}
   
}


По сути это должно закрыть ВСЕ открытые ордера.... Но почемуто закрывает только 1-2 ордера... Сайт уже излазил, код стопудова верный, может в терминале косяк..... Может если кто с этим сталкивался, поможете разобраться? :-) 

 

тут вашей вины или терминала нет.

эта проблема от незнания.

дело в том, что после удаления одеров - меняется его позиция в списке.

поэтому надо пойти двумя путями.

1. Или составить список тикетов ордеров на удаление. И потом проходить по этому списку и удалять, используя SELECT_BY_TICKET

2. Или удалять в обратном порядке. то есть от OrdersTotal()-1 до 0


первый вариант предпочтительнее (с моей точки зрения вы имеете больший контроль),

так как список ордеров (нумерация по порядку) может быть изменен другими экспертами в момент выполнения данного цикла.


PS. С такими вопросами лучше в ветку сюда

 
for(i=Orders-1;i>=0;i--){
 
Спасибо)))))))
 
Не поверите... Сделал, опять все также))))))))))))
 
//+------------------------------------------------------------------+
void CloseAllFirstProfit() {
   int i, k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) if (OrderProfit()+OrderSwap()>0) ClosePosBySelect();
   k=OrdersTotal();
   for (i=k-1; i>=0; i--) if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) if (OrderType()==OP_BUY || OrderType()==OP_SELL) ClosePosBySelect();
}
//+------------------------------------------------------------------+
void ClosePosBySelect() {
   if (OrderType()==OP_BUY)  OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 10, CLR_NONE);
   if (OrderType()==OP_SELL) OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 10, CLR_NONE);
}
//+------------------------------------------------------------------+
 

IgorM, впервые вижу, чтоб кто-то конструировал условне операторы так, как это делаете Вы.

for() if() if() ... if() {}

Это вообще, разрешено и если да, то где об этом почитать? Если разрешено, то по логике вещей, эти ифы должны соединяться между собой коньъюнкцией (оператором AND).

 
drknn:

IgorM, впервые вижу, чтоб кто-то конструировал условне операторы так, как это делаете Вы.

for() if() if() ... if() {}

Это вообще, разрешено и если да, то где об этом почитать? Если разрешено, то по логике вещей, эти ифы должны соединяться между собой коньъюнкцией (оператором AND).


А вот так нормально:

for()
  if()
    if()
      if()
      {
        //...
      }

?

 

Нормально было бы вот так:

for(){
  if(){
    if(){
      if(){
        //...
      }
    }
  }
}

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

 
//+------------------------------------------------------------------+
//|                                                        close.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"
#property show_confirm

//+------------------------------------------------------------------+
//| script "Закрывает все открытые позиции"                          |
//+------------------------------------------------------------------+
int start()
  {
   bool   result;
   int    error;
//----
 while (OrdersTotal()>0)
 { 
   if(OrderSelect(0,SELECT_BY_POS,MODE_TRADES))
     {   if(OrderType()==OP_BUY)  result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_BID),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE); 
          if(OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(OrderSymbol(),MODE_ASK),MarketInfo(OrderSymbol(),MODE_DIGITS)),3,CLR_NONE); 
          if (OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
           OrderDelete(OrderTicket());
          
           if(result!=TRUE) { error=GetLastError();
              Print("LastError = ",error, " ",Symbol()); }
           else error=0; }
   else Print( "Error when order select ", GetLastError());

  } 
//----
   return(0);
  }
//+------------------------------------------------------------------+

я таким пользуюсь

 
dmmikl86:

я таким пользуюсь


В таком коде трудно искать потреявшуюся скобку. Такой код более трудночитаем - в нём смысловые блоки, которые должно отмечать сознание без запинки, неоправданно соединены. Я имею ввиду не синтаксис, а психологию восприятия кода. Посмотрите, насколько проще воспринимать код, если у него вот такая организация: http://s2.ipicture.ru/uploads/20110106/2mVI83l7.jpg

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