在EA中用Bars()这个函数要小心了,有些情况下返回值不正确,用在for循环遍历所有bar取数据时候,很容易让人抓狂

 

(我的帖子突然没了,可能是我的网络时断时续造成刷新不畅,写了很多内容却被我在着急刷新的过程中点错删除了)

void CheckBarNumber()
  {
   double c[];
   int allBarCount;
   allBarCount=Bars(Symbol(),Period());
   Print("");
   Print("------------------------------------------------------------");
   CopyClose(Symbol(),Period(),0,allBarCount,c);
   Print("数组数量为:",ArrayRange(c,0));
   Print("Bars(Symbol(),Period())=",allBarCount);
   Print("iBars(Symbol(),Period())=",iBars(Symbol(),Period()));
   Print("ChartGetInteger(0,CHART_WIDTH_IN_BARS)=",ChartGetInteger(0,CHART_WIDTH_IN_BARS));
   Print("ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR)=",ChartGetInteger(0, CHART_FIRST_VISIBLE_BAR));
   Print("ChartGetInteger(0, CHART_WINDOWS_TOTAL)=",ChartGetInteger(0, CHART_WINDOWS_TOTAL));
   Print("TerminalInfoInteger(TERMINAL_MAXBARS)=",TerminalInfoInteger(TERMINAL_MAXBARS));
   Print("ChartGetInteger(0, CHART_VISIBLE_BARS)=",ChartGetInteger(0,CHART_VISIBLE_BARS));
  }

当“max bars in chart” 设定为:

1.无限

2.任意数字

的时候.bars()函数和close数组的arrayRange结果会出现不一致.

这也是如果有人使用bars来控制for循环取ohlc数据时候容易出现out of range问题.

我上次写的一大段话都删掉了,简略写写,抱歉.

ps:mql5的代码编辑器和rdp6.1不兼容,好像代码编辑器对于剪贴板功能做了修改,第三次复制粘贴时候剪贴板的功能就没办法用了.我该在那里提交bug?

 

類似的問題我也遇到 在這情況下 我將歷史資料重新下了一次 部分時候能改善 

後來將range限定在 for循環裡面 也能改善 

因為不是常態性的異常 所以我認為是我編程邏輯的問題

也因為是交易指標使用 非必要性的 所以後來放棄 另外找新的方法做指標

 
Hung Wen Lin:

類似的問題我也遇到 在這情況下 我將歷史資料重新下了一次 部分時候能改善 

後來將range限定在 for循環裡面 也能改善 

因為不是常態性的異常 所以我認為是我編程邏輯的問題

也因為是交易指標使用 非必要性的 所以後來放棄 另外找新的方法做指標

从我做的测试来看,不是你的问题,也不是编程的问题。而是mql5对于ea设计从一开始就考虑到历史数据会降低程序性能,所以从编程环境上倾向于让使用者使用滑动窗口尽可能只计算眼前所使用的数据,对于指标则是推荐从0计算到最后一根bar。

不过那样我所遇到一个问题就是效验计算结果。

我喜欢把程序标准化,模块化,通用化。

所以还在构思一个通用性高检验模块,做到非入侵式效验运算结果。

 

1. Bars(...)返回值与MT5设置的 MAX BARS没有关系

2. for循环中用实际拷贝到的数据个数:

   int total = CopyClose(...);
   for(int i=0;i<total;i++)
     {
      
     }
 
Ziheng Zhuang:

1. Bars(...)返回值与MT5设置的 MAX BARS没有关系

2. for循环中用实际拷贝到的数据个数:

是这样的。

所以用Bars获取到的bar个数来循环数组个数就会报错。

我没找到更好的办法解决 如何获取到与数组对应的bar的个数,当下只能用arrayRange这个函数 来解决问题了

原因: