显示Macd for MQL5 EA交易

时间:2020-01-28 19:44:37

标签: mql5 metatrader5

我有一些开发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 个答案:

答案 0 :(得分:1)

首先在缓冲区之前初始化句柄,并确保初始化成功。

复制缓冲区的100个最后一个值有什么需要?确保成功获取所有内容,因为CopyBuffer返回已复制元素的数量(通常为all,如果发生任何错误则为-1)。同样不要忘记您没有排序缓冲区,因此bufMacdMain[0]可能是指标99条旧指针的主要缓冲区(在MQL4中,0表示当前,在MQL5中-完全相反,除非您明确告知将数组设置为系列)

对于您的isNewBar()函数,我建议将时间帧作为ENUM_TIMEFRAME值传递,因为它们之间存在很大差异(通常对于那些了解MQL4的人没有意义),就像isNewBar(string symbol, ENUM_TIMEFRAMES tf=PERIOD_CURRENT){}一样,并且在不使用不必要的参数或正确的时间范围。

MQL5速度很快,但不容易理解

相关问题