初学者的问题 MQL5 MT5 MetaTrader 5 - 页 116

 
原则上是这样的,错误可能在于,我的指标句柄是在OnTick函数中创建的,数据是在同一个tick上立即复制的。我在晚上已经理解了,现在我将尝试把指标句柄转移到OnInit函数。
Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
sss20192:
错误是在OnTick函数中创建的指标句柄,数据是在同一个tick上复制的。我在晚上已经理解了,现在我将尝试把指标句柄转移到OnInit函数。

这并不奏效。现在的代码是这样的


#property version   "1.00"

input int                  InpFastEMA=12;                // Fast EMA period
input int                  InpSlowEMA=26;                // Slow EMA period
input int                  InpSignalMA=9;                // Signal MA period
input ENUM_APPLIED_PRICE   InpAppliedPrice=PRICE_CLOSE;  // Applied price
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int Handle1, Handle2, Handle3;
double MacdArray[];

int OnInit()
  {
//---
  Handle1 = iMACD(_Symbol, PERIOD_M5, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle2 = iMACD(_Symbol, PERIOD_M15, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
  Handle3 = iMACD(_Symbol, PERIOD_H1, InpFastEMA, InpSlowEMA, InpSignalMA, InpAppliedPrice);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
        CopyBuffer(Handle1, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle2, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
        
        CopyBuffer(Handle3, 0, 1, 1, MacdArray);
        Print(MacdArray[0], " ", GetLastError());
  }
//+------------------------------------------------------------------+

日志中出现了以下信息

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988-005 0

2013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988-005 0

而且总是这样。似乎没有复制的错误。

 
sss20192: 这并没有帮助。以下是代码

但到目前为止,你既没有成功创建手柄 的检查,也没有成功计算指标 的检查和复制的检查。把手柄的初始化移到OnInit()的想法是正确的。

另外,在OnTick()的开头加上Print(MacdArray[0])一行--在你开始复制缓冲区之前,看看数组中包含什么垃圾值。

要补充的是。当然,在函数本身之后使用GetLastError()可能是编程风格的一种特殊性。如果我没记错的话,GetLastError()的空值并不总是意味着该函数成功运行。

 
Yedelkin:
但到目前为止,你既没有成功创建手柄 的检查,也没有成功计算指标的检查和复制的检查。把手柄的初始化移到OnInit()的想法是正确的。
但只是第一次。如 果在程序的任何其他地方发现某个句柄是无效的,我们就必须尝试重新获得它。因此,我们不能说为在OnInit()中获取句柄而编写的代码会完全解决这个问题,并且100%正确。))
 
检查了用CopyBuffer函数 复制了多少数据,总是写1,而且没有错误,但数据还是错的。
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5
 

tol64

Yedelkin : 把手柄的初始化移到OnInit()上的想法是个好主意。

但只是第一次。如果在程序的其他地方发现某个句柄是无效的,你必须尝试重新获得它。因此,我们不能说为在OnInit()中获取句柄而编写的代码会完全解决这个问题,并且100%正确。))

你是说把手柄的初始化从OnTick()移到OnInit()的想法本身就是错误的
 
sss20192:
我检查了用CopyBuffer函数 复制了多少数据,它总是写1,而且没有错误,但数据仍然是错误的。

我在测试器中得到了这个代码的结果。

//---

我在测试前做的唯一一件事就是在输出到日志之前只是转换了指标值。

Print(DoubleToString(MacdArray[0],Digits())," ",GetLastError());
 
Yedelkin:
你是说把处理程序的初始化从OnTick()移到OnInit()的想法本身就是错误的
如果只在OnInit()中,其他地方都没有,那么是的--错误。我们第一次试图在OnInit()中获得一个句柄。然后,在每次尝试获取指标数据之前,我们都要检查手柄是否有效。如果它是有效的,我们就得到数据,如果不是,我们就尝试再次得到手柄。
 
tol64:

我在测试器中得到了这个代码的这个结果。

//---

我在测试前做的唯一一件事是在输出到日志前简单地转换指标值。

Ooohtyg genius!非常感谢您!第三天解决了这个问题)
 
tol64:
Yedelkin: 你是说把手柄的初始化从OnTick()移到OnInit()的想法本身就是错误的
如果只在OnInit()中,而在其他地方,是的--错误。我们第一次试图在OnInit()中获得一个句柄。然后,在每次尝试获取指标数据之前,我们都要检查手柄是否有效。如果它是有效的,我们就得到数据,如果不是,我们就尝试再次得到手柄。

而没有 "如果"?而在这个特定的情况下?指标句柄是在 每个tick 期间的OnTick函数 中创建的,数据是在同一个tick期间复制的。这意味着每次都请求相同的指标句柄,而没有检查其有效性/无效性。在这种背景下,你还会继续争辩说,将手柄的初始化从OnTick()转移到OnInit()的想法 本身就是错误的 吗?

PS。看来你已经帮助了这个人,所以这个问题可以说是结束了。