Подскажите пожалуйста!

 

Что в этом куске кода не правильно?

for(i=0; i<actTotal;i++)
  {
   
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
  if( OrderSymbol()==Symbol() && OrderMagicNumber()==Mag)
  {
  TotalOrders++;
  if(OrderType()==OP_BUY) BuyOrders++;
  if(OrderType()==OP_SELL) SellOrders++;
  double l = OrderLots();
  }}
   
  if(BuyOrders > 0 && l == Lots && Bid > OrderOpenPrice() + Pips*Point && Bid < iClose(NULL,1,1))
  OrderClose(OrderTicket(),OrderLots(),Ask,CLR_NONE);
  if(SellOrders > 0 && l == Lots && Ask < OrderOpenPrice() - Pips*Point && Ask > iClose(NULL,1,1))
  OrderClose(OrderTicket(),OrderLots(),Bid,CLR_NONE);
  }  

 
liza писал (а) >>

Что в этом куске кода не правильно?

Сложно сказать наверняка не зная "механики" работы советника, но...

Логика прежде всего. Вы в одном цикле перебора ордеров осуществляете пересчет ордерови их закрытие. При условии, что одновременно может быть только один ордер - не проблема. А если могут быть несколько разнонаправленых ордеров?

Например нашли ордер Buy -> BuyOrders=1, условие закрытие не выполнилось, следующий ордер Sell->SellOrders=1, ордер селл может закрыться по условию закрытия для бай ордера....

Вынесите пересчет ордеров в один цикл, а закрытия в другой. Или попробуйте так.

for(i=0; i<actTotal;i++)
  {
   
  if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
  {
  if( OrderSymbol()==Symbol() && OrderMagicNumber()==Mag)
  {
  TotalOrders++;
  if(OrderType()==OP_BUY) BuyOrders++;
  if(OrderType()==OP_SELL) SellOrders++;
  double l = OrderLots();
  }}
   
  if(OrderType()==OP_BUY && l == Lots && Bid > OrderOpenPrice() + Pips*Point && Bid < iClose(NULL,1,1))
  OrderClose(OrderTicket(),OrderLots(),Ask,CLR_NONE);
  if(OrderType()==OP_SELL && l == Lots && Ask < OrderOpenPrice() - Pips*Point && Ask > iClose(NULL,1,1))
  OrderClose(OrderTicket(),OrderLots(),Bid,CLR_NONE);
  }

.

 
Еще один вариант.
   for(int i=OrdersTotal()-1;i>=0;i--){
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
         if( OrderSymbol()==Symbol() && OrderMagicNumber()==Mag){
            TotalOrders++;
            double l = OrderLots();            
            if(OrderType()==OP_BUY){
               BuyOrders++;
                  if(BuyOrders > 0 && l == Lots && Bid > OrderOpenPrice() + Pips*Point && Bid < iClose(NULL,1,1)){
                     if(OrderClose(OrderTicket(),OrderLots(),Ask,CLR_NONE)){
                        BuyOrders--;
                        TotalOrders--;
                        RefreshRates();
                     }
                  }
            }
            if(OrderType()==OP_SELL){
               SellOrders++;
                  if(SellOrders > 0 && l == Lots && Ask < OrderOpenPrice() - Pips*Point && Ask > iClose(NULL,1,1)){
                     if(OrderClose(OrderTicket(),OrderLots(),Bid,CLR_NONE)){
                        SellOrders--;
                        TotalOrders--;
                        RefreshRates();
                     }
                  }
            }

         }
      }
      else{
         return(0);
      }
  }
Еще не помешает нормализацию даблов делать при сравнении.
 

Я в советнике пытаюсь сделать закрытие ордера если он зашел в плюс, а потом произошел разворот на минутном тф.

Попробовала Ваш ваниант все равно не работает (позиции не закрываются).

 
liza писал (а) >>

Я в советнике пытаюсь сделать закрытие ордера если он зашел в плюс, а потом произошел разворот на минутном тф.

Попробовала Ваш ваниант все равно не работает (позиции не закрываются).

Варианты:

Выведите в лог ошибки.

Выложите эксперт целиком.

 
Выкладываю советника
Файлы:
 
liza писал (а) >>
Выкладываю советника

Вы что тут над нами издеваетесь???) Два взрослых человека искренне пытались Вам помочь.... Интересно, о чем тут были Ваши предыдущие 100 постов, если Вы еще не удосужились узнать, что для закрытия ордера его необходимо сначала ОТКРЫТЬ?) Да и вообще не эксперт это... ЧИТАТАТЬ от корки до корки https://book.mql4.com/ru/

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