RefreshRates()的更新内容 - 页 2

 
iClose: 零 - 错误。该函数没有给出一个错误。它给出了一个目前已经过时的值。
 
我在这里读到,"iClose() 从经纪人的服务器上获取数值",如果这些函数的数据是由诚实的经纪人产生的,那么一切都会水到渠成。))事实证明,我们只能相信当前的蜱虫。
 
Artyom Trishkin:
不,它不是。在函数帮助中,关于返回值是怎么写的?
关闭

返回的值

相应图表的条形收盘价(由shift参数指定)的值,如果有错误,则为0。调用GetLastError()来获取更多的错误信息。

它说,如果不是0,那么就没有错误。但这个值也没有变化......,所以没有RefreshRates();也不会更新,这让我很吃惊。
 
Mikhail Nazarenko:

而如果你把时间框架改成与当前不同的时间框架,即使使用RefreshRates(),数据也不会及时更新。所以MT4中的iClose等基本功能产生了不相关的废话。我确信80%的信息都没有考虑到MT4的这些独特功能。如何生活?)

改变时间框架不会有任何作用。当前的iClose值等于Bid值,与图表周期 无关。
 
Alexey Viktorov:
变化关闭不会带来任何好处。无论图表周期 如何,iClose的当前值等于Bid值。

我做了一个EA,在M5上运行了一天。在小时变化时,它为每个数值画出水平线:iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_M5,1),iClose(symbol,PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - 它显示与图表上完全一样。
  2. 出价很接近,这是下一个刻度
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_M1,1) - 有时它们是一样的,有时,特别是在晚上的时候,它们显示的完全是狗屎,甚至在RefreshRates()被连接之后。

向开发商提问。如果 MQL4中的iClose 函数不能提供正确的信息,也没有办法更新它的数据,那么我们为什么还需要它呢

 
Mikhail Nazarenko:

我做了一个EA,在M5上运行了一天。在小时变化时,它为每个数值画出水平线:iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_M5,1),iClose(symbol,PERIOD_ M1,1 ),Close[1],Bid

  1. iClose(symbol, PERIOD_ M5,1 ),Close[1] - 它显示与图表上完全一样。
  2. 出价很接近,这是下一个刻度
  3. iClose(symbol,PERIOD_H1,1),iClose(symbol,PERIOD_M1,1) - 有时它们是一样的,有时,特别是在晚上的时候,它们显示的完全是狗屎,甚至在RefreshRates()被连接之后。

向开发商提问。为什么MQL4需要iClose 函数,如果它们不能提供可靠的信息,也没有办法更新它们的数据?

这是无稽之谈。RefreshRates()的调用只有在执行因任何原因被延迟时才是必要的。如长周期或只是在发送订单的瞬间更新价格的情况下开出订单。在你的变体中不应该有任何问题。最好贴出一个将价格值弄得如此错误的代码例子。

我现在正在运行以下代码

double close_H1,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_M5, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    if(close_H1 != close_M1)
      Print(close_H1, " != ", close_M1);
   }
  Comment(close_H1, "\n",
          close_M1, "\n"
         );
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/
事实上,分钟闭合应该与图表上的 任何高点时期 相吻合。我稍后会检查一下,看看日志中是否有什么记载。
 
Mikhail Nazarenko:

而且,如果你把时间框架改成与当前不同的时间框架,数据将停止及时更新,即使使用RefreshRates()

是否有任何测试代码来证实这一说法?我自己没有注意到这一点。切换TF时,我们只需等待历史被调换,然后工作。


所以,iClose和MT4的其他基本功能产生了不相关的废话。

这个断言太响亮了。有时是有可能的,但这就是错误代码 的作用。如果你不检查它们,你将永远不知道你是否能使用你得到的结果。


我确信80%的信息产品都没有考虑到MT4的这些独特功能。如何生活?)

我还要说:几乎所有的程序都没有考虑到这些特点。这就是为什么他们的新版本会被发布。一旦一个产品不再被支持,它就无法使用。

Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
Документация по MQL5: Константы, перечисления и структуры / Коды ошибок и предупреждений
  • www.mql5.com
Коды ошибок и предупреждений - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Alexey Viktorov:

这是无稽之谈。只有在执行过程中由于某种原因出现了延迟时,才有必要调用RefreshRates()。像长周期或只是在发送订单时更新价格的情况下开单。在你的变体中不应该有任何问题。最好贴出一个将价格值弄得如此错误的代码例子。

我现在正在运行这样的代码

从本质上讲,分钟收盘价应该与图表上的 任何高点时期 相吻合。稍后我将看看日志中是否有什么内容。

我的代码与此类似。在OnTick中出现了一个错误。

close_H1 = iClose(_Symbol, PERIOD_M5, 1);

它应该是

close_H1 = iClose(_Symbol, PERIOD_H1, 1);
close_M5 = Close[1];
 if(close_H1 != close_M5)
	 Print(close_H1, " != ", close_M5);
if(close_M1 != close_M5)
	 Print(close_M1, " != ", close_M5);


如果我们有当前的时间框架M5,我们应该将M5与H1和M1进行比较。

当前的时间框架M5显示正确。问题出在H1和M1上。

我在Alpari real EURCHF M5上检查了一下,但我没有用Print,而是在每个级别上画了横杠。

 
Ihor Herasko:

是否有任何测试代码来支持这种说法?我自己没有注意到这一点。当切换TF时,我们只需等待历史的交换,然后工作。


这句话太响亮了。在某些情况下这是可能的,但这就是错误代码 的作用。如果你不检查它们,你将永远不知道你是否能使用你得到的结果。


让我多说一句:几乎所有的程序都没有考虑到一些问题。这就是为什么他们的新版本会被发布。一旦一个产品不再被支持,它就无法被使用。

这是代码,把它放进去看看。我并不是每根蜡烛都有火柴。Alpari real EURCHF M5。

double close_H1,close_M5,
       close_M1;

/*******************Expert initialization function*******************/
int OnInit()
 {
  return(INIT_SUCCEEDED);
 }/*******************************************************************/

/************************Expert tick function************************/
void OnTick()
 {
  if(NewBar(PERIOD_M5))
   {
    close_H1 = iClose(_Symbol, PERIOD_H1, 1);
    close_M1 = iClose(_Symbol, PERIOD_M1, 1);
    close_M5 = Close[1];
    
    if(close_H1 != close_M5)
      Print(close_H1, " H1 != M5 ", close_M5);
    if(close_M1 != close_M5)
      Print(close_M1, " M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n"
            );
         
  }       
 }/******************************************************************/

/**********************Expert OnDeinit function**********************/
void OnDeinit(const int reason)
 {
  Comment("");
 }/******************************************************************/

bool NewBar(ENUM_TIMEFRAMES tf)
  {
   static datetime nt = 0;
   datetime tm = iTime(_Symbol, tf, 0);
   if(tm == 0)
      return false;
   if(tm != nt)
     {
      nt = tm;
      return true;
     }
   return false;
 }/******************************************************************/

 
Mikhail Nazarenko:
iClose: 零 - 错误。该函数不报告错误。输出一个目前已经过时的值。

如果你怀疑iXXXXXXX函数中有错误,请使用SymbolInfoXXXX函数

原因: