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:
好,谢谢谢谢