新MQL4中的离线图表

MetaQuotes | 26 二月, 2014

更新的MQL4具有存储历史数据的新格式,并提供相应的MqlRates结构,便于时间,开盘,最低,最高,收盘和交易量值的存储。多年来,交易者们已经开发出收集和存储他们在HST文件中的数据,用于生成离线图表的MQL4应用。我们可以向您保证,所有先前编译的EX4文件在新的MetaTrader 4程序端将以之前相同的方式工作。


所有旧的EX4程序在新的MetaTrader 4程序端工作

如前所述,更新程序端时旧编译器编译的自定义可执行EX4文件将不会被单独删除或改变。这意味着程序端标准配置中不包含的您尝试和测试的所有应用程序将被自动复制到新位置并保持随时工作。


MetaTrader 4程序端的离线图表

标准交付的新客户端包含更新的PeriodConverter脚本,可以生成新格式的HST文件。不过,如果您有一个基于旧period_converter脚本并且用旧的编译器编译的程序,他们会正常工作。

假设我们有由旧版本开发的编译的period_converter_509.ex4脚本。在升级过程中,它会自动被复制到新的存储位置,现在可用于在导航窗口启动。我们把它应用到EURUSD M1图表来创建EURUSD M2自定义历史。



倍增默认设置为3。我们将它更改为2。我们还应该确保相应历史形成后,使DLL调用能够管理我们将要打开的离线EURUSD M2图表。。

只要脚本报告了生成数据文件到专家日志,那么转到文件 - 打开离线并找到EURUSD M2线。那就是我们的脚本数据。


离线图表打开后,脚本继续EURUSD M1的工作和处理新到达的实时订单号。当它发现离线图表在指定时间被打开后,每隔两秒它开始发送更新命令到那个图表。


因此,由旧版本编译器编译的旧脚本成功运行在激活所有内置功能的新程序端。

完成所有说明步骤:下载附加可执行文件period_converter_509.ex4,并把它放到<data folder>\MQL4\Scripts。



更新新编译器的旧脚本

在某些时候,您可能需要改变您应用程序的源代码,并在新MetaEditor里编译它。在这里我们将展示如何使用period_converter_509脚本作为例子通过两个小的修正考虑MQL4语言的变化。当然,我们可以不做任何变化的编译period_conveter_509.mq4源代码,并且它会奏效。但考虑语言的变化并对代码作出微小的修改会更好。

打开文件时应明确指定共享访问模式
您可能还记得,在旧版MQL4所有文件都以共享访问模式打开。在新版MQL4,打开文件时,FILE_SHARE_WRITE和FILE_SHARE_READ标志应明确指定以便共享使用。如果标记不存在,该文件以独有模式打开,并且直到被打开它的用户关闭才可以被其他人打开。这正是我们所需要的行为,因为我们要打开MetaTrader 4程序端中脚本生成的历史数据文件作为离线图表。因此,我们只是添加两个标志到FileOpenHistory()函数调用:

   // 1-st change - add share flags
   ExtHandle=FileOpenHistory(c_symbol+i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);

现在, FileFlush()会立刻在磁盘 刷新存储的数据
FileFlush()函数也常常用在旧脚本中。没有必要在第一个文件生成过程中每个柱的数据记录后调用它。记录非标准交易品种和/或时限上准备的所有数据时的最后去做就足够了。事实是,FileFlush()函数的实施在新版本的MQL4语言中已经改变,以便使即时数据刷新到物理驱动器。旧版本使用了数据回写,并且多次调用不会导致脚本​​运行放缓。

last_fpos=FileTell(ExtHandle);
last_volume=Volume[i];
//--- write generated bar data
FileWriteInteger(ExtHandle, i_time, LONG_VALUE);
FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE);
FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE);
// 2-nd change - remove FileFlush from here
//FileFlush(ExtHandle);

这两项修正为period_converter_580.mq4后让我们保存得到的文件并编译它。您可以从本文附带的文件下载。现在,我们打开另一个EURUSD M1图表和运行参数3脚本,以创建一个三分钟的非标准EURUSD图表。


生成的数据文件后,我们打开它为一个离线EURUSD M3图表。


正如预期的那样,图表被打开之后,启动的period_converter_580脚本检测到它并发送一个消息到日志。从现在起,它就会不超过每2秒一次地发送更新命令到离线图表。


因此,我们已经测试之前历史数据存储格式的工作,并确保一切都像以前一样工作。


新PeriodConverter脚本

标准交付的新MetaTrader 4客户端版本也包含执行其前身相同任务的PeriodConverter脚本。但是,它与旧版还是有一些细微的差别,因为它是使用新的源代码风格进行开发的。此外,它的特点是MQL4语言的新可能性。

与以前版本最重要的区别在于使用新的MqlRates结构,开发新格式的价格柱数据工作:

if(time0>=rate.time+periodseconds || i==0)
  {
   if(i==0 && time0<rate.time+periodseconds)
     {
      rate.tick_volume+=(long)Volume[0];
      if(rate.low>Low[0])
         rate.low=Low[0];
      if(rate.high<High[0])
         rate.high=High[0];
      rate.close=Close[0];
     }
   last_fpos=FileTell(ExtHandle);
   last_volume=(long)Volume[i];
   FileWriteStruct(ExtHandle,rate);
   cnt++;
   if(time0>=rate.time+periodseconds)
     {
      rate.time=time0/periodseconds;
      rate.time*=periodseconds;
      rate.open=Open[i];
      rate.low=Low[i];
      rate.high=High[i];
      rate.close=Close[i];
      rate.tick_volume=last_volume;
     }
  }

积极使用离线图表的MQL4开发者们将很快意识到新方法带来的便利性。

用于存储价格,交易量和点差信息的结构

struct MqlRates
  {
   datetime time;    // period start time
   double open;      // Open price
   double high;      // High price for the period
   double low;       // Low price for the period
   double close;     // Close price
   long tick_volume; // tick volume
   int spread;       // spread
   long real_volume; // trade volume
  };

让我们编译新PeriodConverter脚本,并在新EURUSD M1图表上启动它,与以前一样。


在这个时候,我们正为离线EURUSD M4 图表准备数据。因此,乘数等于4。


数据准备好后,我们以相同的方式打开离线图表。


正如您所看到的,脚本的所有三个版本都做类似的工作。使用自定义交易品种图表或非标准时间表的所有交易者们将能够用新版的MetaTrader 4程序端使用他们,以及改善现有的源代码和开发新的源代码。切换到新版本时不会有根本性的变化或困难在等待着你。


结论

  1. 新程序端工作的离线图表以之前相同的方式工作。支持新版和旧版两种历史数据格式。
  2. 旧 EX4文件在新版程序端中保留其功能。
  3. 使用所有新语言功能开始开发新的MQL4应用程序并发掘其全部的潜力。

相关文章:

  1. 在非标准时间表上测试EA交易
  2. 日中交易的时间变换原则
  3. 等量图表再访问
  4. 合成柱 - 一个新的层面来显示价格的图形信息
  5. “自由之孔”图表