Прошу помощи в написании советника

 
Доброго времени суток. Проблема заключается в следующем - почему то открывается только один ордер а должно работать так. Когда ima2 пересекает im1 с низу вверх открыть ордер на покупку, когда ima2 пересекает ima1 с вверху в низ открыть ордер на продажу. За ранние всех благодарю.
int start()
{  
   if (CountTrades() <= 0)
     {
      double ima1 = iMA(Symbol(), 0, period1, ma_shift1, MODE_SMA, PRICE_CLOSE, 0);
      double ima2 = iMA(Symbol(), 0, period2, ma_shift2, MODE_SMA, PRICE_CLOSE, 0);
      
      if (ima2 > ima1)
        {
         OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, NULL, Magic, 0, CLR_NONE);
        }
      else if (ima2 < ima1)
         { 
          OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, NULL, Magic, 0, CLR_NONE);
         }
     }
   return(0);
}
//+------------------------------------------------------------------+
int CountTrades()
{
    int count = 0;
    for (int i=OrdersTotal()-1; i>=0; i--)
    {
        if(OrderSelect(i,SELECT_BY_POS, MODE_TRADES))
        {
           if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
              count++;
        } 
    }
    
    return(count);
}
 
Это (ima2 > ima1) - не пересечение. Так позиции будут открываться на каждом тике, пока данное условие будет действительно. А более одной позиции не открывает из-за 
if (CountTrades() <= 0)
 
evillive:
Это (ima2 > ima1) - не пересечение. Так позиции будут открываться на каждом тике, пока данное условие будет действительно. А более одной позиции не открывает из-за 

А как сделать пересечение?
 
dima123:

А как сделать пересечение?
пример
 

Так это (ima2 > ima1) тоже самое что и в примере. В примере написано "Самый простой способ - это взять значения двух требуемых МА и посмотреть на их расположение" что у меня и сделано, они пересекаются ордер открывается но только один, мне evillive:подсказал что это из-за if (CountTrades() <= 0

значит надо сделать как то чтоб ордер закрывался когда есть другой сигнал на открытие ордера, и ордера открывались когда ima2 пересекает im1 с низу вверх открыть ордер на покупку, когда ima2 пересекает ima1 с вверху в низ открыть ордер на продажу.

 
dima123:

Так это (ima2 > ima1) тоже самое что и в примере. В примере написано "Самый простой способ - это взять значения двух требуемых МА и посмотреть на их расположение" что у меня и сделано, они пересекаются ордер открывается но только один, мне evillive:подсказал что это из-за if (CountTrades() <= 0

значит надо сделать как то чтоб ордер закрывался когда есть другой сигнал на открытие ордера, и ордера открывались когда ima2 пересекает im1 с низу вверх открыть ордер на покупку, когда ima2 пересекает ima1 с вверху в низ открыть ордер на продажу.

Вы недочитали. В самом простом варианте проверяется взаимное положение МА на двух последовательных барах. Если на одном баре MA_быстрая<МА_медленная, а на следующем MA_быстрая>МА_медленная, то произошло пересечение снизу вверх, сигнал на покупку. Подобно же выглядит пересечение вниз.
 

А возможно получение сигнала на последнем (нулевом) баре? а не с двух последних.

да и у меня в коде это так и работает моя проблема заключается в том что открывается ордер по сигналу но кода появляется новый сигнал последний ордер не закрывается следовательно новый не открывается а надо открыть ордер по новому сигналу. 

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