初学者的问题 MQL5 MT5 MetaTrader 5 - 页 116 1...109110111112113114115116117118119120121122123...1503 新评论 sss20192 2013.04.13 10:35 #1151 原则上是这样的,错误可能在于,我的指标句柄是在OnTick函数中创建的,数据是在同一个tick上立即复制的。我在晚上已经理解了,现在我将尝试把指标句柄转移到OnInit函数。 Документация по MQL5: Основы языка / Функции / Функции обработки событий www.mql5.com Основы языка / Функции / Функции обработки событий - Документация по MQL5 sss20192 2013.04.13 11:22 #1152 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 02013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988-005 02013.04.13 15:21:31 2010.01.04 00:00:01 6.187448020344988-005 0而且总是这样。似乎没有复制的错误。 Yedelkin 2013.04.13 11:30 #1153 sss20192: 这并没有帮助。以下是代码 但到目前为止,你既没有成功创建手柄 的检查,也没有成功计算指标 的检查和复制的检查。把手柄的初始化移到OnInit()的想法是正确的。另外,在OnTick()的开头加上Print(MacdArray[0])一行--在你开始复制缓冲区之前,看看数组中包含什么垃圾值。要补充的是。当然,在函数本身之后使用GetLastError()可能是编程风格的一种特殊性。如果我没记错的话,GetLastError()的空值并不总是意味着该函数成功运行。 Anatoli Kazharski 2013.04.13 11:39 #1154 Yedelkin: 但到目前为止,你既没有成功创建手柄 的检查,也没有成功计算指标的检查和复制的检查。把手柄的初始化移到OnInit()的想法是正确的。但只是第一次。如 果在程序的任何其他地方发现某个句柄是无效的,我们就必须尝试重新获得它。因此,我们不能说为在OnInit()中获取句柄而编写的代码会完全解决这个问题,并且100%正确。)) sss20192 2013.04.13 11:40 #1155 检查了用CopyBuffer函数 复制了多少数据,总是写1,而且没有错误,但数据还是错的。 Документация по MQL5: Доступ к таймсериям и индикаторам / CopyBuffer www.mql5.com Доступ к таймсериям и индикаторам / CopyBuffer - Документация по MQL5 Yedelkin 2013.04.13 11:44 #1156 tol64: Yedelkin : 把手柄的初始化移到OnInit()上的想法是个好主意。 但只是第一次。如果在程序的其他地方发现某个句柄是无效的,你必须尝试重新获得它。因此,我们不能说为在OnInit()中获取句柄而编写的代码会完全解决这个问题,并且100%正确。)) 你是说把手柄的初始化从OnTick()移到OnInit()的想法本身就是错误的? Anatoli Kazharski 2013.04.13 11:46 #1157 sss20192: 我检查了用CopyBuffer函数 复制了多少数据,它总是写1,而且没有错误,但数据仍然是错误的。我在测试器中得到了这个代码的结果。//---我在测试前做的唯一一件事就是在输出到日志之前只是转换了指标值。Print(DoubleToString(MacdArray[0],Digits())," ",GetLastError()); Anatoli Kazharski 2013.04.13 11:50 #1158 Yedelkin: 你是说把处理程序的初始化从OnTick()移到OnInit()的想法本身就是错误的? 如果只在OnInit()中,其他地方都没有,那么是的--错误。我们第一次试图在OnInit()中获得一个句柄。然后,在每次尝试获取指标数据之前,我们都要检查手柄是否有效。如果它是有效的,我们就得到数据,如果不是,我们就尝试再次得到手柄。 sss20192 2013.04.13 11:52 #1159 tol64:我在测试器中得到了这个代码的这个结果。//---我在测试前做的唯一一件事是在输出到日志前简单地转换指标值。 Ooohtyg genius!非常感谢您!第三天解决了这个问题) Yedelkin 2013.04.13 12:02 #1160 tol64: Yedelkin: 你是说把手柄的初始化从OnTick()移到OnInit()的想法本身就是错误的? 如果只在OnInit()中,而在其他地方,是的--错误。我们第一次试图在OnInit()中获得一个句柄。然后,在每次尝试获取指标数据之前,我们都要检查手柄是否有效。如果它是有效的,我们就得到数据,如果不是,我们就尝试再次得到手柄。 而没有 "如果"?而在这个特定的情况下?指标句柄是在 每个tick 期间的OnTick函数 中创建的,数据是在同一个tick期间复制的。这意味着每次都请求相同的指标句柄,而没有检查其有效性/无效性。在这种背景下,你还会继续争辩说,将手柄的初始化从OnTick()转移到OnInit()的想法 本身就是错误的 吗?PS。看来你已经帮助了这个人,所以这个问题可以说是结束了。 1...109110111112113114115116117118119120121122123...1503 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
错误是在OnTick函数中创建的指标句柄,数据是在同一个tick上复制的。我在晚上已经理解了,现在我将尝试把指标句柄转移到OnInit函数。
这并不奏效。现在的代码是这样的
日志中出现了以下信息
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
而且总是这样。似乎没有复制的错误。
但到目前为止,你既没有成功创建手柄 的检查,也没有成功计算指标 的检查和复制的检查。把手柄的初始化移到OnInit()的想法是正确的。
另外,在OnTick()的开头加上Print(MacdArray[0])一行--在你开始复制缓冲区之前,看看数组中包含什么垃圾值。
要补充的是。当然,在函数本身之后使用GetLastError()可能是编程风格的一种特殊性。如果我没记错的话,GetLastError()的空值并不总是意味着该函数成功运行。
但到目前为止,你既没有成功创建手柄 的检查,也没有成功计算指标的检查和复制的检查。把手柄的初始化移到OnInit()的想法是正确的。
tol64:
但只是第一次。如果在程序的其他地方发现某个句柄是无效的,你必须尝试重新获得它。因此,我们不能说为在OnInit()中获取句柄而编写的代码会完全解决这个问题,并且100%正确。))
我检查了用CopyBuffer函数 复制了多少数据,它总是写1,而且没有错误,但数据仍然是错误的。
我在测试器中得到了这个代码的结果。
//---
我在测试前做的唯一一件事就是在输出到日志之前只是转换了指标值。
你是说把处理程序的初始化从OnTick()移到OnInit()的想法本身就是错误的?
我在测试器中得到了这个代码的这个结果。
//---
我在测试前做的唯一一件事是在输出到日志前简单地转换指标值。
而没有 "如果"?而在这个特定的情况下?指标句柄是在 每个tick 期间的OnTick函数 中创建的,数据是在同一个tick期间复制的。这意味着每次都请求相同的指标句柄,而没有检查其有效性/无效性。在这种背景下,你还会继续争辩说,将手柄的初始化从OnTick()转移到OnInit()的想法 本身就是错误的 吗?
PS。看来你已经帮助了这个人,所以这个问题可以说是结束了。