晚上好,请帮助我,在函数 CheckNewBar 中,静态变量 new_bar 在第一行清零,然后函数的逻辑基于它是否等于零。请告诉我哪里不明白!
bool CheckNewBar() { //--- 当前条形图打开时间变量 static datetime new_bar=NULL; //--- 数组用于获取当前条形图的开盘时间 static datetime time_last_bar[1]={0}; //--- 获取当前条形图的开盘时间 // 如果在接收过程中出现错误,我们将报告该错误 if(CopyTime(_Symbol,Period(),0,1,time_last_bar)==-1) { Print(__FUNCTION__,":复制条形图打开时间出错:"+IntegerToString(GetLastError())+""); } //--- 如果这是第一次函数调用 if(new_bar==NULL) { // 设置时间 new_bar=time_last_bar[0]; Print(__FUNCTION__,":初始化 ["+_Symbol+"][TF: "+TimeframeToString(Period())+"][" +TimeToString(time_last_bar[0],TIME_DATE|TIME_MINUTES|TIME_SECONDS)+"]"); return(false); // 返回 false 并退出 } //--- 如果时间不同 if(new_bar!=time_last_bar[0]) { new_bar=time_last_bar[0]; // 设置时间并退出 return(true); // 记住时间并返回 true } //--- 我们到了这一步--所以条形图不是新的,让我们返回 false return(false); }
Sergey Voytsekhovsky:
如果我对帮助的理解正确的话,static datetimenew_bar=NULL; " 如果没有指定初始值,静态内存类变量的初始值为零。因此,根本就不应该用 null 来初始化,这样逻辑就完美无缺了。还是不可以?
变量必须始终初始化。这是一条不成文的规定。不遵守这条规定的人迟早会犯下难以发现的错误:)
静态变量如何工作:
//+------------------------------------------------------------------+ //|测试 EA。mq5 //|版权 © 2018, 弗拉基米尔-卡尔普托夫 || //|http://wmua.ru/slesar/ || //+------------------------------------------------------------------+ #property copyright "版权 © 2018 年,弗拉基米尔-卡尔普托夫" #property link "http://wmua.ru/slesar/" #property version "1.000" //+------------------------------------------------------------------+ //| 专家初始化函数| //+------------------------------------------------------------------+ int OnInit() { //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| 专家去初始化函数| //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| 专家勾选功能| //+------------------------------------------------------------------+ void OnTick() { //--- 我们只在新栏诞生时工作 static datetime PrevBars=0; Print("PrevBars ",PrevBars); datetime time_0=iTime(Symbol(),Period(),0); if(time_0==PrevBars) return; PrevBars=time_0; Print("New bar. PrevBars ",PrevBars); } //+------------------------------------------------------------------+
打印到专家选项卡。OnTick() 的第一个输入是初始化一个静态变量,一个新的条形图。
2018.01.08 00:00:00 PrevBars 1970.01.01 00:00:00 2018.01.08 00:00:00 New bar. PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:30 PrevBars 2018.01.08 00:00:00 2018.01.08 00:00:59 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 PrevBars 2018.01.08 00:00:00 2018.01.08 00:01:00 New bar. PrevBars 2018.01.08 00:01:00 2018.01.08 00:01:30 PrevBars 2018.01.08 00:01:00 2018.01.08 00:02:00 PrevBars 2018.01.08 00:01:00
附加的文件:
Test_EA.mq5
4 kb
新文章 MQL5 Cookbook: 在MetaTrader 5策略测试器中分析仓位属性已发布:
我们将会展示一个来自前一篇文章,"MQL5 Cookbook: 自定义信息面板上的仓位属性"的修改版的EA交易。我们将会解决一些问题,包括从柱中获得数据,在当前交易品种中检查新柱事件,在文件中包含标准库中的交易类,创建一个函数来搜索交易信号,还有一个执行交易操作的函数以及在OnTrade()函数中判断交易事件。
作者:Anatoli Kazharski