Помогите доделать советника

 
Советник работает по индикатору CCI.  открывает только один ордер бай либо селл, но не может открыть второй пока не закроет первый ордер. Хотелось бы чтобы советник мог открывать два ордера 
//+------------------------------------------------------------------+
//|                                                       Ruslan.mq4 |
//|                      Copyright © 2010, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2010, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"
#define magic  1052009

//---- input parameters

extern int period=14;
extern string  __________ = "=== Функция Трейлинг Стоп ====";
extern bool      UseTrailing = false;//Выключатель трейлинг стопа
extern int    MinProfit = 250;//порог включения трейлин стопа
extern int    TrailingStop = 250;// величина трейлинг стопа
extern int    TrailingStep = 50; // шаг трейлинг стопа



//-- Подключаемые модули --
#include <stderror.mqh> #include <stdlib.mqh>
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

if (UseTrailing) TrailPositions(); // выключатель трейлинг стопа
//----
 //int period=14;
   double val = iCCI(NULL ,0,period,PRICE_TYPICAL,0);

   int ticket, cnt, total=OrdersTotal();
     
   if(total<1)
      {
         if(val<-150)
            {
               ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"CCI_TRADER",magic,0,Green);
               if(val>-250)
                  {
                     if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUY order opened : ",OrderOpenPrice());
                  }
               else
                  {
                     Print("Error opening BUY order : ",GetLastError());
                     return(0);
                  }
            }
         else if(val>150)
            {
               ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"CCI_TRADER",magic,0,Red);
               if(val<250)
                  {
                     if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("SELL order opened : ",OrderOpenPrice());
                  }
               else
                  {
                     Print("Error opening SELL order : ",GetLastError());
                     return(0);
                  }
            }
      }
      for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // check for opened position 
         OrderSymbol()==Symbol())  // check for symbol
        {
         if(OrderType()==OP_BUY)   // long position is opened
           {
            // should it be closed?
            if(val>150)
                {
                 OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); // close position
                 return(150); // exit
                }
           }
         else // go to short position
           {
            // should it be closed?
            if(val<-150)
              {
               OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet); // close position
               return(-150); // exit
 }
           }
        }
     }
//----
   return(0);
  }
//+------------------------------

//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
void TrailPositions() // функция трейлинг стоп
{
  int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;
     if (OrderMagicNumber() == magic ){    
     if (OrderType() == OP_BUY )  {
      if (Bid-OrderOpenPrice() > MinProfit*Point) {
        if (OrderStopLoss() < Bid-(TrailingStop+TrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-TrailingStop*Point,
                                                     OrderTakeProfit(), 0, Blue);
        }      }    }
    if (OrderType() == OP_SELL)  {
      if (OrderOpenPrice()-Ask >MinProfit*Point) {
        if (OrderStopLoss() > Ask+(TrailingStop+TrailingStep-1)*Point 
                                                       || OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+TrailingStop*Point,
                                                      OrderTakeProfit(), 0, Blue);
        }   }   }    }   }  }
 
Самый простой вариант:
if(total<1) заменить на  if(total<2)
Правда, в этом случае возможно открытие 2-х ордеров в ОДНУ сторону...

	          
 
owl:
вот как раз таки не надо такой вариант, тотал<2  он открывает 2 ордера в одну сторону. надо чтоб открывал один ордер в одну сторону. Ордера закрываются по трейлингу, но если по трейлингу не закрылось. а по CCI линия дошла до противоположной стороны то чтоб он открыл противоположный ордер так скажем. Пример: открылся бай по CCI и линия пошла вверх и за ордером тащится трелинг. если линия по CCI дойдет до противоположной стороны, то надо чтоб открылся СЕЛЛ ордер. Соответственно, при движении вниз, бай ордер закроется по трелингу( а это уже плюс к депо))))) ), а СЕЛЛ ордер будет так же тянуться до противоположной стороны с трейлингом.  Я думаю что такой вариант просто супер!!!!
 

Работа через total=OrdersTotal() - без Магика, рано или поздно станет не удобной. Вы будете на одном счету пользоваться только одним советником??? И в ручную счётом не попользуетесь, так как Ваш советник любой ордер будет учитывать в своих расчётах... ;)
Хоты усматриваю в Вашем коде упоминание об идентиффикаторе (magic):

ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"CCI_TRADER",magic,0,Green);

Тогда добавляете простенькую функцию подсчёта ордеров советника

int MyOrdersTotal (int MG, int cmd) // процедура подсчета всех ордеров данного эксперта по данному инструменту
{
   int l_int, cnt = 0;
   int total = OrdersTotal();

   for (l_int = total - 1; l_int >= 0; cnt--)
   {
       OrderSelect (l_int, SELECT_BY_POS, MODE_TRADES);
       if (OrderMagicNumber() == MG && OrderSymbol() == Symbol())
       {
           // Учитываем или конкретно BUY-SELL или все
           if (OrderType() == cmd || OrderType() == -1)
           {cnt++;}
       }
   }  
   return (cnt);
}

и уже учитываете наличие конкретного типа ордеров Вашего советника. 

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