RefreshRates()的更新内容 - 页 3

 
Artyom Trishkin:

如果你怀疑iXXXXX函数中存在错误,请使用SymbolInfoXXXX函数

可以用SymbolInfoXXXX 替换iXXXXX的例子。

 
Mikhail Nazarenko:

我的代码是类似的。在OnTick中出错

它应该是

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

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

我在Alpari真正的EURCHF M5上检查,而不是打印,我在每个级别上都画了横条。

是的,我一开始确实把H1写成这样,但后来觉得这样的比较太少了。所以我把它改成了M5。

Mikhail Nazarenko:

请允许我举个例子,用SymbolInfoXXXXXX 代替iXXXXXXX。

Artyom犯了一个小错误...

你可以用iClose来代替

int  CopyClose( 
   string           symbol_name,       // имя символа 
   ENUM_TIMEFRAMES  timeframe,         // период 
   int              start_pos,         // откуда начнем  
   int              count,             // сколько копируем 
   double           close_array[]      // массив для копирования цен закрытия 
   );

类似这样的事情

double close_M5[];
    CopyClose(_Symbol, PERIOD_M5, 1, 1, close_M5);

这样一来,你就可以用魔杖一动就得到几个小节的数值

该函数返回真或假,但我在这个例子中没有检查它。你可以自己猜测...

 
Alexey Viktorov:
是的,我最初就是这样写H1的,但后来我觉得这样的比较太少了。所以我把它改成了M5。

我在那里完成了你的代码,并把它贴在上面。我把你的版本放在我的版本中,结果是一样的。几乎每支M5蜡烛上都有一个错位。你的结果是什么?

 
Mikhail Nazarenko:

我在那里完成了你的代码,并把它贴在上面。我把你的版本放在我的版本中,结果是一样的。几乎每支M5蜡烛上都有一个错位。你的结果是什么?

这里我们需要改变

if(NewBar(PERIOD_M5))

if(NewBar(PERIOD_H1))
 
Alexey Viktorov:

在这里,我们必须改变

不,更好的是 _Period.因为我们将强行等待H1的零报价,而当前时期的报价被正确更新。数据应该在每小时的第一秒接收,而不是在每小时更新时接收。

我想补充到例子中,并检查
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);
    
    double ARRAY_M1[];
    CopyClose(_Symbol, PERIOD_M1, 1, 1, ARRAY_M1);
    double ARRAY_H1[];
    CopyClose(_Symbol, PERIOD_H1, 1, 1, ARRAY_H1);
    
    if(ARRAY_H1[0] != close_M5)
      Print(ARRAY_H1[0], " CopyClose H1 != M5 ", close_M5);
    if(ARRAY_M1[0] != close_M5)
      Print(ARRAY_M1[0], " CopyClose M1 != M5 ", close_M5);
   
     Comment(
               close_H1, " H1\n",
               close_M1, " M1\n",
               close_M5, " M5\n",
               ARRAY_H1[0], " CopyCloseH1\n",
               ARRAY_M1[0], " CopyCloseM1\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;
 }/******************************************************************/ 

 
Alexey Viktorov:

在这里,我们必须改变

其结果与iClose() 相同;iClose和CopyClose似乎从同一个地方获取数据。

Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
Документация по MQL5: Доступ к таймсериям и индикаторам / iClose
  • www.mql5.com
iClose - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Mikhail Nazarenko:

不,更好的是 _Period.因为我们将强行等待H1的零报价,而当前时期的报价被正确更新。数据应该在每小时的第一秒接收,而不是在每小时更新时接收。

我想对这个例子进行补充和检查

看来你根本不了解新栏出现的功能是如何运作的。

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() 时相同;iClose和CopyClose似乎从同一个地方获取数据。

当接收到新的TIKA值时,从OHLC接收条形闭合值和或其他,总是没有问题。
 
Alexey Viktorov:

你似乎根本不明白新的酒吧功能是如何运作的。

因此,也是如此。

当新的TIKA进来时,从OHLC获得条形收盘值和其他值,总是没有问题。

回答这个问题。为什么在一个新的蜡烛上,iClose(1)函数 给出的是过时的信息,而不是更新或错误?这是一个错误。

 
Mikhail Nazarenko:

回答一个问题。为什么在一个新的蜡烛上,iClose(1)函数 会返回过时的信息,而不是更新或错误?这是一个错误。

如果这是一个错误,那么每个人,或几乎每个人,都应该有这个问题。如果只有你,那就是代码中的问题。

我的EA在M15上确定了一个新的条形图H1。

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

而这是评论的内容。

不存在任何差异。

 
好了,感谢所有开发者的关注,我去创造像NewBar这样的拐杖了。))))主题关闭。