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

[Удален]  
Советник работает по индикатору 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);
}

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