Отображение Macd для эксперта MQL5 - PullRequest
0 голосов
/ 28 января 2020

У меня есть немного опыта для разработки на MT4 / MQL4.

Сейчас я пытаюсь перейти на MQL5, но я столкнулся с проблемой на первом этапе.

Я просто хочу показать последний MacD и сигнал для каждого таймфрейма.

Однако он не показывает значения.

Где это неправильно ??

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int hMacd;
double bufMacdMain[];
double bufMacdSignal[];

int OnInit()
  {
//---

    SetIndexBuffer(0, bufMacdMain, INDICATOR_DATA);
    //ArraySetAsSeries(bufMacdMain, true);
    SetIndexBuffer(1, bufMacdSignal, INDICATOR_DATA);
    //ArraySetAsSeries(bufMacdSignal, true);    
    hMacd = iMACD(NULL,0,13,26,9,PRICE_CLOSE); 

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
     IndicatorRelease(hMacd);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if(isNewBar(_Symbol,0)) {
      Print("newbar1");
      CopyBuffer(hMacd, 0, 0, 100, bufMacdMain);
      CopyBuffer(hMacd, 1, 0, 100, bufMacdSignal);
      printf(__FUNCTION__+": MACD = ", bufMacdMain[0], " / ", bufMacdSignal[0]);
    }
  }
//+------------------------------------------------------------------+
bool isNewBar(string symbol, ENUM_TIMEFRAMES tf)
{
   static datetime time = 0;
   if(iTime(symbol, tf, 0) != time)
   {
      time = iTime(symbol, tf, 0);
      return true;
   }
   return false;
}

код обновлен благодаря @Daniel Kniaz

Работает.

//+------------------------------------------------------------------+
//|                                                         test.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int hMacd;
double bufMacdMain[];
double bufMacdSignal[];

int OnInit()
  {
//---

    SetIndexBuffer(0, bufMacdMain, INDICATOR_DATA);
    ArraySetAsSeries(bufMacdMain, true);
    SetIndexBuffer(1, bufMacdSignal, INDICATOR_DATA);
    ArraySetAsSeries(bufMacdSignal, true);    
    hMacd = iMACD(NULL,0,13,26,9,PRICE_CLOSE); 

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
     IndicatorRelease(hMacd);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
    if(isNewBar(_Symbol)) {
      Print("newbar1");
      int macCopied = CopyBuffer(hMacd, 0, 0, 1, bufMacdMain);
      int sigCopied = CopyBuffer(hMacd, 1, 0, 1, bufMacdSignal);
      print("macCopied Num:",macCopied);
      print("sigCopied Num:",sigCopied);
      Print(__FUNCTION__+": MACD = ", bufMacdMain[0], " / ", bufMacdSignal[0]);
    }
  }
//+------------------------------------------------------------------+
bool isNewBar(string symbol, ENUM_TIMEFRAMES tf = PERIOD_CURRENT)
{
   static datetime time = 0;
   if(iTime(symbol, tf, 0) != time)
   {
      time = iTime(symbol, tf, 0);
      return true;
   }
   return false;
}

1 Ответ

1 голос
/ 29 января 2020

Сначала инициализируйте дескриптор перед буферами и убедитесь, что инициализация прошла успешно.

Зачем нужно копировать 100 последних значений буфера? Убедитесь, что вам удалось получить их все, поскольку CopyBuffer возвращает количество скопированных элементов (обычно все или -1, если произошла какая-либо ошибка). Также не забывайте, что вы не упорядочили буферы, так что bufMacdMain[0], вероятно, будет основным буфером индикатора со старым индикатором 99 (в MQL4 0 означает текущий, в MQL5 - совсем наоборот, если вы явно не указали установить массив как серию)

С вашей функцией isNewBar() я бы предложил передавать таймфреймы как значения ENUM_TIMEFRAME, потому что они совершенно разные (и обычно не имеют смысла для тех, кто знает MQL4), например, isNewBar(string symbol, ENUM_TIMEFRAMES tf=PERIOD_CURRENT){} и вызывать его без лишних параметр или с правильным периодом времени.

MQL5 быстрый, но его нелегко понять

...