В чём логическая ошибка? Почему всегда только в одну сторону открывает? Пытался считать минуты открытия/закрытия свечей

 
//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"

#include <Trade\Trade.mqh>
#include <Tools\DateTime.mqh>

input double Lot = 0.01;

int minBuff = 5, count = 0;

CTrade trade;
MqlDateTime Time;

// OsMA //
input int fast_ema_period = 12;
input int slow_ema_period = 26;
input int signal_sma_period = 9;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      TimeCurrent(Time);
      int Minutes = Time.min;
      int HandleOsMA = iOsMA(_Symbol, NULL, fast_ema_period, slow_ema_period, signal_sma_period, PRICE_CLOSE);
      
      Open(Minutes, HandleOsMA);
      Binary(Minutes);
  }
//+------------------------------------------------------------------+
void Open(int Minutes, int HandleOsMA)
{
   if(!PositionSelect(_Symbol))
   {
      if(HandleOsMA > 0)
      {
         trade.Buy(Lot);
      }
      if(HandleOsMA < 0)
      {
         trade.Sell(Lot);
      }
   }    
}

void Binary(int Minutes)
{
   if(Minutes == minBuff)
   {
      minBuff += 5;
      if(Minutes == 55)
      {
         minBuff = 0;
      }
      count++;
      trade.PositionClose(_Symbol, 1);
   }
   Comment("Минуты: ", Minutes, "\n",
   "Закроется в: ", minBuff, " минут\n",
   "Количество закрытых свечей: ", count);
}
 

Грубейшая ошибка: НА КАЖДОМ ТИКЕ создавать хендл индикатора!

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      TimeCurrent(Time);
      int Minutes = Time.min;
      int HandleOsMA = iOsMA(_Symbol, NULL, fast_ema_period, slow_ema_period, signal_sma_period, PRICE_CLOSE);
      
      Open(Minutes, HandleOsMA);
      Binary(Minutes);
  }
 
Хендл индикатора НУЖНО создавать ОДИН раз в OnInit().
 

Vladimir Karputov:
Хендл индикатора НУЖНО создавать ОДИН раз в OnInit().

Только в этом ошибка?

 
mrostrich:

Только в этом ошибка?

Ошибки нужно исправлять по шагам. Сначала раз. Потом уже два ...

 
Vladimir Karputov:

Ошибки нужно исправлять по шагам. Сначала раз. Потом уже два ...

Верно сказано) Я просто еще новенький

 
mrostrich:

Верно сказано) Я просто еще новенький

Вы не спешите. Делайте постепенно. Всё получится. Также хорошим тоном считается наличие шапки кода, например так (пример взят из \MQL5\Experts\Advisors\ExpertMACD.mq5)

//+------------------------------------------------------------------+
//|                                                   ExpertMACD.mq5 |
//|                   Copyright 2009-2017, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009-2017, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+

и прикрепление кода внизу сообщения в виде открытого редактируемого файла (формат *.mql5).

 
Vladimir Karputov:

Вы не спешите. Делайте постепенно. Всё получится. Также хорошим тоном считается наличие шапки кода, например так (пример взят из \MQL5\Experts\Advisors\ExpertMACD.mq5)

и прикрепление кода внизу сообщения в виде открытого редактируемого файла (формат *.mql5).

Исправил

 
mrostrich:

Только в этом ошибка?

https://www.mql5.com/ru/docs/series/copybuffer

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Отсчет элементов копируемых данных (индикаторный буфер с индексом buffer_num) от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар (значение индикатора для текущего бара). При копировании заранее неизвестного количества данных в качестве массива-приемника buffer[] желательно...
 
mrostrich:

Только в этом ошибка?

Нет, конечно.

Вы передаете в процедуру Open хэндл индикатора. Хэндл - это положительное целое число. Разумеется, у Вас всегда выполняется первое условие. Для получения данных индикатора нужно выгрузить его данные в массив при помощи функции CopyBuffer, как написано выше.

 
int HandleOsMA = iOsMA(...

У индикатора OsMA возвращаемое значение имеет тип double

Нужно исправить "int" на "double" в OnTick() и в Open().

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