文章 "MQL5 Cookbook: 在MetaTrader 5策略测试器中分析仓位属性"

 

新文章 MQL5 Cookbook: 在MetaTrader 5策略测试器中分析仓位属性已发布:

我们将会展示一个来自前一篇文章,"MQL5 Cookbook: 自定义信息面板上的仓位属性"的修改版的EA交易。我们将会解决一些问题,包括从柱中获得数据,在当前交易品种中检查新柱事件,在文件中包含标准库中的交易类,创建一个函数来搜索交易信号,还有一个执行交易操作的函数以及在OnTrade()函数中判断交易事件。

MQL5 Cookbook: Analyzing Position Properties in the MetaTrader 5 Strategy Tester

作者:Anatoli Kazharski

 

晚上好,请帮助我,在函数 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:

晚上好,请帮助我,在函数 CheckNewBar 中,静态变量 new_bar 在第一行清零,然后函数的逻辑基于它是否等于零。请告诉我哪里不明白!

帮助说

使用关键字 static 声明的局部变量 在函数存在的 整个期间 保留其值。在函数的下一次调用中,这些局部变量的值与上一次调用时的值相同。

也就是说,在新调用 CheckNewBar() 函数时,new_bar 变量将保留上一次调用函数时的值,但在第一行中,它将被赋予一个新值 NULL......,然后我就不清楚为什么会出现这一切以及它是如何工作的了。请消除我的困惑,很有可能我是在某个地方犯傻了,但是 WHERE ?????

 
Sergey Voytsekhovsky:

晚上好,请帮助我,在函数 CheckNewBar 中,静态变量 new_bar 在第一行被清零,然后函数的逻辑基于它是否等于零。请告诉我哪里不明白!

如果我对帮助的理解正确的话,在static datetimenew_bar=NULL; 这一行中," 如果没有指定初始值,静态内存类变量的初始值为零"。所以根本就不应该用 null 来初始化,这样逻辑就不会有问题了。或不 ????

 
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
 
Vladimir Karputov:

变量必须始终初始化。这是一条不成文的规定。不遵守这条规定的人迟早会犯很难发现的错误:)


静态变量如何工作


打印到专家选项卡。OnTick() 的第一个输入是初始化一个静态变量,即一个新的条形图

好的,明白了,谢谢你简洁明了的回答。