mql5如何实现仅在所操作品种的新柱线建立时调用一个函数

 
例如mql5标准程序库Expert类中如果 every_tick 设置为 to true, 则 Processing() 方法在所操作品种的每次报价时都被调用。否则, 方法 Processing() 仅在所操作品种的新柱线建立时被调用。请问如何实现该功能?
 

如果是基于新的K线产生时调用一次函数,你可以写个函数判断有没有新的K线。

 
Ziheng Zhuang:

如果是基于新的K线产生时调用一次函数,你可以写个函数判断有没有新的K线。


谢谢,就是想问如何判断是否产生新的k线?

 
xkyup:

谢谢,就是想问如何判断是否产生新的k线?


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
      bool newBar = false;
      newBar = IsNewBar();//当前图表是否有新K线
      newBar = IsNewBar(PERIOD_CURRENT);//也是判断当前图表是否有新K线
      
      
      //... 判断其他周期
      newBar = IsNewBar(PERIOD_H1);//H1周期是否有新K线
      
      
  }
//+------------------------------------------------------------------+

bool IsNewBar(ENUM_TIMEFRAMES tf=0)
  {
   static int cnt=0;
   if(cnt!=Bars(Symbol(),tf)) 
     {
      cnt=Bars(Symbol(),tf);
      return(true);
     }

   return(false);
  }
//+------------------------------------------------------------------+
 
Ziheng Zhuang:

感谢感谢:)

 
Ziheng Zhuang:

您好,我发现在我的电脑上这个函数无法实现该功能。

于是我便试着每次输出等了好几分钟,结果他一直输出的都是100000100000,也就是说两个数值一直都是100000

bool IsNewBar(ENUM_TIMEFRAMES tf=0)
  {
   static int cnt=0;

   Print(cnt,Bars(Symbol(),tf));

   if(cnt!=Bars(Symbol(),tf)) 
     {
     
      cnt=Bars(Symbol(),tf);
      return(true);
     }

   return(false);
  }
 
xkyup:

您好,我发现在我的电脑上这个函数无法实现该功能。

于是我便试着每次输出等了好几分钟,结果他一直输出的都是100000100000,也就是说两个数值一直都是100000


 没有新的K线所以一直不变,直到有新的K线。

 
Ziheng Zhuang:


 没有新的K线所以一直不变,直到有新的K线。

 if(MyBars(PERIOD_CURRENT))
   Print("-----------:)O(:-----------");

谢谢,我用这条语句来检测它是否会成功,(时间周期M1)结果是:

在测试环境下,他是成功的,可以实现功能。

但如果把该ea应用到图表上(模拟盘),除了刚应用上反应了一次以外,我就一直等了十几分钟,却一直没有反应

另外,如我在上面所说,在print(cnt);时

bool MyBars(ENUM_TIMEFRAMES tf=0)
  {
   static int cnt=0;

   Print(cnt);//该行一直输出100000,并且我已经等了好多个时间周期了

   if(cnt!=Bars(Symbol(),tf)) 
     {
     
      cnt=Bars(Symbol(),tf);
      return(true);
     }

   return(false);
  }
 
xkyup:

谢谢,我用这条语句来检测它是否会成功,(时间周期M1)结果是:

在测试环境下,他是成功的,可以实现功能。

但如果把该ea应用到图表上(模拟盘),除了刚应用上反应了一次以外,我就一直等了十几分钟,却一直没有反应

另外,如我在上面所说,在print(cnt);时


这个应该是MT5的bug。

换一种解决办法,用开盘时间来判断是否有新的K线。

 
//+------------------------------------------------------------------+
//|                                                    test_Bars.mq5 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("EA load time = ",TimeToString(TimeCurrent(),TIME_DATE|TIME_SECONDS));
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(IsNewBar2(PERIOD_M1))
      Print("New M1 bar");

   int n=Bars(Symbol(),PERIOD_M1);
   Comment("n= ",n);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar(ENUM_TIMEFRAMES tf=0)
  {
   static int cnt=0;
   if(cnt!=Bars(Symbol(),tf))
     {
      cnt=Bars(Symbol(),tf);
      return(true);
     }

   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
datetime Time(ENUM_TIMEFRAMES tf=0)
  {
   datetime t[1];
   if(CopyTime(Symbol(),tf,0,1,t)==1)
      return(t[0]);

   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool IsNewBar2(ENUM_TIMEFRAMES tf=0)
  {
   static datetime cnt=0;
   if(cnt!=Time(tf))
     {
      cnt=Time(tf);
      return(true);
     }

   return(false);
  }

//+------------------------------------------------------------------+
 
Ziheng Zhuang:

好,谢谢谢谢