SOS. Нужна помошь по советнику на двух индикаторах

 

Здравствуйте, есть два индикатора - один сдвинут вправо, второй влево.

 iMA_buf - вправо; 

 iMA1_buf - влево;

 Есть условие на покупку, что когда  iMA1_buf пересекает (т.е. больше ">")  iMA_buf открывается лонговая позиция, и условие обратное этому, на шортовую позицию, НО НЕ РАБОТАЕТ, генерирует только 1 сделку на шорт в начале графика и все, прошу посмотреть правильно ли задано условие (есть неуверенность в том что я правильно адресую элементы массива).

Большое спасибо тем кто отзавется. 

 Код советника: 

//+------------------------------------------------------------------+
//|                                           fast-start-example.mq5 |
//|                        Copyright 2012, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
#include <Trade\Trade.mqh>                                         //подключаем библиотеку для совершения торговых операций
#include <Trade\PositionInfo.mqh>                                  //подключаем библиотеку для получения информации о позициях

int               iMA_handle;
int               iMA1_handle;
                                      //переменная для хранения хендла индикатора
double            iMA_buf[]; 
double            iMA1_buf[];                                       //динамический массив для хранения значений индикатора
double            Close_buf[];                                     //динамический массив для хранения цены закрытия каждого бара

string            my_symbol;                                       //переменная для хранения символа
ENUM_TIMEFRAMES   my_timeframe;                                    //переменная для хранения таймфрейма

CTrade            m_Trade;                                         //структура для выполнения торговых операций
CPositionInfo     m_Position;                                      //структура для получения информации о позициях
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit()
  {
   my_symbol=Symbol();                                             //сохраним текущий символ графика для дальнейшей работы советника именно на этом символе
   my_timeframe=PERIOD_CURRENT;                                    //сохраним текущий период графика для дальнейшей работы советника именно на этом периоде
   iMA_handle=iMA(my_symbol,my_timeframe,10,2,MODE_SMA,PRICE_CLOSE);  //подключаем индикатор и получаем его хендл
   iMA1_handle=iMA(my_symbol,my_timeframe,10,-2,MODE_SMA,PRICE_CLOSE);
   if(iMA_handle==INVALID_HANDLE)                                  //проверяем наличие хендла индикатора
   {
      Print("Не удалось получить хендл индикатора");               //если хендл не получен, то выводим сообщение в лог об ошибке
      return(-1);                                                  //завершаем работу с ошибкой
   }
   ChartIndicatorAdd(ChartID(),0,iMA_handle);
   ChartIndicatorAdd(ChartID(),0,iMA1_handle);                         //добавляем индикатор на ценовой график
   ArraySetAsSeries(iMA_buf,true);
   ArraySetAsSeries(iMA1_buf,true);                                 //устанавливаем индексация для массива iMA_buf как в таймсерии
   ArraySetAsSeries(Close_buf,true);                               //устанавливаем индексация для массива Close_buf как в таймсерии
   return(0);                                                      //возвращаем 0, инициализация завершена
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   IndicatorRelease(iMA_handle); 
   IndicatorRelease(iMA1_handle);                                   //удаляет хэндл индикатора и освобождает память занимаемую им
   ArrayFree(iMA_buf);
   ArrayFree(iMA1_buf);                                               //освобождаем динамический массив iMA_buf от данных
   ArrayFree(Close_buf);                                           //освобождаем динамический массив Close_buf от данных
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   int err1=0;                                                     //переменная для хранения результатов работы с буфером индикатора
   int err2=0;                                                     //переменная для хранения результатов работы с ценовым графиком
   int err3=0;
   err1=CopyBuffer(iMA_handle,0,1,20,iMA_buf);                      //копируем данные из индикаторного массива в динамический массив iMA_buf для дальнейшей работы с ними
   err2=CopyClose(my_symbol,my_timeframe,1,20,Close_buf); 
   err3=CopyBuffer(iMA1_handle,1,1,20,iMA1_buf);          //копируем данные ценового графика в динамический массив Close_buf  для дальнейшей работы с ними
   if(err1<0 || err2<0)                                            //если есть ошибки
   {
      Print("Не удалось скопировать данные из индикаторного буфера или буфера ценового графика");  //то выводим сообщение в лог об ошибке
      return;                                                                                      //и выходим из функции
   }

   if(iMA1_buf[8]>iMA_buf[10])          //если значение индикатора были больше цены закрытия и стали меньше
     {
      if(m_Position.Select(my_symbol))                             //если уже существует позиция по этому символу
        {
         if(m_Position.PositionType()==POSITION_TYPE_SELL) m_Trade.PositionClose(my_symbol);  //и тип этой позиции Sell, то закрываем ее
         if(m_Position.PositionType()==POSITION_TYPE_BUY) return;                             //а если тип этой позиции Buy, то выходим
        }
      m_Trade.Buy(0.01,my_symbol);                                  //если дошли сюда, значит позиции нет, открываем ее
     }
   if(iMA1_buf[8]<iMA_buf[10])          //если значение индикатора были меньше цены закрытия и стали больше
     {
      if(m_Position.Select(my_symbol))                             //если уже существует позиция по этому символу
        {
         if(m_Position.PositionType()==POSITION_TYPE_BUY) m_Trade.PositionClose(my_symbol);   //и тип этой позиции Buy, то закрываем ее
         if(m_Position.PositionType()==POSITION_TYPE_SELL) return;                            //а если тип этой позиции Sell, то выходим
        }
      m_Trade.Sell(0.01,my_symbol);                                 //если дошли сюда, значит позиции нет, открываем ее
     }
  }
//+------------------------------------------------------------------+
 

У вас буффер у машки стоит единичка, а надо нулевой

 69-я строка кода, у МАшек ведь один буффер

err3=CopyBuffer(iMA1_handle,0,1,20,iMA1_buf);  
 

Все равно не работает, открывает только одну позицию на продажу (или если оставить буфер 1 в 69 строке) на покупку и все. И не закрывает ее до самого окончания теста.

 

Не посмотрите правильно ли я обращаюсь к буферам ?

В этих условиях:

 if(iMA1_buf[8]>iMA_buf[10]) 

 

из-за того что индикаторы сдвинуты, не может ли быть бага ? 

 
Robas1000:

Все равно не работает, открывает только одну позицию на продажу (или если оставить буфер 1 в 69 строке) на покупку и все.

 

Не посмотрите правильно ли я обращаюсь к буферам ?

В этих условиях ?

 if(iMA1_buf[8]>iMA_buf[10]) 

А у меня заработало, когда буффер поменял:

 

попробуйте перекомпилировать 

 

Какая у вас версия Метатрейдера 5 если не секрет ?

 Перекомпилировал уже несколько раз, тоже самое.

У меня 1150 и только одна сделка, удивлен, чесно говоря что у вас заработало а у меня нет )))

 
Robas1000:

Какая у вас версия Метатрейдера 5 если не секрет ?

 Перекомпилировал уже несколько раз, тоже самое.

У меня 1150 и только одна сделка, удивлен, чесно говоря что у вас заработало а у меня нет )))

билд 1210.. Да, у меня открывается только одна сделка также, но после того как меняю буффер все ок :)

МБ вы поменяли в этой строке что-то? я написал как надо сразу, после хэндла именно нолик поставьте, или просто скопируйте строчку.

err3=CopyBuffer(iMA1_handle,0,1,20,iMA1_buf); 
 

Уже поставил билд 1210 все тоже самое (один селл на евродолларе 30 минутном открывает и все): 

 

 err1=CopyBuffer(iMA_handle,0,1,20,iMA_buf);                      //копируем данные из индикаторного массива в динамический массив iMA_buf для дальнейшей работы с ними
   err2=CopyClose(my_symbol,my_timeframe,1,20,Close_buf); 
   err3=CopyBuffer(iMA1_handle,0,1,20,iMA1_buf);  
 
Robas1000:

Уже поставил билд 1210 все тоже самое (один селл на евродолларе 30 минутном открывает и все): 

 

не может это быть из-за того, что стоит Visual Studio 2010 ? Метатрейдер разве использует Visual Studio ?

 

2015.11.05 15:26:50.369 C++ compiler    Microsoft Visual Studio 2010 found
 

Ни в тех местах, но сделки пошли ! ))) Причина - не указал что только цены открытия использовать в тестере.

 

Maxim Dmitrievsky  спасибо !

 
Robas1000:

Maxim Dmitrievsky  спасибо !

пожалуйста, ну а остальное алертами дебажте или принтами, на предмет значений - те данные в массив пишутся или не те :)