MetaTrader 5新功能

桌面版,移动版和网页平台的更新历史

18 一月 2017
MetaTrader 5 Android build 1506:交易筛选和排序
  • 交易和历史标签现在提供排序的功能,可以帮助您按照交易品种(金融工具),订单和持仓/平仓时间对全部交易进行排序。除了排序功能以外,历史标签还可以根据不同的交易品种筛选交易。

  • 同时优化了多窗口模式下的图表工作。经过改进的菜单不但可以打开新窗口,删除旧窗口,还可以将其重新排列并选择想要的布局(垂直布局,水平布局或拼图布局)。

9 十二月 2016
MetaTrader 5 Build 1495:改善MQL5处理自定义图形的功能

MQL5:

  1. 添加CopyTicksRange函数。
  2. 添加改善的抗锯齿函数到CCanvas类:
  3. 在MQL5参考文档中添加图形程序库的描述。该程序库可以直接在价格图表上创建直方图,分布图和线性图。
  4. 添加系统键状态标识符到客户端属性常量列表。调用TerminalInfoInteger(TERMINAL_KEYSTATE_XXX)返回GetKeyState()函数在MSDN相同键的状态代码。
  5. 禁用支持分配字符串类型到bool。检查字符串之前,需要使用明确的条件。例如,在新版本中,编译以下代码将会出现错误:
    string str;
    ...
    if(str)                        // 将会导致"不能转换'string'类型到'bool'"编译错误(在之前版本不会出现错误)
       Print("str is true");
    应该使用明确的条件:
    string str;
    ...
    
    //--- 检查字符串是否被初始化
    if(str!=NULL)
       Print("str is true");
    
    or
    
    //--- 检查字符串值是否为"true"
    if(StringCompare(str,"true",false))
       Print("str is true");
    
    or
    
    //--- 检查字符串是否为不等于零的整数
    if((int)str!=0)
       Print("str is true");

修正崩溃日志中报告的错误。

2 十二月 2016
MetaTrader 5 网页平台:双重认证及更改密码
  • 我们已经添加了使用动态密码的双重认证选项,从而提高账户保护性能,防止未经授权的账户访问。启用双重认证功能之前,请先启动MetaTrader 5移动应用程序。登录并在设置窗口选择动态密码(OTP)生成选项。OTP生成器可以绑定您的全部交易账户并为每个账户自动生成一个唯一的六位动态密码。登录网页平台时输入该动态密码。





  • 另一个新选项就是可以改变主密码和只读密码。赶快抓住这个机遇,创建一个好记的个人ID吧。
  • 同时,更新的网页平台可以自动生成模拟账户。现在,您可以使用任何浏览器启动MetaTrader 5网页平台,即刻开始外汇、股票、期货或等金融交易品种的交易。
24 十一月 2016
MetaTrader 5 Build 1485: 附加测试模式和标准程序库的图形

程序端

  1. 更改了程序端和MetaEditor日志中的条目顺序。更新之前,首先突出最新的日志条目。现在,日志会最先显示之前的条目。更传统的逆向排列顺序使得阅读日志更加轻松。




    此外,现在使用日志快捷菜单还可以隐藏'时间'和'源'所在列。

  2. 在锁仓模式,平仓的单号现在会显示在交易历史记录的订单和交易。这可以更轻松的查找相关的打开和关闭操作。




  3. 修正相同工具下导致从现有持仓到新持仓复制SL/TP的错误。当在锁仓模式使用一键交易功能(例如,从图表或从市场报价窗口)时可能发生该错误。
  4. 修正超高清屏幕(4K)下箭头对象的显示。

MQL5

  1. 添加新的打印简单类型和结构到数组日志的ArrayPrint功能。
    void  ArrayPrint(
       const void&   array[],             // 输出数组
       uint          digits=_Digits,      // 小数位数
       const string  separator=NULL,      // 结构字段值之间的分隔符
       ulong         start=0,             // 最先显示元素的指数
       ulong         count=WHOLE_ARRAY,   // 显示的元素数
       ulong         flags=ARRAYPRINT_HEADER|ARRAYPRINT_INDEX|ARRAYPRINT_LIMIT|ARRAYPRINT_ALIGN    
       );
    
    ArrayPrint无法打印全部结构数组字段到日志 – 跳过对象的数组字段和指针字段。如果您想打印全部结构字段,您应该使用所需格式批量打印的定制功能。
    //--- 显示最近的10个柱形图值
       MqlRates rates[];
       if(CopyRates(_Symbol,_Period,1,10,rates))
         {
          ArrayPrint(rates);
          Print("Проверка\n[time]\t[open]\t[high]\t[low]\t[close]\t[tick_volume]\t[spread]\t[real_volume]");
          for(int i=0;i<10;i++)
            {
             PrintFormat("[%d]\t%s\t%G\t%G\t%G\t%G\t%G\t%G\t%I64d\t",i,
             TimeToString(rates[i].time,TIME_DATE|TIME_MINUTES|TIME_SECONDS),
             rates[i].open,rates[i].high,rates[i].low,rates[i].close,
             rates[i].tick_volume,rates[i].spread,rates[i].real_volume);
            }
         }
       else
          PrintFormat("CopyRates failed, error code=%d",GetLastError());
    //--- 日志示例
    /*
                        [time]  [open]  [high]   [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295         18110       10   17300175000
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.11930 1.12747         17829        9   15632176000
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744         13458       10    9593492000
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194         15362        9   12352245000
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172         16833        9   12961333000
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052         15933        8   10720384000
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528         11888        9    8084811000
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915          7284       10    5087113000
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904          8710        9    6769629000
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263          8956        7    7192138000
       Check
       [time] [open] [high] [low] [close] [tick_volume] [spread] [real_volume]
       [0] 2016.11.09 04:00:00 1.11242 1.12314 1.11187 1.12295 18110 10 17300175000 
       [1] 2016.11.09 05:00:00 1.12296 1.12825 1.1193 1.12747 17829 9 15632176000 
       [2] 2016.11.09 06:00:00 1.12747 1.12991 1.12586 1.12744 13458 10 9593492000 
       [3] 2016.11.09 07:00:00 1.12743 1.12763 1.11988 1.12194 15362 9 12352245000 
       [4] 2016.11.09 08:00:00 1.12194 1.12262 1.11058 1.11172 16833 9 12961333000 
       [5] 2016.11.09 09:00:00 1.11173 1.11348 1.10803 1.11052 15933 8 10720384000 
       [6] 2016.11.09 10:00:00 1.11052 1.11065 1.10289 1.10528 11888 9 8084811000 
       [7] 2016.11.09 11:00:00 1.10512 1.11041 1.10472 1.10915 7284 10 5087113000 
       [8] 2016.11.09 12:00:00 1.10915 1.11079 1.10892 1.10904 8710 9 6769629000 
       [9] 2016.11.09 13:00:00 1.10904 1.10913 1.10223 1.10263 8956 7 7192138000 
    */
    

  2. 修正添加字符串类型S1=S2+S1的错误
  3. 更改ArrayResize函数的行为。如果 -1作为reserve_size参数传递,如果函数没有增加数组大小,函数仅释放未使用(保留)的内存。 以reserve_size=-1设置新数组大小为0相当于ArrayFree调用。新行为可以优化MQL5程序的内存使用率。
    void OnStart()
      {
       int arr[];
    //--- 最初使用的内存数量 
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 用于数组大小1的内存数量,保留
       ArrayResize(arr,1,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 增加数组以后,使用的内存数量因保留而无法更改
       ArrayResize(arr,1024*512,1024*1024);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 减少数组以后,内存大小也不会改变
       ArrayResize(arr,1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
    //--- 移除储备内存后将释放未使用的内存
       ArrayResize(arr,1,-1);
       Print("Array size:",ArraySize(arr)," Memory used:",MQLInfoInteger(MQL_MEMORY_USED)," MB");
      }
    

  4. 图表绘制函数已经添加到标准程序库。若要使用新功能,请将 MQL5\Include\Graphics\Graphic.mqh 加入到您的项目。

    基于三个数据系列使用GraphPlot绘制图表:
    #include <Graphics/Graphic.mqh>
    
    double Func1(double x) { return MathPow(x,2); }
    double Func2(double x) { return MathPow(x,3); }
    double Func3(double x) { return MathPow(x,4); }
    
    void OnStart()
      {
       GraphPlot(Func1,Func2,Func3,-2,2,0.05,CURVE_LINES);
      }
    
    
    结果:


    基于数据数组使用GraphPlot绘制图表:
    #include <Math/Stat/Binomial.mqh>
    #include <Graphics/Graphic.mqh>
    
    void OnStart(void)
      {
       double    vars[101];
       double    results[101];
       const int N=2000;
    //---  
       MathSequence(0,N,20,vars);
       MathProbabilityDensityBinomial(vars,N,M_PI/10,true,results);
       ArrayPrint(results,4);
       GraphPlot(results);
    //---
      }
    
    结果:



  5. 更新标准程序库中处理数学统计的函数。我们已经彻底检查了MQL5版和源R语言所有函数的质量和准确性。若要控制准确度和性能速度,单元测试可以沿着静态库进行分布。它们可以在\MQL5\Scripts\UnitTests\Stat目录取得。

    • TestStat.mq5 — 是测试计算结果的主要测试脚本
    • TestPrecision.mq5 — 计算精度的测试
    • TestBenchmark.mq5 — 测试包括计算测量性能

Tester

  1. 该更新强调了测试期间配置执行延迟的高级设置。现在您可以在多种交易条件下测试您的EA交易,包括无延迟的理想情况和任何自定义设置的延迟。



    在早期版本只提供随机延迟模式

  2. 修正在'基于高开低收的M1'模式生成柱形图的报价量。
  3. 修正锁仓模式交易时订单和持仓建立时间说明提高到毫秒。
  4. 修正'真实报价'模式下多货币或多时间周期模式期间可能出现的'旧报价'错误。
  5. 改进从位于磁盘的数据库阅读请求报价时的CopyTicks性能速度。

MetaEditor

  1. 导航条和工具箱中的文件快捷菜单现在突出了处理源代码版本库MQL5存储的命令。




  2. 修正处理存储中超过1024文件时可能偶尔破坏本地MQL5存储库完整性的错误。
  3. 修正MQL5存储文件树的显示。
  4. 修正批量文本替换的显示。

更新文档。

24 十一月 2016
MetaTrader 5 iOS build 1425
  • 改进图表上的一键交易面板:现在也可用在纵向模式;通过从列表选择意向值快速改变交易量。 

  • 图表交易品种现在可以通过在窗口标题点击交易品种名称进行更改。
  • app设置版块的改进:现在可以突出当前账户信息,合理安排单元和改进设计。
  • 多项改进和修正。
14 十月 2016
MetaTrader 5平台Build 1455:MQL5 的数学函数库

程序端

  1. 在交易对话框添加买入,卖出和关闭按键的工具提示。工具提示包括操作期间买入或卖出安全性的信息,以帮助新手了解交易的过程。




  2. 在“交易”和“历史”标签添加订单,交易和持仓的新图标。




  3. 更新的程序端提供了优化及更快(最高加速4-5倍)的市场深度,市场深度报价图表以及成交时间&交易量数据的展示和更新。
  4. 修正非交易时间报价历史的同步。这一过程在某些情况下可能会消耗过多的网络流量。

MQL5

  1. 标准程序库中加入了MQL5版的ALGLIB数值分析库

    程序库特点

    • 线性代数
    • 线性和非线性方程组
    • 插值
    • 优化
    • 快速傅里叶变换
    • 数值积分
    • 线性和非线性最小平方拟合
    • 常微分方程
    • 特殊函数
    • 描述性统计和假设测试
    • 数据分析 - 分类,回归
    • 多种精确算法中的线性代数,插值等的实施算法(使用MPFR)

    如何使用

    ALGLIB 文件位于\MQL5\Include\Math\Alglib。若要使用这些函数,请将主程序文件添加到您的程序:

     #include <Math\Alglib\alglib.mqh> 

  2. 标准程序库包含了数理统计函数。MQL5 现在提供R语言的功能,这是最好的统计数据处理和分析工具之一。

    程序库特点

    统计程序库包含计算数据统计特征的函数以及统计分布操作的函数:

    • 计算数组元素统计特征的函数
    • 统计分布操作的选项:常态分布,对数常态分布,贝塔分布等。

    如何使用

    统计程序库文件位于 \MQL5\Include\Math\Stat。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:

    #include <Math\Stat\Binomal.mqh>
    #include <Math\Stat\Cauchy.mqh>
    
    
    

    程序库函数的详细描述可在文章MQL5统计分布 - 使用最好的R中得到。


  3. 标准程序库中加入了MQL5版的Fuzzy程序库。Fuzzy程序库实现了Mamdani和Sugeno模糊推理系统。

    程序库特点

    • 13 个成员函数
    • 灵活的开发模糊系统规则的形式
    • Mamdani模糊推理系统
    • Sugeno模糊推理系统
    • Mamdani - 类型系统的5种去模糊化方式
    • 无限数量的输入输出变量

    如何使用

    Fuzzy程序库文件位于\MQL5\Include\Math\Fuzzy。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:

    #include <Math\Fuzzy\mamdanifuzzysystem.mqh>
    #include <Math\Fuzzy\sugenofuzzysystem.mqh>
    
    
    

    程序库的详细描述可在代码库:Fuzzy - 开发模糊模型的程序库中得到


  4. CHART_QUICK_NAVIGATION新属性允许在图表中启用/禁用快速导航栏。如果您需要更改和访问属性状态,请使用ChartSetInteger和ChartGetInteger函数。




    导航栏可以通过按下回车或空格键来打开。它允许您快速转到图表上的指定日期,以及切换到交易品种和时间周期。如果您的MQL5程序会处理按下回车或空格键,请禁用CHART_QUICK_NAVIGATION属性,以避免程序库拦截这些事件。快速导航栏仍然可以通过双击打开。

  5. 添加了FileLoad和FileSave新函数。它们提供了一种简单的阅读和数组保存到文件的方式。不同于FileRead*和FileWrite*,这些函数不需要指标处理程序。FileLoad和FileSave操作数值类型的数组,以及没有字符串,动态数组或类对象的简单结构。
    long  FileLoad(
       const string filename,      // [in] 文件名
       void         &buffer[],     // [out] 阅读文件的数组
       uint         common_flag=0  // [in] 0 - 搜索程序端Files文件夹中的文件,FILE_COMMON - 在程序端普通目录中搜索
       );
    
    bool  FileSave(
       const string filename,      // [in] 文件名
       const void   &buffer[],     // [in] 保存文件的数组
       uint         common_flag=0  // [in] 0 - 创建程序端Files文件夹中的文件,FILE_COMMON - 在程序端普通目录中创建
       );
    
    
    如何将报价写入文件然后阅读的示例:
    //--- 输入参数
    input int      ticks_to_save=1000; // 报价数
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                    |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       string  filename=_Symbol+"_ticks.bin";
       MqlTick ticks[];
    //---
       int copied=CopyTicks(_Symbol,ticks,COPY_TICKS_ALL,0,ticks_to_save);
       if(copied!=-1)
         {
          PrintFormat(" CopyTicks(%s) copied %d ticks",_Symbol,copied);
          //--- 如果报价历史被同步,错误代码等于零
          if(!GetLastError()==0)
             PrintFormat("%s: Ticks are not synchronized. Error=",_Symbol,copied,_LastError);
          //---  写入报价到文件
          if(!FileSave(filename,ticks,FILE_COMMON))
             PrintFormat("FileSave() failed, error=%d",GetLastError());
         }
       else
          PrintFormat("Failed CopyTicks(%s), Error=",_Symbol,GetLastError());
    //--- 现在阅读返回到文件的报价
       ArrayFree(ticks);
       long count=FileLoad(filename,ticks,FILE_COMMON);
       if(count!=-1)
         {
          Print("Time\tBid\tAsk\tLast\tVolume\tms\tflags");
          for(int i=0;i<count;i++)
            {
             PrintFormat("%s.%03I64u:\t%G\t%G\t%G\t%I64u\t0x%04x",
             TimeToString(ticks[i].time,TIME_DATE|TIME_SECONDS),ticks[i].time_msc%1000,
             ticks[i].bid,ticks[i].ask,ticks[i].last,ticks[i].volume,ticks[i].flags);
            }
         }
      }
    
    

  6. 通过DRAW_CANDLES 绘制模式更改自定义指标的展示。现在该模式可以设置1-3种颜色。蜡烛图的显示取决于设定的颜色数量。

    如果指定一种颜色,图表上的所有蜡烛图都将绘制这种颜色。
    //--- 绘制相同颜色的蜡烛图 
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- 仅指定一种颜色,所以所有蜡烛图都是相同的颜色
    #property indicator_color1  clrGreen  
    
    
    如果指定两种颜色,一种颜色用于蜡烛图的边框,另一种用于主体。
    //--- 蜡烛图的颜色不同于阴影颜色
    #property indicator_label1  "Two color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- 蜡烛图边框和阴影为绿色,主体为白色
    #property indicator_color1  clrGreen,clrWhite 
    
    
    如果指定三种颜色,一种颜色用于蜡烛图的边框,其他两种颜色用于牛市蜡烛图和熊市蜡烛图的主体。
    //--- 蜡烛图的颜色不同于阴影颜色
    #property indicator_label1  "One color candles"
    #property indicator_type1   DRAW_CANDLES
    //--- 蜡烛图边框和阴影为绿色,牛市蜡烛图主体为白色,熊市蜡烛图主体为红色
    #property indicator_color1  clrGreen,clrWhite,clrRed
    
    
    DRAW_CANDLES 风格允许设置自定义颜色的蜡烛图。使用PlotIndexSetInteger函数运行指标期间还可以动态更改所有颜色(drawing_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_number, color),在这里modifier_number 可能是以下的值:
    • 0 – 边框和阴影的颜色
    • 1 – 牛市蜡烛图主体颜色
    • 2 – 熊市蜡烛图主体颜色
    //--- 设置边框和阴影的颜色
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue);
    //--- 设置牛市蜡烛图主体颜色
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen);
    //--- 设置熊市蜡烛图主体颜色
    PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
    
    
  7. 修正漏洞并改进使用CopyTicks函数的报价历史操作。
  8. 从新版开始,操作符可用于接口(之前是不允许的)。

市场

  1. 修正从市场买入产品时可能导致重复请求登录MQL5.community的错误。

Tester

  1. 添加希腊语,马来语和希伯来语的UI 翻译。

更新文档。

29 九月 2016
MetaTrader 5 网页平台更加快速便捷
  • 添加调整网页应用程序模块大小的能力,包括市场报价和价格图表窗口。
  • 添加工具箱窗口的交易和历史标签按列排序的能力。列宽可以更改。
  • 添加详情标签和快速添加交易品种的功能。
  • 由于代码优化,提高了网页程序端的整体操作速度。账户初始化,添加交易品种以及交易本身,现在都可以更快速的执行。

26 九月 2016
MetaTrader 5 iOS build 1403
  • 改变交易选项展示 -现在交易数据表示取决于交易账户上的风险管理系统:零售外汇,期货或交易所模式。

  • 常规设置中移动界面语言选择到一个单独的菜单。
  • 其他修正和改进。
26 九月 2016
MetaTrader 5 Android build 1372
  • 应用程序支持多窗口模式,允许交易者同时监控多个交易品种的价格变化。
  • 添加改变指标子窗口高度的功能。
  • 现在,移动平台具备交易品种快速选择按 键以及独立的图表设置菜单。


  • 我们还增加了编辑指标水平的功能以及保加利亚语的翻译界面。
16 九月 2016
MetaTrader 5 Build 1430:更新展示标签

程序端



  1. 实现为交易所市场形成展示标签的新算法。现在,平台根据应用于交易账户的风险管理系统来适应资产显示:零售外汇,期货或交易所模式。

    资产部分有助于在交易所交易外汇或期货 显示它们当前的市场状态。相同货币可以在不同的交易品种种类中找到:作为货币组中的一个,作为基础货币,等等。例如,您可以反向持仓 GBPUSD,USDJPY和GBPJY。在这种情况下,了解您有多少货币以及您需要多少货币是非常困难的。持有超过3个持仓会使这个任务进一步复杂化。 如今在此种情况下,账户的所有状态都可以轻松地在资产标签查看。
    让我们使用3种相同的持仓举例说明:

    以134.027 的价位买入1手 GBPJPY— 收到 100 000 GBP,给出134 027 000 JPY
    以102.320 的价位卖出1手 USDJPY— 给出 100 000 USD,收到102 320 000 JPY
    以1.30923 的价位卖出1手 GBPUSD— 给出100 000 GBP,收到 103 920 USD

    我们同时买入卖出100 000GBP。我们有0GBP,资产标签不会显示这个货币。而USD,我们在一种情况下给出货币而在另一种情况下接收它。由于入金货币也是USD,资产标签会计算最终结果并将其添加到当前结余。参与两个交易的JPY意味着该标签显示其总值。




    使用交易所模式的人们 可以使用这个部分了解他们资金的使用情况。与之前模式不同,资金是在交易执行的时候直接出金/加入。例如,如果您买入EURRUB,您马上会收到EUR而 相应的RUB总值会从结余取出。在交易过程中,账户结余甚至可能是负数:当您使用借款时而购买的资产则用作抵押。在这种情况下,资产标签可以使您轻松地了 解交易账户状态。

    此外,在这里您还可以看到清算值 — 账户的金额和以市价平掉当前所有持仓的价格(结果)。





  2. 修正交易操作历史记录中显示的交易类型。
  3. 修正重新连接交易账户时重复显示的风险提示窗口。
  4. 优化和修正大量交易品种情况下交易品种选择对话框的使用情况(几千甚至更多)。
  5. 修正基于Moving Average(Bollinger Bands,Adaptive Moving Average等)计算的内置指标的展示水平。在此之前,当在独立子窗口绘制指标时会产生错误。
  6. 修正如果订单价格与合约上限或下限价格一致的情况下偶尔出现的干扰下期货合约订单的错误。

MQL5

  1. 优化和加快MQL5应用程序的编译速度。
  2. 为类,结构和函数添加支持'final' 和'override'修饰符。

    类和结构的'final'修饰符
    'final'修饰符在声明一个结构或类的时候禁止进一步继承它。 如果在这个类(结构)中无需做出任何进一步变化或这种变化出于安全原因无法接受,则以'final'修饰符声明那个类(结构)。在这种情况下,所有类的类函数也默认为 'final'。
    class CFoo final
      {
      //--- 类主体
      };
     
    class CBar : public CFoo
      {
      //--- 类主体
      };
    当如上面显示的一样试图以'final'修饰符从一个类继承时,编译器显示一个错误:
    不能像其被声明为'final'一样从'CFoo' 继承
    参照 'CFoo' 声明

    函数的'override'修饰符
    'override' 修饰符表示声明的函数应该始终重写父类的类函数。使用修饰符可以使您避免重写时的错误,例如意外修改类函数的签名。例如,接受 'int' 类型变量的 'func' 类函数定义在基本类中:
    class CFoo
      {
       void virtual func(int x) const { }
      };
    类函数重写在继承类:
    class CBar : public CFoo
      {
       void func(short x) { }
      };
    但是自变量类型错误的从'int' 变为'short'。实际上,替代重写的重载类函数在这种情况下执行。根据重载函数定义算法进行操作时,编译器在有些情况下可能会选择基本类中定义的类函数而不是重写的类函数。

    为了避免这种错误,'override' 修饰符应该明确添加到重写的类函数。
    class CBar : public CFoo
      {
       void func(short x) override { }
      };
    如果在重写过程中更改了类函数签名,编译器将无法在发布编译错误的父类中找到相同签名的类函数:
    'CBar::func' 类函数是通过'override'标识符声明但不会重写任何基本类的类函数

    函数的'final'修饰符

    'final' 修饰符操作是相反的 — 它禁止在衍生类中重写类函数。如果类函数的实现非常充分并得到完全完成,则以 'final' 修饰符声明它以确保其以后不被修改。
    class CFoo
      {
       void virtual func(int x) final { }
      };
     
    class CBar : public CFoo
      {
       void func(int) { }
      };
     
    当如上面显示的一样试图以'final'修饰符重写一个类函数,编译器显示一个错误:
    声明为'final'的'CFoo::func' 类函数不能通过 'CBar::func'重写
    请见 'CFoo::func' 声明
  3. 以默认参数修正编译的模板函数。

市场

  1. 修正分类市场产品的几个错误。

Tester

  1. 修正为可视测试模式的打开订单和持仓订单更新当前市场价格。
  2. 移除使用交易所交易品种进行测试时买入限价和卖出限价订单执行的滑移。
  3. 修正"开盘价"测试模式下意外生成的错误价格。
  4. 修正测试时生成OnTrade交易事件。
  5. 当基于真实报价测试时,不匹配的报价数据(取决于用于生成柱形图的价格的卖价或最后价)和现有分钟柱形图的最低值或最高值会出现在tester日志中。

MetaEditor

  1. 修正源代码文件中配置的数据展示。

更新文档。

19 八月 2016
MetaTrader 5 build 1395:更快的交易操作,视觉测试得到改进

程序端

  1. 客户端现在提供更快速地发送交易命令。
  2. 修正阻止在32位Windows 10,build 1607运行的程序端中执行MQL5应用程序的错误。
  3. 现在导航显示交易账户是否在锁仓模式亦或单边模式操作。
  4. 新快捷菜单命令已经添加到导航,它允许使用选定的账户连接网页程序端。
  5. 菜单的帮助部分已经更新,现在它能够链接到视频指南
  6. 修复在高分辨率显示器(4K)上连接操作的错误。
  7. 修复用户界面波斯语翻译的错误。

MQL5

  1. 添加新'void *'指针,以使用户创建抽象对象归集。任何类对象的指针都可以保存至这个变量类型。
    建议使用操作符dynamic_cast<class name *>(void * pointer) 来转换。如果无法转换,则结果为NULL。
    class CFoo { };
    class CBar { };
    //+------------------------------------------------------------------+
    //| 脚本程序起始函数                                      |
    //+------------------------------------------------------------------+
    void OnStart()
      {
       void *vptr[2];
       vptr[0]=new CFoo();
       vptr[1]=new CBar();
    //---
       for(int i=0;i<ArraySize(vptr);i++)
         {
          if(dynamic_cast<CFoo *>(vptr[i])!=NULL)
             Print("CFoo * object at index ",i);
          if(dynamic_cast<CBar *>(vptr[i])!=NULL)
             Print("CBar * object at index ",i);
         }
       CFoo *fptr=vptr[1];  // 将返回类型转换指针错误,vptr[1] 并不是CFoo对象
      }
    //+------------------------------------------------------------------+
  2. 添加支持字符串操作符[ ] 。该操作符可以使用户根据索引获得一个字符串符号。如果指定的索引超出了字符串,则结果为0。
    string text="Hello";
    ushort symb=text[0];  // 将返回符号'H'代码
    
  3. 新增具备int OnTesterInit(void)签名的另一个版本的TesterInit 事件处理程序,它可以返回INIT_SUCCEEDED (0) 或 INIT_FAILED (或任何非零值)。如果OnTesterInit 返回一个非零值,则优化不会开始。
  4. 修正一个可能导致不同ChartGetString重载函数返回不同结果的错误。

Tester

  1. 为视觉测试添加额外的命令和热键。现在可以像在程序端一样在视觉测试配置图表:改变颜色,配置各种元素的可视性,应用模板等等。




  2. 修正在"开盘价"测试模式中Sleep函数的操作。
  3. 修正W1和MN1时间周期上形成的不正确的柱形图状态。

MetaEditor

  1. 添加繁体中文的UI翻译。

更新文档。

8 八月 2016
MetaTrader 5 iOS build 1371
  • 新的消息设计。现在,MQL5.community消息和来自桌面平台的推送消息显示为类似于流行的移动messenger聊天。
  • 现在可以直接从平台切换到23种可用语言的其中一种。例如,如果您喜欢使用英语界面,您可以在"关于"页面进行选择而无需改变您设备的语言设置。
5 八月 2016
MetaTrader 5 Android build 1338
  •  内置 MQL5.community 的新聊天。
  •  从桌面平台转移SSL证书的新选项。
  •  波斯语和荷兰语的新翻译界面。
15 七月 2016
MetaTrader 5 Build 1375:时间&销售和访问测试期间的报价

程序端

  1. 时间&销售功能已添加到市场深度。




    时间&销售是什么?
    时间&销售功能就是提供金融市场上执行的每一笔交易的价格和时间。每笔交易的信息包括 交易执行时间,交易方向(买或卖)以及交易价格和交易量。为了方便视觉分析,使用不同的颜色指示不同的交易方向:蓝色用于买入交易,粉色用于卖出交易,绿 色表示未定义方向。交易量另外显示在直方图。

    时间&销售可以如何帮您了解市场
    时间&销售功能提供了更详细的市场分析工具。交易方向表示谁发起的交易:买家还是卖家。交易的成交量允许交易者了解市场参与者的行为:交易是由大型市场玩家还是小型市场玩家来执行以及评估玩家的行为。交易执行速度和各个价位的交易量有助于交易者评估级别的重要性。

    如何使用时间&销售数据
    除了视觉分析表格,您还可以保存交易详情为CSV文件。另外,它们还可以使用任何其他软件进行分析,例如MS Excel。文件包括逗号分隔数据:
    时间,卖价,买价,最后价,交易量,类型
    2016.07.06 16:05:04.305,89360,89370,89370,4,Buy
    2016.07.06 16:05:04.422,89360,89370,89370,2,Buy
    2016.07.06 16:05:04.422,89360,89370,89370,10,Buy
    2016.07.06 16:05:04.669,89360,89370,89370,1,Buy
    2016.07.06 16:05:05.968,89360,89370,89360,7,Sell
    如果您想保存数据到一个文件,请打开快捷菜单:



    交易商平台应该升级到1375版,以启用合适的交易方向检测。
  2. 到达新报价/市场深度改变与调用OnTick和OnCalculate之间的时间已经明显减少。同时交易状况改变和调用OnTick和OnCalculate之间的时间也已经减少。现在MQL5程序提供更快速的反应市场事件。
  3. 使用SSL证书扩大权限时,现在发送交易请求更加快速。
  4. 更新了波斯语的用户界面翻译。
  5. 修正了锁仓模式工作时图表快捷菜单止损/止盈设置命令的展示。

Tester

  1. 新tester允许在使用CopyTicks函数测试时请求报价历史记录。在早期版本中,策略测试不可访问报价。

    • 在“每个报价”模式中,函数返回生成报价的历史记录。最多可以请求128,000个最近报价。
    • 在“基于真实报价的每个报价”模式中,函数将返回真实报价的历史记录。请求数据的深度取决于可用的历史数据。然而,请注意最近的128,000个报价缓存在策略测试,请求将会快速执行。硬盘会请求更深层次的历史记录,所以请求执行可能会需要更多的时间。
    • 该函数不会在“只开盘价”和“1分钟OHLC”模式下工作,因为报价历史没有在该模式中被创建。

  2. 添加支持毫秒。在之前版本中,策略测试的时间段等于1秒。

    • 现在EventSetMillisecondTimer 和 Sleep 函数会使Tester中的时间更准确。
    • 多 货币EA测试期间报价源的准确性得到提高。早期版本,如果1秒包含多个报价(例如1分钟柱形图的跳动量超过60),那么会为这些报价设置相同的时间。无所 谓是否测试单货币EA交易,因为报价会按顺序传递到EA交易。但是,当您在多个货币对上测试EA交易时,了解这个报价首先到达的货币对非常重要。早期版 本,每个交易品种的报价都会按顺序传递到EA交易:首先,一个交易品种一秒内的所有报价,然后是另一个交易品种的所有报价。现在可以通过毫秒发送它们了。

      当真实报价用于测试时,从原报价数据就会考虑毫秒。报价生成时,会根据跳动量设置毫秒。例如,如果一秒内对应3个报价,它们的毫秒将等于000,333和666。

  3. 在“只开盘价”和“1分钟OHLC”模式下,挂单和止损/止盈订单现在在请求价格执行,而不是执行时的当前价。以精 确模式(每个报价和真实报价)使用的市场价格执行的算法不适合不太准确的模式。在一些模式下不会生成中间报价,因此请求订单价和当前价(开盘价或 OHLC)之间的差异非常明显。“只开盘价”和“1分钟OHLC”请求价格的执行订单提供了更加准确的测试结果。

  4. 添加可视模式下支持前测。现在可以为后测和前测打开两个独立的窗口,允许用户在不同的时间间隔对比EA交易的性能。




    前测窗口只在主要周期测试完成后打开。

  5. 入金加载替代预付款水平显示在主测试图表。加载情况根据预付款/净值比率进行计算。


  6. 修正测试期间每年按百分比计算手续费。

  7. 修正测试进行中生成的图表上的结余计算和展示。

MQL5

  1. 已经改变OrderSend函数在下单,更改和取消期间的行为。这些变化仅应用于发送到外部交易系统的订单。早期版本中,在交易商服务器成功下单(处理) 后返回OrderSend 函数管理。现在,这种管理仅在交易商服务器收到外部交易系统通知后返回,通知系统已经成功下单。

    下图显示了函数之前(红箭头)和当前的行为:




  2. MqlTradeResult结构的新字段:retcode_external - 外部交易系统的错误代码。这些错误的使用和类型取决于交易操作发送的交易商和外部交易系统。例如,通过莫斯科交易所成交的 retcode_external 值不同于DGCX返回的值。

  3. ENUM_CHART_PROPERTY_STRING 枚举的新属性:CHART_EXPERT_NAME 和 CHART_SCRIPT_NAME。现在,ChartGetString函数允许用户找出附在chart_id参数定义的图表上的EA交易和/或脚本的 名称。

信号

  1. 修正由于复制'close by '操作失败而偶尔产生的错误。
  2. 改进自动匹配货币组,包括RUB和RUR。

市场

  1. 修正通过产品类别排序。

MetaEditor

  1. 修正打开替换对话框时在替换文本字段设置焦点。
  2. 修正从当前持仓开始向上搜索时替换出现的多个文本。
更新文档。
5 七月 2016
MetaTrader 5 网页平台:官方发布

公开测试两个月后,多元化MetaTrader 5 平台网页版 现已官方对外发布。它允许从任何浏览器和任何操作系统进行外汇和金融市场交易。仅需网络连接即可,无需安装任何软件。

该应用将桌面版的主要优势(高速,支持多元化市场和扩展的交易功能)与网页程序端的便利性和跨平台特性相结合。该发布版的主要功能在于测试版中所没有的市场深度。

网页平台允许交易者执行技术分析和交易操作,就像在桌面版一样。网页平台提供以下特性:

  • 净额和锁仓持仓账户系统
  • 31 种技术指标
  • 23 种分析对象
  • 一键交易和一整套的交易订单
  • 41 种界面语言
19 五月 2016
MetaTrader 5 iOS build 1335

现在从桌面平台转移SSL证书到移动平台更加容易。您不再需要iTunes去完成它。

MetaTrader 5允许您通过使用证书为您的账户添加额外保护。没有证书,则无法连接。如果证书在桌面版创建,您应该能够通过移动设备进入您的账户转移它。

为此,请打开桌面平台,在导航窗口右击所需的账户,并选择转移。设置只有您知道的证书密码,打开移动平台,连接您的账户。您将被立即提供导入证书。

此外,最新版还具有从MetaTrader 4转移账户的迁移对话框。如果您的账户已经转移到第五代交易平台,我们热烈欢迎,并提供有关新特性的信息和要求更改您的密码。

13 五月 2016
新的MetaTrader 5 平台 build 1340:便利的证书转移和改进的策略测试

程序端

  1. 现在用于先进安全连接的证书可以方便地从桌面平台转移到移动程序端。

    交易平台支持扩展认证,通过使用除了密码以外的SSL证书保护交易账户。证书是一个交易服务器上为账户独立生成的文件。该文件是唯一的,没有证书无法完成账户连接。

    在早期的平台版本,所要求的从桌面程序端生成的任何证书都需要手动复制并安装在启用交易账户的MetaTrader 5 iPhone/iPadAndroid 移动设备上。现在,证书可以方便地转移了。


    证书转移过程
    通过交易服务器转移证书:

    • 证书首先在桌面程序端加密:账户所有者使用安全的AES - 256算法为证书加密设置密码。该密码只有使用者知道,而不会发送至服务器。
    • 另外,加密的证书发送至交易服务器,并在此存储直至移动程序端接收,但不会超过一个小时。
    • 若要在移动设备上接收证书,用户必须连接到移动程序端的交易账户。连接后,用户提示导入证书。进行导入时,用户需要指定桌面程序端用于证书加密的密码 。

    证书转移过程非常安全:交易服务器仅用作中间存储,而证书由客户方加密。证书密码不会传到或存储在交易服务器上。
    如何转移证书
    连接您桌面程序端的账户,在快捷菜单中选择"转移证书":



    输入该账户的主密码来确认它属于您。下一步,将其发送到服务器之前,设置一个保护证书的密码。设置的密码至少8位数。

    成功发送证书到服务器之后,打开移动程序端并连接您的账户。您将被立即提示导入证书。确认并输入您在桌面程序端设置的密码。



    您可以在 "关于 — 证书" 部分查看导入证书。
    不久的将来更新的支持证书转移的MetaTrader 5 iPhone/iPad 和 Android平台将会发布。

Tester

  1. 执行挂单,以及SL和TP的更新算法,它将提供更精确的测试条件。视觉测试高级选项。

    交易工具的新功能
    在真实市场中,交易所交易工具图表基于最终价信息生成(最后执行的交易价格)。止损订单也在最终价起动限价订单在卖价和买价起动。所有的订单类型经常在当前市场的卖价/买价执行。策略测试已被更新,现在更好的模拟真实的市场状况:
      之前 之后
    起动 所有挂单类型和SL/TP的卖价/买价 限价订单卖价/买价
    最终止损,止损限价和SL/TP订单
    执行 所有挂单类型和SL/TP的订单指定价格 所有挂单类型和SL/TP的订单起动时的卖价/买价

    让我们考虑Si-6.16 交易品种的示例。起动价格的新买入止损订单 = 设定72580 而当前价格是:Bid=72570,Ask=72572,Last=72552。在价格流新收到的当前价格:

    • Bid=72588
    • Ask=72590
    • Last=72580


    起动交易工具止损订单的是最终价。所以价格流中收到的Last price=72580 激活买入止损订单。在早期版本中,相同价格将用于执行该订单。这个行为是错误的,因为市场中没有Ask=72580 执行买入交易。


    当前 Ask=72590 被用于更新的tester版,所以买入止损订单在该价格执行。Tester 中新的交易执行算法更接近真实市场条件。使用之前算法时,交易操作将以非市场价执行,这将会导致测试结果不准确。

    其他工具的新功能
    其他工具的算法没有改变:用于所有挂单类型,以及SL和TP 的卖价/买价。然而,执行模式已经改变:在早期版本中,以订单中指定的价格执行订单。现在使用根据订单激活时间的市场卖价和买价。

    视觉测试的新功能
    视觉测试期间,柱形图的最高买价线和最低卖价线现在显示在tester。在该图表上,更方便测试交易所工具的EA交易,因为这种工具的柱形图以及起动的订单都是根据最终价完成,而市场操作以卖价和买价执行。



    视觉测试图表的新选项:导航到指定日期。双击图表,输入想要的日期和时间。也可以导航到任何订单或交易:在交易,历史或操作选项卡双击相应的交易操作。
  2. 扩展测试开始前加载的有关价格和报价历史的日志记录信息。现在日志包含有关历史加载完成的信息,以及下载的数据量和花费的时间:
    2016.05.10 12:47:53    Core 1    5.10 Mb 已处理历史记录 0:00.842
    2016.05.10 12:47:53    Core 1    GBPUSD:历史同步完成 [5225 Kb]


MQL5

  1. 修正CopyTicks函数的行为:它将返回比要求更低的报价。
  2. 修正生成的模板函数。
  3. 更新文档。

更新内容将通过LiveUpdate系统提供。

12 五月 2016
MetaTrader 5 网页平台:现已提供测试

MetaTrader 5 网页平台测试版现已发布。新产品将网页程序端的便利性和跨平台的特性与MetaTrader 5桌面版的优势相结合 – 高速,支持多元化市场和扩展的交易功能。

MetaTrader 5 网页平台可在MQL5.community上使用,它允许交易者从任何浏览器和操作系统,包括Windows,Mac和Linux,执行金融市场的交易操作。您只需要一个网络连接。不需要额外的软件。

测试版拥有以下特性:

  • 锁仓系统
  • 30种技术指标
  • 24种分析对象
  • 一整套的 MetaTrader 5 交易订单
  • 41 种界面语言
发布测试版的目的在于提供全球化的公开测试,使交易者能够评估它的新性能。
22 四月 2016
新版MetaTrader 5 build 1325:锁仓选项和实时报价测试

程序端

  1. 我们已经添加第二个账户系统—锁仓,该新系统能够扩大零售外汇交易者的可能性。现在,每个交易品种可以有多个持仓,包括反向持仓。这就为实施基于所谓“锁定”的交易策略铺平道路 — 如果价格对交易者反向移动,他们可以打开一个反向持仓。

    由于新系统类似于在MetaTrader 4中使用的系统,它将被交易者所熟知。与此同时,交易者将能够享受第五代平台版本的全部优势 — 使用多个交易填写订单 (包括部分填充),支持MQL5 云网络的多货币和多线程测试等等。

    现在,您可以使用一个账户从事依附于净额系统,一个工具仅允许一个持仓的市场交易,以及在同一个平台使用另一个账户从事外汇交易和使用锁仓。

    新建锁仓账户,查看持仓账户类型
    持仓账户系统设置在一个账户水平,并显示在程序端窗口标题和日志:



    要新建一个锁仓模拟账户,请启用相应选项: 




    净额系统
    通过这个系统,在同一时间,一个交易品种您只能有一个普通持仓:

    • 如果一个交易品种有一个持仓,同向执行一个交易会提高该持仓的交易量。
    • 如果反向执行交易,那么现有的交易量可能减少,持仓可能会被关闭 (成交交易量等于持仓交易量时) 或撤销 (如果反向成交的交易量大于当前持仓)。

    这没关系,导致反向交易的是 — 已执行的市场订单或触发的挂单。

    下面示例显示了执行两个每笔0.5手的EURUSD买入交易:


    执行这两个交易即是1手的一个普通持仓。

    锁仓系统
    通过这个系统,您可以一个交易品种拥有多个持仓,包括反向持仓。

    如果您有一个交易品种的持仓,执行一个新交易(或触发挂单),那么会另外建立一个新持仓。您当前持仓不会改变。

    下面示例显示了执行两个每笔0.5手的EURUSD买入交易:


    执行这些交易则会新建两个独立的持仓。

    新交易操作类型 - Close By
    新的交易类型已经被加入锁仓账户 — 通过反向持仓来平仓。这个操作允许在单一交易品种关闭两个反向的持仓。如果反向持仓手数不同,那么两个持仓中只有一个订单保留持仓。其交易量将等于平仓手数的差异值,而持仓方向和开盘价将匹配平仓的更大(交易量)。

    相比单独关闭两个持仓,关闭反向持仓允许交易者保留一个点差:

    • 单独平仓情况下,交易者必须支付一个点差两次:以低价位(卖价)关闭买入持仓和高价位关闭卖出持仓(买价)。
    • 使用反向持仓时,第二个持仓的开盘价被用于关闭第一个持仓,而第一个持仓的开盘价被用于关闭第二个持仓。


    在后面那种情况下,下单"close by" 订单。平仓信息在该评论指明。一组反向持仓通过两个"out by"交易关闭。关闭两个持仓得到的总利润/亏损只在一个交易中指明。


  2. 除了支持锁仓外,新版平台还为从MetaTrader 4迁移账户提供了更广泛的机会。现在,交易商可以自动转移账户到MetaTrader 5,包括所有的操作:持仓和挂单,完成交易历史。

    首次连接从MetaTrader 4迁移的账户时会打开一个欢迎对话框。在迁移过程中,数据的传输安全加密。若要开始使用,请指定您在MetaTrader 4使用的账户密码,然后设置一个新密码。



    连接一旦成功,您将可以继续使用您的账户,就好似它已在MetaTrader 5持仓。来自MetaTrader 4所有交易的完整历史记录会自动添加到新账户。

    订单和持仓(包括历史订单)标签在导入过程中不会保留,因为从MetaTrader 4导入一个历史记录可能相当于MetaTrader 5中的4个历史操作。所有的交易记录都会分配新的标签。

    根据交易商导入的方式可以保留或替代账号。

  3. 程序端:新增聊天功能。现在,您可以与您的MQL5.community朋友和同事进行交流沟通了。聊天显示了您MQL5 账户的所有个人信息。开始沟通时,可以直接从聊天窗口登录您的账户或通过平台设置登录:工具 -> 选项 -> 社区。




  4. 程序端:简化的模拟账户创建对话框,添加创建锁仓账户的能力。您不再需要填写大表格。只需指定基本数据和选择交易参数:账户类型,入金,杠杆和锁仓功能。




  5. 添加自动分配模拟账户以便快速启动。如果平台还没有账户,第一个可用交易服务器上的模拟账户会在启动时分配。成功打开后,账户连接马上建立。

  6. 现在,每个持仓有一个标签 — 一个独一无二的号码。它通常匹配用于持仓的订单标签,除非标签更改为服务器上服务操作的结果,例如,收取重新持仓库存费时。程序端更新后,标签被自动分配到所有可用持仓。



  7. 修正建立导致持仓反转的市场订单时设置的止损和获利水平。直到目前,没有适当的水平设置给新持仓。
  8. 修正单击交易面板上显示4位及更多小数位的价格。
  9. 修正打印预览窗口的新闻显示。
  10. 修正报价图表显示。
  11. 修正程序端紧急关闭后打开市场深度。
  12. 添加如果显示单击交易面板控制元素时允许市场订单的检查。
  13. 假设大量新建订单和持仓情况下,优化利润和预付款计算。
  14. 添加用户界面的马来语翻译。
  15. 完全修改后的用户手册。新设计,交互式屏幕截图和嵌入式视频 — 以最大的方便性了解MetaTrader 5的交易:



  16. 修正"前景图表"模式下图形对象的展示。

Tester

  1. 新增在实时报价历史测试自动交易和技术指标的能力。

    真实报价的测试和优化尽可能地接近实际情况。代替基于分钟数据生成的报价,现在可以使用交易商积累的真实报价。有许多来自交易商和流动量提供商的报价。

    若要开始测试或优化真实报价,请在策略测试选择相应的模式:



    报价数据的大小要比分钟数据大。第一次测试期间,下载它可能需要较长的世界。按月下载的报价数据被存储在TKC文件,在 \bases\[trade server name]\ticks\[symbol name]\。
    测试真实报价
    当测试一个真实报价时,一分钟柱内的点差可能改变,因此生成一分钟报价时,使用相应柱固定的点差。

    如果一个交易品种显示市场深度,那么柱形图会严格根据最后执行的交易价格(Last)来构建。否则,tester会根据收盘价首次尝试构建柱形图,如果这些价格不存在,则使用卖价。无论收盘价是否存在,所有报价上都会触发OnTick 事件。

    请 注意,即使根据收盘价构建图表,交易操作也会始终根据卖价和买价执行。例如,如果仅使用开盘柱进行交易的EA交易(例如内置移动平均指标)收到了收盘价信 号,它以另一个价格执行一个交易(取决于方向的买价或卖价)。如果使用“每一报价”模式,柱形图通过卖价构建,而交易通过卖价和买价执行。买价作为卖价+ 对应分钟柱固定点差来计算。

    如果交易品种历史有一个无报价数据的分钟柱,tester 在“每一报价”模式下生成报价。这允许测试一定时期内的EA,以防交易商报价数据的不足。如果交易品种历史记录没有分钟柱但是有适当的分钟报价数据,那么这些报价可以忽略。分钟数据被认为更可靠。

    在MQL5 云网络测试真实报价
    测试真实报价现在不仅可用于本地和远程代理,还可以通过MQL5 云网络实现。可能需要几个月的策略优化,通过数千台电脑的计算能力,可能几个小时就可完成。

    若要使用MQL5云网络测试策略,请启动使用云代理:



    使用MQL5云网络测试真实报价可以消耗大量的数据。这可以显著影响使用网络能力的支付。
  2. 修正几个交易品种类型上妨碍计算手续费的错误。
  3. 修正根据相应持仓的专家字段填写激活SL/TP得到的交易订单的专家字段。之前,不填写这些内容。
  4. 修正切换到通常状态并进一步优化结果的标签。
  5. 修正计算和显示“轨道线”指标。
  6. 优化可视化测试。
  7. 优化了大量新建订单和持仓时的利润和预付款计算。
  8. 优化高频交易期间的交易操作。
  9. 现在,如果是非关键交易品种属性请求(不需要当前报价),则不执行历史同步。例 如,SYMBOL_SELECT,SYMBOL_DIGITS,SYMBOL_SPREAD_FLOAT,SYMBOL_TRADE_CALC_MODE,SYMBOL_TRADE_MODE,SYMBOL_TRADE_STOPS_LEVEL,SYMBOL_TRADE_FREEZE_LEVEL,SYMBOL_TRADE_EXEMODE 等等。之前,非关键交易品种历史记录在其属性的任何请求下都会同步。
  10. 修正按照每年比例计算库存费。ixed calculation of swaps as a percentage per annum.

MQL5

  1. 可执行文件EX5的格式已经变成实施MQL5语言的新功能和MetaTrader 5的新锁仓选项。通过之前版本MetaEditor编译的所有EX5应用程序更新后将能正常工作,例如正向兼容性完全保留。

    build 1325及以上版本编译的EX5程序将无法在旧版构建的程序端运行 - 不支持反向兼容性。

  2. 添加支持抽象类和纯虚函数。

    抽象类用于创建您期待用于创建更具体派生类的通用实体。抽象类仅能用作一些其他类的基本类,这就是不能创建抽象类类型对象的原因。

    至少包含一个纯虚拟函数的类是抽象类。因此,从抽象类派生出来的类必须实施其所有纯虚拟函数,否则它们也将是抽象类。

    虚拟函数通过使用pure-specifier语法声明为"pure"。考虑CAnimal类的示例,它的创建只能提供常用功能 – CAnimal类型的对象对于实际使用太普通。因此,CAnimal 是一个很好的抽象类示例:
    class CAnimal
      {
    public:
                          CAnimal();     // 构造函数
       virtual void       Sound() = 0;   // 纯虚拟函数
    private:
       double             m_legs_count;  // 动物脚的数量
      };
    这里Sound() 是一个纯虚拟函数,因为它声明为纯虚拟函数PURE (=0)的说明符。

    纯虚拟函数只是为设置PURE说明符的虚拟函数:(=NULL) 或(=0)。抽象类声明和使用的示例:
    class CAnimal
      {
    public:
       virtual void       Sound()=NULL;   // PURE 类函数,应被覆盖在派生类中,CAnimal 现在是抽象类,不能创建
      };
    //--- 派生自一个抽象类
    class CCat : public CAnimal
     {
    public:
      virtual void        Sound() { Print("Myau"); } // PURE被覆盖,CCat 不是抽象类,可以创建
     };
    
    //--- 错误使用的例子
    new CAnimal;         // 'CAnimal' 错误 - 编译器返回"不能实例化抽象类"的错误
    CAnimal some_animal; // 'CAnimal' 错误 - 编译器返回"不能实例化抽象类"的错误
    
    //--- 正确使用的示例
    new CCat;  // 没有错误 - CCat 类不是抽象类
    CCat cat;  // 没有错误 - CCat 类不是抽象类
    抽象类的限制
    如果抽象类的构造函数调用一个纯虚拟函数(直接或间接),结果是未定义的。
    //+------------------------------------------------------------------+
    //| 抽象基类                                                          |
    //+------------------------------------------------------------------+
    class CAnimal
      {
    public:
       //--- 纯虚拟函数
       virtual void      Sound(void)=NULL;
       //--- 函数
       void              CallSound(void) { Sound(); }
       //--- 构造函数
       CAnimal()
        {
         //--- 虚拟类函数的显式调用
         Sound();
         //--- 隐式调用(使用第三个函数)
         CallSound();
         //--- 构造函数或析构函数始终调用自己的函数,
         //--- 即使它们是虚拟函数并且已经被派生类中已调用的函数所覆盖
         //--- 如果调用的函数是纯虚拟函数
         //--- 调用会引起“纯虚拟函数调用”的关键的执行错误
        }
      };
    然而,抽象类的构造函数和析构函数可以调用其他成员函数。

  3. 添加支持函数指针来简化事件模式的安排。

    若要声明一个函数指针,请指定"函数指针"类型,例如:
    typedef int (*TFunc)(int,int);
    现在,TFunc是一种类型,可以声明函数的变量指针:
    TFunc func_ptr;
    func_ptr 变量可以存储函数地址以便稍后声明:
    int sub(int x,int y) { return(x-y); }
    int add(int x,int y) { return(x+y); }
    int neg(int x)       { return(~x);  }
    
    func_ptr=sub;
    Print(func_ptr(10,5));
    
    func_ptr=add;
    Print(func_ptr(10,5));
    
    func_ptr=neg;           // 错误:neg 不是 int (int,int) 型
    Print(func_ptr(10));    // 错误:应该有两个参数
    函数指针可以被存储并作为参数传递。您不能得到非静态类函数的指针。

  4. MQL5:MqlTradeRequest 有两个新字段:

    • position — 持仓标签。锁仓模式交易下为了明确识别而改变和关闭持仓时来填写。在净额系统,填写字段不会有任何影响,因为持仓只识别一个交易品种名称。
    • position_by — 反向持仓标签。它用于通过反向持仓平仓时(打开一个同名但反向的交易品种)。该标签仅用于锁仓系统。

  5. 添加TRADE_ACTION_CLOSE_BY 值到 ENUM_TRADE_REQUEST_ACTIONS 交易操作类型枚举 — 通过反向持仓。该标签仅用于锁仓系统。

  6. 添加交易操作标签到适当订单,交易和持仓属性的枚举:

    • 添加ORDER_TICKET 属性到 ENUM_ORDER_PROPERTY_INTEGER — 订单标签。每个订单会分配一个独一无二的号码。
    • 添加 DEAL_TICKET 属性到 ENUM_DEAL_PROPERTY_INTEGER — 交易标签。每笔交易会分配一个独一无二的号码。
    • 添加POSITION_TICKET 属性到 ENUM_POSITION_PROPERTY_INTEGER — 持仓标签。每个新持仓会分配一个独一无二的号码。它通常匹配用于持仓的订单标签,除非标签更改为服务器上服务操作的结果,例如,收取重新持仓库存费时。若 要找出一个用于持仓的订单,请应用POSITION_IDENTIFIER 属性。POSITION_TICKET 值对应MqlTradeRequest::position。

  7. 添加ORDER_TYPE_CLOSE_BY 值到 ENUM_ORDER_TYPE 订单类型枚举 — close by 订单。
  8. 添加ORDER_POSITION_BY_ID 值到 ENUM_ORDER_PROPERTY_INTEGER 订单属性枚举 — ORDER_TYPE_CLOSE_BY 类型订单的反向持仓标识符。
  9. 添加DEAL_ENTRY_OUT_BY 值到 ENUM_DEAL_ENTRY 交易方向枚举 — 由close by操作执行交易。
  10. MqlTradeTransaction 也有两个类似的字段:


    • position — 由交易活动影响的持仓标签。这里填写处理市场订单(TRADE_TRANSACTION_ORDER_* except TRADE_TRANSACTION_ORDER_ADD,在这里持仓标签尚未分配) 和订单历史(TRADE_TRANSACTION_HISTORY_*)相关的交易活动。
    • position_by — 反向持仓标签。它用于通过反向持仓平仓时(打开一个同名但反向的交易品种)。这里只填写通过反向持仓而平仓的订单 (close by) 和通过反向持仓而关闭的交易 (out by)。

  11. 添加PositionGetTicket 函数 — 根据持仓列表的索引返回一个持仓标签和使用PositionGetDouble, PositionGetInteger 和PositionGetString函数自动选择持仓用于进一步工作。
    ulong  PositionGetTicket(
       int  index      // 持仓列表索引
       );

  12. 添加PositionSelectByTicket 函数 — 通过指定标签为进一步工作选择一个持仓。
    bool  PositionSelectByTicket(
       ulong   ticket     // 持仓标签
       );

  13. 添加SYMBOL_MARGIN_HEDGED 值到 ENUM_SYMBOL_INFO_DOUBLE 交易品种属性枚举 — 合约大小或一手锁仓预付款(一个交易品种的反向持仓)。

    • 如果一个交易品种指定了初始预付款 (SYMBOL_MARGIN_INITIAL),锁仓预付款被指定为绝对值(以货币计算)。
    • 如果没有设置初始预付款(等于0),预付款计算中将被使用的合约大小在SYMBOL_MARGIN_HEDGED指定。预付款使用对应一个交易品种类型 (SYMBOL_TRADE_CALC_MODE)的等式计算。

    锁仓预付款计算的详细信息会在MetaTrader 5 交易平台帮助中说明。

  14. 添加ACCOUNT_MARGIN_MODE 值到 ENUM_ACCOUNT_INFO_INTEGER 账户属性枚举 — 当前交易账户的预付款计算模式:

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — 用于净额模式账户持仓时的场外交易市场(一个交易品种一个持仓)。预付款计算基于交易品种类型 (SYMBOL_TRADE_CALC_MODE)。
    • ACCOUNT_MARGIN_MODE_EXCHANGE — 用于交易所市场。预付款计算基于交易品种设置中指定的折扣。折扣由交易商设置,但是它们不能低于交易所设置的值。
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — 用于独立持仓账户场外交易市场(锁仓,一个单一交易品种可以有多个持仓)。预付款计算基于交易品种类型 (SYMBOL_TRADE_CALC_MODE)。也要考虑锁仓预付款大小 (SYMBOL_MARGIN_HEDGED) 。

  15. 添加TERMINAL_SCREEN_DPI 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性枚举 — 分辨率显示数据通过每英寸的点数来衡量 (DPI)。该参数的信息允许指定图形对象的大小,这样它们在不同分辨率的显示器上看起来一样。

  16. 添加 TERMINAL_PING_LAST 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性 — 以微秒计算交易服务器最后得到的ping值。一秒等于一百万微秒。

  17. 修正返回SendFTP函数调用结果。之前,成功发送后返回 FALSE 而不是 TRUE。
  18. 修正偶尔导致"违规访问"执行错误的StringConcatenate函数错误。
  19. 修正使用模板函数时发生的几个错误。
  20. 添加为打印,警示和评论功能显示超过4000字符行的能力。
  21. 修正ArrayCompare函数通过不同于开始时期的初始持仓变化来比较数组和函数本身时产生的错误。
  22. 添加支持标准库的锁仓功能:

    CPosition
    添加类函数:

    • SelectByMagic — 根据魔幻数选择持仓和进一步工作的交易品种。
    • SelectByTicket — 通过进一步工作的标签选择持仓。

    CTrade
    添加类函数:

    • RequestPosition — 收到持仓标签。
    • RequestPositionBy — 接收反向持仓标签。
    • PositionCloseBy — 通过反向持仓支持标签平仓。
    • SetMarginMode — 根据当前账户设置来设置预付款计算模式。

    添加重载类函数:

    • PositionClose — 平仓标签。
    • PositionModify — 修改持仓标签。

    CAccountInfo
    改变类函数:

    • MarginMode — 接收预付款计算模式。直至目前,类函数的工作类似于新的StopoutMode 类函数。
    • MarginDescription — 接收预付款计算模式为字符串。直至目前,类函数的工作类似于新的StopoutModeDescription类函数

    添加类函数:

    • StopoutMode — 接收最小预付款水平规范模式。
    • StopoutModeDescription — 接收最小预付款水平规范模式为字符串。

    CExpert
    添加类函数:

    • SelectPosition — 为进一步工作选择持仓。

  23. 对标准程序库添加一些改进。
  24. 修正卸载DLLs。
  25. 添加支持模板类构造函数。

信号:

  1. 修正几个交易信号窗显示错误。

MetaEditor

  1. 修正“全字匹配”模式下文件的搜索词。
  2. 添加在所需文件的编译结果行上双击移动到一个文件。
  3. 修正显示Windows XP中的一些控制元素。
更新文档。
1 四月 2016
MetaTrader 5 平台 Build 1295

程序端

  1. 为了扩展零售外汇交易者的可能性,我们添加了第二账户系统 — 锁仓。现在,每个交易品种可以有多个持仓,包括反向持仓。这就为实施基于所谓“锁定”的交易策略铺平道路 — 如果价格对交易者反向移动,他们可以打开一个反向持仓。

    由于新系统类似于在MetaTrader 4中使用的系统,它将被交易者所熟知。与此同时,交易者将能够享受第五代平台版本的全部优势 — 使用多个交易填写订单 (包括部分填充),支持MQL5 云网络的多货币和多线程测试等等。

    现在,您可以使用一个账户从事依附于净额系统,一个工具仅允许一个持仓的市场交易,以及在同一个平台使用另一个账户从事外汇交易和使用锁仓。

    新建锁仓账户,查看持仓账户类型
    持仓账户系统设置在一个账户水平,并显示在程序端窗口标题和日志:



    要新建一个锁仓模拟账户,请启用相应选项:




    净额系统
    通过这个系统,在同一时间,一个交易品种您只能有一个普通持仓:

    • 如果一个交易品种有一个持仓,同向执行一个交易会提高该持仓的交易量。
    • 如果反向执行交易,那么现有的交易量可能减少,持仓可能会被关闭 (成交交易量等于持仓交易量时) 或撤销 (如果反向成交的交易量大于当前持仓)。


    这没关系,导致反向交易的是 — 已执行的市场订单或触发的挂单。

    下面示例显示了执行两个每笔0.5手的EURUSD买入交易:


    执行这两个交易即是1手的一个普通持仓。

    锁仓系统
    通过这个系统,您可以一个交易品种拥有多个持仓,包括反向持仓。

    如果您有一个交易品种的持仓,执行一个新交易(或触发挂单),那么会另外建立一个新持仓。您当前持仓不会改变。

    下面示例显示了执行两个每笔0.5手的EURUSD买入交易:


    执行这些交易则会新建两个独立的持仓。

    新交易操作类型 - Close By
    新的交易类型已经被加入锁仓账户 — 通过反向持仓来平仓。这个操作允许在单一交易品种关闭两个反向的持仓。如果反向持仓手数不同,那么两个持仓中只有一个订单保留持仓。其交易量将等于平仓手数的差异值,而持仓方向和开盘价将匹配平仓的更大(交易量)。

    相比单独关闭两个持仓,关闭反向持仓允许交易者保留一个点差:

    • 单独平仓情况下,交易者必须支付一个点差两次:以低价位(卖价)关闭买入持仓和高价位关闭卖出持仓(买价)。
    • 使用反向持仓时,第二个持仓的开盘价被用于关闭第一个持仓,而第一个持仓的开盘价被用于关闭第二个持仓。


    在后面那种情况下,下单"close by" 订单。平仓信息在该评论指明。一组反向持仓通过两个"out by"交易关闭。关闭两个持仓得到的总利润/亏损只在一个交易中指明。



  2. 新增在实时报价历史测试自动交易和技术指标的能力。

    真实报价的测试和优化尽可能地接近实际情况。代替基于分钟数据生成的报价,现在可以使用交易商积累的真实报价。有许多来自交易商和流动量提供商的报价。

    若要开始测试或优化真实报价,请在策略中选择相应的模式



    报价数据的大小要比分钟数据大。第一次测试期间,下载它可能需要较长的世界。按月下载的报价数据被存储在TKC文件,在 \bases\[trade server name]\ticks\[symbol name]\。

    测试真实报价
    当测试一个真实报价时,一分钟柱内的点差可能改变,因此生成一分钟报价时,使用相应柱固定的点差。

    如果一个交易品种显示市场深度,那么柱形图会严格根据最后执行的交易价格(Last)来构建。否则,tester会根据收盘价首次尝试构建柱形图,如果这些价格不存在,则使用卖价。无论收盘价是否存在,所有报价上都会触发OnTick 事件。

    请注意,即使根据收盘价构建图表,交易操作也会始终根据卖价和买价执行。例如,如果仅使用开盘柱进行交易的EA交易(例如内置移动平均指标)收到了收盘价信号,它以另一个价格执行一个交易(取决于方向的买价或卖价)。如果使用“每一报价”模式,柱形图通过卖价构建,而交易通过卖价和买价执行。买价作为卖价+对应分钟柱固定点差来计算。

    如果交易品种历史有一个无报价数据的分钟柱,tester 在“每一报价”模式下生成报价。这允许测试一定时期内的EA,以防交易商报价数据的不足。如果交易品种历史记录没有分钟柱但是有适当的分钟报价数据,那么这些报价可以忽略。分钟数据被认为更可靠。
    目前,真实报价的测试和优化仅可能在本地和远程代理。支持MQL5 云网络 在不久的将来也会加入。

  3. Added the Chat. 现在,您可以与您的MQL5.community朋友和同事进行交流沟通了。聊天显示了您MQL5 账户的所有个人信息。开始沟通时,可以直接从聊天窗口登录您的账户或通过平台设置登录:工具 -> 选项 -> 社区。




  4. 简化的模拟账户创建对话框,添加创建锁仓账户的能力。您不再需要填写大表格。只需指定基本数据和选择交易参数:账户类型,入金,杠杆和锁仓功能。



  5. 添加自动分配模拟账户以便快速启动。如果平台还没有账户,第一个可用交易服务器上的模拟账户会在启动时分配。成功打开后,账户连接马上建立。

  6. 现在,每个持仓有一个标签 — 一个独一无二的号码。它通常匹配用于持仓的订单标签,除非标签更改为服务器上服务操作的结果,例如,收取重新持仓库存费时。程序端更新后,标签被自动分配到所有可用持仓。




  7. 修正建立导致持仓反转的市场订单时设置的止损和获利水平。直到目前,没有适当的水平设置给新持仓。
  8. 修正单击交易面板上显示4位及更多小数位的价格。
  9. 修正打印预览窗口的新闻显示。
  10. 修正报价图表显示。
  11. 修正程序端紧急关闭后打开市场深度。
  12. 添加如果显示单击交易面板控制元素时允许市场订单的检查。
  13. 假设大量新建订单和持仓情况下,优化利润和预付款计算。
  14. 添加用户界面的马来语翻译。
  15. 全修改后的用户手册。新设计,交互式屏幕截图和嵌入式视频 — 以最大的方便性了解MetaTrader 5的交易:




MQL5

  1. 添加支持抽象类和纯虚函数。

    抽象类用于创建通用实体,这就是您期待用于创建更具体的派生类。抽象类仅能用作一些其他类的基本类,这就是不能创建抽象类类型对象的原因。

    至少包含一个纯虚拟函数的类是抽象类。因此,从抽象类派生出来的类必须实施其所有纯虚拟函数,否则它们也将是抽象类。

    虚拟函数通过使用pure-specifier语法声明为"pure"。考虑CAnimal类的示例,它的创建只能提供常用功能 – CAnimal类型的对象对于实际使用太普通。因此,CAnimal 是一个很好的抽象类示例:
    class CAnimal
      {
    public:
                          CAnimal();     // 构造函数
       virtual void       Sound() = 0;   // 纯虚拟函数
    private:
       double             m_legs_count;  // 动物腿的数量
      };
    这里Sound() 是一个纯虚拟函数,因为它声明为纯虚拟函数PURE (=0)的说明符。

    纯虚拟函数只是为设置PURE说明符的虚拟函数:(=NULL) 或(=0)。抽象类声明和使用的示例:
    class CAnimal
      {
    public:
       virtual void       Sound()=NULL;   // PURE 类函数,应被覆盖在派生类中,CAnimal 现在是抽象类,不能创建
      };
    //--- 抽象类的后裔
    class CCat : public CAnimal
     {
    public:
      virtual void        Sound() { Print("Myau"); } // PURE被覆盖,CCat 不是抽象类,可以创建
     };
    
    //--- 错误使用的例子
    new CAnimal;         // 'CAnimal' 错误 - 编译器返回"不能实例化抽象类"的错误
    CAnimal some_animal; // 'CAnimal' 错误 - 编译器返回"不能实例化抽象类"的错误
    
    //--- 正确使用的示例
    new CCat;  // 没有错误 - CCat 类不是抽象类
    CCat cat;  // 没有错误 - CCat 类不是抽象类
    抽象类的限制
    如果抽象类的构造函数调用一个纯虚拟函数(直接或间接),结果是未定义的。
    //+------------------------------------------------------------------+
    //| 抽象基类                                           |
    //+------------------------------------------------------------------+
    class CAnimal
      {
    public:
       //--- 纯虚拟函数
       virtual void      Sound(void)=NULL;
       //--- 函数
       void              CallSound(void) { Sound(); }
       //--- 构造函数
       CAnimal()
        {
         //--- 虚拟类函数的显式调用
         Sound();
         //--- 隐式调用(使用第三个函数)
         CallSound();
         //--- 构造函数或析构函数始终调用自己的函数,
         //--- 即使它们是虚拟函数并且已经被派生类中已调用的函数所覆盖
         //--- 如果调用的函数是纯虚拟函数
         //--- 调用会引起“纯虚拟函数调用”的关键的执行错误
        }
      };
    然而,抽象类的构造函数和析构函数可以调用其他成员函数。

  2. 添加支持函数指针来简化事件模式的安排。

    若要声明一个函数指针,请指定"函数指针"类型,例如:
    typedef int (*TFunc)(int,int);
    现在,TFunc是一种类型,可以声明函数的变量指针:
    TFunc func_ptr;
    func_ptr 变量可以存储函数地址以便稍后声明:
    int sub(int x,int y) { return(x-y); }
    int add(int x,int y) { return(x+y); }
    int neg(int x)       { return(~x);  }
    
    func_ptr=sub;
    Print(func_ptr(10,5));
    
    func_ptr=add;
    Print(func_ptr(10,5));
    
    func_ptr=neg;           // 错误:neg 不是 int (int,int) 型
    Print(func_ptr(10));    // 错误:应该有两个参数
    函数指针可以被存储并作为参数传递。您不能得到非静态类函数的指针。

  3. MqlTradeRequest 有两个新字段:

    • position — 持仓标签。锁仓模式交易下为了明确识别而改变和关闭持仓时来填写。在净额系统,填写字段不会有任何影响,因为持仓只识别一个交易品种名称。
    • position_by — 反向持仓标签。它用于通过反向持仓平仓时(打开一个同名但反向的交易品种)。该标签仅用于锁仓系统。

  4. 添加TRADE_ACTION_CLOSE_BY 值到 ENUM_TRADE_REQUEST_ACTIONS 交易操作类型枚举 — 通过反向持仓。该标签仅用于锁仓系统。

  5. 添加交易操作标签到适当订单,交易和持仓属性的枚举:

    • 添加ORDER_TICKET 属性到 ENUM_ORDER_PROPERTY_INTEGER — 订单标签。每个订单会分配一个独一无二的号码。
    • 添加 DEAL_TICKET 属性到 ENUM_DEAL_PROPERTY_INTEGER — 交易标签。每笔交易会分配一个独一无二的号码。
    • 添加POSITION_TICKET 属性到 ENUM_POSITION_PROPERTY_INTEGER — 持仓标签。每个新持仓会分配一个独一无二的号码。它通常匹配用于持仓的订单标签,除非标签更改为服务器上服务操作的结果,例如,收取重新持仓库存费时。若要找出一个用于持仓的订单,请应用POSITION_IDENTIFIER 属性。POSITION_TICKET 值对应MqlTradeRequest::position。

  6. 添加ORDER_TYPE_CLOSE_BY 值到he ENUM_ORDER_TYPE 订单类型枚举 — close by 订单。
  7. 添加ORDER_POSITION_BY_ID 值到ENUM_ORDER_PROPERTY_INTEGER 订单属性枚举 —ORDER_TYPE_CLOSE_BY 类型订单的反向持仓标识符。
  8. 添加DEAL_ENTRY_OUT_BY 值到 ENUM_DEAL_ENTRY 交易方向枚举 — 由close by操作执行交易。
  9. MqlTradeTransaction 也有两个类似的字段:

    • position — 由交易活动影响的持仓标签。这里填写处理市场订单(TRADE_TRANSACTION_ORDER_* except TRADE_TRANSACTION_ORDER_ADD,在这里持仓标签尚未分配) 和订单历史(TRADE_TRANSACTION_HISTORY_*)相关的交易活动。
    • position_by — 反向持仓标签。它用于通过反向持仓平仓时(打开一个同名但反向的交易品种)。这里只填写通过反向持仓而平仓的订单 (close by) 和通过反向持仓而关闭的交易 (out by)。

  10. 添加PositionGetTicket函数 — 根据持仓列表的索引返回一个持仓标签和使用PositionGetDouble, PositionGetInteger 和PositionGetString函数自动选择持仓用于进一步工作。
    ulong  PositionGetTicket(
       int  index      // 持仓列表索引
       );

  11. 添加PositionSelectByTicket 函数 — 通过指定标签为进一步工作选择一个持仓。
    bool  PositionSelectByTicket(
       ulong   ticket     // 持仓标签
       );

  12. 添加SYMBOL_MARGIN_HEDGED 值到 ENUM_SYMBOL_INFO_DOUBLE 交易品种属性枚举 — 合约大小或一手锁仓预付款(一个交易品种的反向持仓)。

    • 如果一个交易品种指定了初始预付款 (SYMBOL_MARGIN_INITIAL),锁仓预付款被指定为绝对值(以货币计算)。
    • 如果没有设置初始预付款(等于0),预付款计算中将被使用的合约大小在SYMBOL_MARGIN_HEDGED指定。预付款使用对应一个交易品种类型 (SYMBOL_TRADE_CALC_MODE)的等式计算。

    锁仓预付款计算的详细信息会在MetaTrader 5 交易平台帮助中说明。

  13. 添加ACCOUNT_MARGIN_MODE 值到 ENUM_ACCOUNT_INFO_INTEGER 账户属性枚举 — 当前交易账户的预付款计算模式:

    • ACCOUNT_MARGIN_MODE_RETAIL_NETTING — 用于净额模式账户持仓时的场外交易市场(一个交易品种一个持仓)。预付款计算基于交易品种类型 (SYMBOL_TRADE_CALC_MODE)。
    • ACCOUNT_MARGIN_MODE_EXCHANGE — 用于交易所市场。预付款计算基于交易品种设置中指定的折扣。折扣由交易商设置,但是它们不能低于交易所设置的值。
    • ACCOUNT_MARGIN_MODE_RETAIL_HEDGING — 用于独立持仓账户场外交易市场(锁仓,一个单一交易品种可以有多个持仓)。预付款计算基于交易品种类型 (SYMBOL_TRADE_CALC_MODE)。也要考虑锁仓预付款大小 (SYMBOL_MARGIN_HEDGED) 。

  14. 添加TERMINAL_SCREEN_DPI 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性枚举 — 分辨率显示数据通过每英寸的点数来衡量 (DPI)。该参数的信息允许指定图形对象的大小,这样它们在不同分辨率的显示器上看起来一样。

  15. 添加 TERMINAL_PING_LAST 值到 ENUM_TERMINAL_INFO_INTEGER 客户端属性 — 以微秒计算交易服务器最后得到的ping值。一秒等于一百万微秒。

  16. 修正返回SendFTP函数调用结果之前,成功发送后返回 FALSE 而不是 TRUE。
  17. 修正偶尔导致"违规访问"执行错误的StringConcatenate函数错误。
  18. 修正使用模板函数时发生的几个错误。
  19. 添加为打印,警示和评论功能显示超过4000字符行的能力。
  20. 修正ArrayCompare函数通过不同于开始时期的初始持仓变化来比较数组和函数本身时产生的错误。
  21. 添加支持标准库的锁仓功能:

    CPosition
    添加类函数:

    • SelectByMagic — 根据魔幻数选择持仓和进一步工作的交易品种。
    • SelectByTicket — 通过进一步工作的标签选择持仓。

    CTrade
    添加类函数:

    • RequestPosition — 收到持仓标签。
    • RequestPositionBy — 接收反向持仓标签。
    • PositionCloseBy — 通过反向持仓支持标签平仓。
    • SetMarginMode — 根据当前账户设置来设置预付款计算模式。

    添加重载类函数:

    • PositionClose — 平仓标签。
    • PositionModify — 修改持仓标签。

    CAccountInfo
    改变类函数:

    • MarginMode — 接收预付款计算模式。直至目前,类函数的工作类似于新的StopoutMode 类函数。
    • MarginDescription — 接收预付款计算模式为字符串。直至目前,类函数的工作类似于新的StopoutModeDescription类函数。

    添加类函数:

    • StopoutMode — 接收最小预付款水平规范模式。
    • StopoutModeDescription — 接收最小预付款水平规范模式为字符串。

    CExpert
    添加类函数:

    • SelectPosition — 为进一步工作选择持仓。

  22. 对标准程序库添加一些改进。


信号

  1. 修正几个交易信号窗显示错误。


Tester

  1. 修正几个交易品种类型上妨碍计算手续费的错误。
  2. 修正根据相应持仓的专家字段填写激活SL/TP得到的交易订单的专家字段。之前,不填写这些内容。
  3. 修正切换到通常状态并进一步优化结果的标签。
  4. 修正计算和显示“轨道线”指标。
  5. 优化可视化测试。
  6. 假设大量新建订单和持仓情况下,优化利润和预付款计算。
  7. 优化高频交易期间的交易操作。
  8. 现在,如果是非关键交易品种属性请求(不需要当前报价),则不执行历史同步。例如,SYMBOL_SELECT,SYMBOL_DIGITS,SYMBOL_SPREAD_FLOAT,SYMBOL_TRADE_CALC_MODE,SYMBOL_TRADE_MODE,SYMBOL_TRADE_STOPS_LEVEL,SYMBOL_TRADE_FREEZE_LEVEL,SYMBOL_TRADE_EXEMODE等等。之前,非关键交易品种历史记录在其属性的任何请求下都会同步。

MetaEditor

  1. 修正“全字匹配”模式下文件的搜索词。
  2. 添加在所需文件的编译结果行上双击移动到一个文件。
  3. 修正显示Windows XP中的一些控制元素。


  1. 更新文档。
1234567891011121314...16