我有一些开发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;
}
答案 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速度很快,但不容易理解