Почему эксперт не торгует?

 
Подскажите пожалуйста, почему эксперт не торгует в тестере стратегий.
Код:

//---- Входные параметры
extern int FastMA = 7;
extern int FastMetod = 1;            // 0=SMA, 1=EMA, 2=SMMA, 3=LWMA
extern int FastType = 5;             // CLOSE=0, OPEN=1, HIGH=2, LOW=3, MEDIAN=4, TYPICAL=5, WEIGHTED=6
extern int SlowMA = 15;
extern int SlowMetod = 1;            // 0=SMA, 1=EMA, 2=SMMA, 3=LWMA
extern int SlowType = 5;             // CLOSE=0, OPEN=1, HIGH=2, LOW=3, MEDIAN=4, TYPICAL=5, WEIGHTED=6
extern string ExtSoundFileName = ""; // Звук, воспроизводимый при срабатывании эксперта

//---- Буферы
double CrossUp[];
double CrossDown[];

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int   limit,
         i,
         counter,
         Ticket;
   double
         FastMA_now,
         SlowMA_now,
         FastMA_previous,
         SlowMA_previous,
         FastMA_after,
         SlowMA_after,
         Range,
         AvgRange;
   string
         message;
   bool
         Order_By_Opn=false,
         Order_Sell_Opn=false;
                  
   int counted_bars = IndicatorCounted();

//---- Проверка ошибок
   if(counted_bars<0) return(-1);
   
//---- Подсчет баров
   if(counted_bars>0) counted_bars--;
   limit = Bars-counted_bars;
   
   for(i = 0; i <= limit; i++) {
   
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i ;counter <= i+9; counter++)
      {
         AvgRange = AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range = AvgRange/10;
      
//---- Проверка условия для открытия ордера
      FastMA_now = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i);
      FastMA_previous = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i+1);
      FastMA_after = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i-1);

      SlowMA_now = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i);
      SlowMA_previous = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i+1);
      SlowMA_after = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i-1);
      
      if ((FastMA_now > SlowMA_now) && (FastMA_previous < SlowMA_previous) && (FastMA_after > SlowMA_after)) {
       CrossUp[i] = Low[i] - Range*0.5;
       Order_By_Opn = true;
      }
      
      else if ((FastMA_now < SlowMA_now) && (FastMA_previous > SlowMA_previous) && (FastMA_after < SlowMA_after)) {
       CrossDown[i] = High[i] + Range*0.5;
       Order_Sell_Opn = true;
      }
   }
   
//---- Открытие ордеров
      if(Order_By_Opn==true) {
         Ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"Moving Average",0,0,Blue);
           if(Ticket<0)
           {
            Alert ("Открыт ордер Buy ",Ticket);
            return(0);  
           }
      }
            
      if(Order_Sell_Opn==true) {
         Ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"Moving Average",0,0,Red);
           if(Ticket<0)
           {
            Alert ("Открыт ордер Sell ",Ticket);
            return(0);    
           }
      }
   
   return(0);
  }
 

FastMA_after = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i-1); и
SlowMA_after = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i-1);
при i=0 нет значений, значит
FastMA_after > SlowMA_after или FastMA_after < SlowMA_after никогда не выполнятся.

 
Убрал все, что связано с
SlowMA_after и FastMA_after
Всё равно не торгует.
Тут логика такая. Идет вычисление двух МА на текущем баре(0) и предыдущем баре(0+1). Потом они сравниваются и по результатам сравнения открывается либо бай, либо селл.
Вроде логически все верно, но не работает. В MQL еще мало опыта, не могу понять почему не торгует. Причем индикатор такой стрелочки рисует на графике.
 
andro_id >>:
Убрал все, что связано с
Всё равно не торгует.
Тут логика такая. Идет вычисление двух МА на текущем баре(0) и предыдущем баре(0+1). Потом они сравниваются и по результатам сравнения открывается либо бай, либо селл.
Вроде логически все верно, но не работает. В MQL еще мало опыта, не могу понять почему не торгует. Причем индикатор такой стрелочки рисует на графике.

Какой индикатор? какие стрелочки? вот с этого места поподробнее

 
А вот индикатор:
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 OrangeRed

//---- input parameters
extern int FastMA = 7;
extern int FastMetod = 1; //0=SMA, 1=EMA, 2=SMMA, 3=LWMA
extern int FastType = 5; //CLOSE=0, OPEN=1, HIGH=2, LOW=3, MEDIAN=4, TYPICAL=5, WEIGHTED=6
extern int SlowMA = 15;
extern int SlowMetod = 1; //0=SMA, 1=EMA, 2=SMMA, 3=LWMA
extern int SlowType = 5; //CLOSE=0, OPEN=1, HIGH=2, LOW=3, MEDIAN=4, TYPICAL=5, WEIGHTED=6
extern string ExtSoundFileName = "";


//---- buffers
double CrossUp[];
double CrossDown[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 233);
   SetIndexBuffer(0, CrossUp);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 234);
   SetIndexBuffer(1, CrossDown);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit, i, counter;
   double FastMA_now, SlowMA_now, FastMA_previous, SlowMA_previous, FastMA_after, SlowMA_after;
   double Range, AvgRange;
   string message;
   int counted_bars = IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;

   limit = Bars-counted_bars;
   for(i = 0; i <= limit; i++) {
   
      counter = i;
      Range = 0;
      AvgRange = 0;
      for (counter = i ;counter <= i+9; counter++)
      {
         AvgRange = AvgRange+MathAbs(High[counter]-Low[counter]);
      }
      Range = AvgRange/10;
//----
      FastMA_now = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i);
      FastMA_previous = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i+1);
      FastMA_after = iMA(NULL, 0, FastMA, 0, FastMetod, FastType, i-1);

      SlowMA_now = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i);
      SlowMA_previous = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i+1);
      SlowMA_after = iMA(NULL, 0, SlowMA, 0, SlowMetod, SlowType, i-1);
      
      if ((FastMA_now > SlowMA_now) && (FastMA_previous < SlowMA_previous) && (FastMA_after > SlowMA_after)) {
       CrossUp[i] = Low[i] - Range*0.5;
       //message = StringConcatenate(Symbol()," MA 7 пересекла MA 15 вверх в ",TimeToStr(TimeLocal(),TIME_SECONDS)," @",Bid,".");
       //Alert(message);
       if ( ExtSoundFileName != "" )
          PlaySound( ExtSoundFileName );
      }
      
      else if ((FastMA_now < SlowMA_now) && (FastMA_previous > SlowMA_previous) && (FastMA_after < SlowMA_after)) {
       CrossDown[i] = High[i] + Range*0.5;
       //message = StringConcatenate(Symbol()," MA 7 пересекла MA 15 вниз в ",TimeToStr(TimeLocal(),TIME_SECONDS)," @",Bid,".");
       //Alert(message);
       if ( ExtSoundFileName != "" )
          PlaySound( ExtSoundFileName );
      }
   }
//----
   return(0);
}
 
Ну а он то здесь при чем?


Смотрите журнал тестера... Запустите в визуальном режиме и наблюдайте... Когда, по идее должна быть покупка/продажа - смотрите внимательнее. 
И ищите алгоритмические ошибки... Я на первый взгляд в вашем коде таких не обнаружил...

Ну конечно не считая вот этого:)

if(Ticket<0)
{
Alert ("Открыт ордер Buy ",Ticket);
return(0);

ну и то же самое для sell...

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

при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).
 
lexandros >>:

if(Ticket<0)
{
Alert ("Открыт ордер Buy ",Ticket);
return(0);

ну и то же самое для sell...

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

при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).

Здесь я просто описался, у себя исправил, а тут - нет. В логе тестера ничего нет, кроме записи об инициализации эксперта. Запускаю на отрезке, где ордер как раз и должен сработать, но тест заканчивается с нулевым результатом.
 
Вот это что if(counted_bars<0) return(-1); уберите
Он у вас постоянно будет открывать позиции т.к нет контроля.
И вообще упростите всё что с counted_bars связано вам наверно только 0 и 1 бары нужны.
 
lexandros >>:
при удачном исполнении команда OrderSend возвращает целое положительное число (номер тикета), при неудачном - отрицательное число(номер ошибки).

Нет, не совсем так (если бы так, было бы здорово). Из хелпа по OrderSend:

Возвращает номер тикета, который назначен ордеру торговым сервером или -1 в случае неудачи. Чтобы получить дополнительную информацию об ошибке, необходимо вызвать функцию GetLastError().

 
Mathemat >>:

Нет, не совсем так (если бы так, было бы здорово). Из хелпа по OrderSend:


Да-да... верно:) Сорри... Зарапортовался совсем:)
 
zhuki >>:
Вот это что if(counted_bars<0) return(-1); уберите
Он у вас постоянно будет открывать позиции т.к нет контроля.
И вообще упростите всё что с counted_bars связано вам наверно только 0 и 1 бары нужны.
Спасибо. Убрал это и поставил в расчет последние 3 бара - все заработало. Спасибо большое всем за помощь.
Причина обращения: