显示 MQL5 智能交易系统的 MACD



我有一些经验可以在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;
}

先初始化句柄,然后再初始化缓冲区,并确保初始化成功。

复制缓冲区的最后 100 个值需要什么?确保您设法将它们全部获取,因为 CopyBuffer 返回复制的元素数量(如果发生任何错误,通常全部或 -1(。另外不要忘记,您尚未对缓冲区进行排序,因此bufMacdMain[0]可能是 99 根柱线的指标的主缓冲区(在 MQL4 中,0 表示当前,在 MQL5 中 - 完全相反,除非您明确告知将数组设置为系列(

对于您的isNewBar()函数,我建议将时间帧作为ENUM_TIMEFRAME值传递,因为它们完全不同(并且通常对了解 MQL4 的人来说毫无意义(,喜欢isNewBar(string symbol, ENUM_TIMEFRAMES tf=PERIOD_CURRENT){}并在没有不必要的参数或具有正确时间帧的情况下调用它。

MQL5 速度很快,但不易理解

最新更新