程序端
- 重新设计了内置虚拟主机管理选项。关于租用程序端以及环境迁移、停止和启动功能的所有信息,现在都可以在“工具箱”窗口的单独选项卡中获得。
在早期版本中,“虚拟主机”功能可以在“导航”窗口的快捷菜单中使用。现在所有必要的信息和控制命令都方便简捷地排列在“VPS”选项卡中:
基本订阅信息显示在左侧:
- 连接数据:比较您主机服务器和本地计算机上的客户端运行之间的网络延迟。
- 租用主机的交易账户和付款计划。
- 独特的订阅标识符。点击ID打开MQL5.community用户个人资料中的“主机”部分,也可以在这里管理订阅。
- 注册日期和当前状态。如果主机服务停止,那么相应的状态将立即出现在这里。
使用“启动/停止”按键,虚拟程序端可以快速启动或停止。
有关主机服务器硬件和CPU使用图表的数据显示在右侧窗口区。根据显示的信息,如果您的EA交易或指标使用了过多的内存或CPU时间,您将可以及时作出响应。
有关最后交易的环境迁移以及迁移命令的信息也在这里提供。这些命令可以在购买订阅后加快环境迁移的速度。
虚拟平台可以从“VPS”选项卡租用。租用过程不变,仍旧可以快速轻松完成租用。您只需选择一个计划和一个合适的付款方式。将会自动选择连接您交易商的最佳服务器。
- 添加在交易商网站快速切换到入金/出金操作的能力。
无需在交易商网站的交易者室中搜索对应的功能。可在程序端中直接获得快速导航命令:“导航”和“工具箱”中的账户菜单 > 交易选项卡:
- 只有在交易商对交易账户启用对应的功能,才可以进行入金/出金操作。
- 交易程序端不执行任何账户入金/出金操作。集成功能将用户重新定向到对应的交易商网站页面。
- 交易品种规格中的新字段:
分类
这个属性用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。只有在交易商提供对应信息的情况下才显示分类。
交易所
进行证券交易的交易所名称。只有在交易商提供对应信息的情况下才显示分类。
手续费
有关交易商为成交交易品种所收取的手续费的信息。计算详细信息在这里显示:
- 手续费包括单级手续费和多级手续费,即无论成交量/交易额是多少,手续费都是相同的,或者可以根据交易规模而定。对应的数据在程序端显示。
- 手续费可以在交易完成后,或在交易日/交易月结束时立即收取。
- 手续费可以依据成交方向进行收取:市场买入、市场卖出或两种都包括的操作类型。
- 手续费可按照每手或每笔交易来收取。
- 手续费能够以资金金额、百分比或点数来计算。
例如,下面进入交易表示交易进入和退出时立即收取手续费。如果成交量为0 - 10手,那么每次操作收取1.2 USD手续费。如果成交量为11 - 20手,那么每笔交易每手收取1.1USD手续费。
手续费 | 立即、交易量、进入/退出交易
0 - 10 | 每笔交易1.2 USD
11 - 20 | 每手交易1.1 USD
- 附加期权相关字段已添加到交易品种规格中:
- 期权类型 — 买进或卖出
- 标的 — 期权的标的交易品种
- 执行价格 — 期权执行价格
- 添加对期权"Greeks"交付的支持:delta、gamma、vega、theta、rho。交易商可以提供与此类交易品种相关的其他信息。这些数据显示在“市场报价”窗口的“详细信息”部分并可用于高级交易分析:
- “十字光标”工具现在除了之前可用的信息之外,还表示以百分比计算的价格水平之间的距离。
- 添加显示在“市价”执行和“交易所”执行操作期间交易对话框中产生的价格,如果该价格在收到交易商的响应时可用:
- 修正由于“市场报价”窗口中的“全部显示”命令无法显示所有可用交易品种列表而产生的错误。
MQL5
- 作用域操作已得到修改,因此MQL5更加接近C++。这为MQL5程序员在使用第三方程序库时提供更广泛的可能性。此更新消除了修改程序库和统一标识符的需求。
例如,代码包含两个同名结构的声明,即使它们属于不同的类。在早期版本中,这类声明会导致编译错误:“标识符已使用”。现在,这个代码将被成功编译并执行。要从作用域外正确地访问所需的变量/结构/函数,您应指定一个类(在本例中是CBar::Item)。
class CFoo
{
public:
struct Item { int x; };
};
class CBar
{
public:
struct Item { int x; };
};
CBar::Item item;
Item item;
添加namespace支持,它可以在MQL5应用程序使用第三方代码/程序库时提供更多的可能性。
#define PrintFunctionName() Print(__FUNCTION__)
namespace NS
{
void func()
{
PrintFunctionName();
}
struct C
{
int x;
C() { PrintFunctionName(); };
};
}
struct C
{
int x;
C() { PrintFunctionName(); };
};
void func()
{
PrintFunctionName();
}
void OnStart()
{
func();
NS::func();
C c;
NS::C ac;
}
执行时,输出以下结果:
2019.09.18 13:39:35.947 TestScript (AUDCAD,H1) func
2019.09.18
13:39:35.949 TestScript (AUDCAD,H1) NS::func
2019.09.18 13:39:35.949 TestScript (AUDCAD,H1) C::C
2019.09.18
13:39:35.949 TestScript (AUDCAD,H1) NS::C::C
- 新版本支持使用以下函数更快速地访问时间序列数据:iTime、 iOpen、iHigh、iLow、iClose、iVolume、iTickVolume、iSpread。
- 添加对"=delete"属性的支持。它可以禁止使用某些类方法。
class A
{
void operator=(const A &)=delete;
};
class B : public A
{
};
void OnStart()
{
A a1,a2;
B b1,b2;
a1=a2;
b1=b2;
}
在这个示例中,编译器将返回错误"a1=a2"和"b1=b2":
试图引用已删除函数'void A::operator=(const A&)'
'void A::operator=(const A&)'函数在这里被明确删除
试图引用已删除函数'void B::operator=(const B&)'
'void B::operator=(const B&)'函数被隐式删除,因为它由已删除函数'void A::operator=(const A&)'产生
- 以下值已被添加到ENUM_SYMBOL_INFO_STRING枚举:
- SYMBOL_CATEGORY — 交易品种分类。它用于额外标记交易品种。例如,这可以是该交易品种所属的市场行业:农业、石油&天然气等。
- SYMBOL_EXCHANGE — 进行交易品种交易的交易所的名称。
- 添加对通过FIFO规则平仓的支持。
- ACCOUNT_FIFO_CLOSE值已被添加到ENUM_ACCOUNT_INFO_INTEGER。它表示只能通过FIFO规则平仓。如果属性值为true,那么每个交易品种都将按照持仓的相同顺序进行平仓:最早的持仓应最先平仓,然后以此类推。如果试图以不同的顺序进行平仓,则将返回一个错误。没有锁仓管理的账户的属性值始终为'false' (ACCOUNT_MARGIN_MODE!=ACCOUNT_MARGIN_MODE_RETAIL_HEDGING)。
- 新返回代码:MT_RET_REQUEST_CLOSE_ONLY — 请求被拒绝,因为交易品种已经设置“仅通过FIFO规则关闭现有持仓”规则
主要有三种平仓方法:
- 从客户端平仓:交易者使用EA,基于“信号”服务订阅等手动平仓。如果试图平仓,但不符合FIFO规则,那么交易者将收到一个对应的错误。
- 在“止损”或“止盈”激活时平仓:这些订单在服务器端处理,因此不在交易者端(程序端)请求平仓,而是由服务器发起。如果一个持仓触发“止损”或“止盈”,且该持仓不符合FIFO规则(相同交易品种有一个更早的持仓),则该持仓将不会平仓。
- 在“强平”触发时平仓:这些操作也在服务器端处理。在正常模式下(禁用基于FIFO平仓),“强平”时从亏损最大的持仓开始平仓。如果启用此选项,则将为亏损持仓额外检查开仓时间。服务器确定每个交易品种的亏损持仓,找出每个交易品种的最早持仓,然后在找到的持仓中关闭亏损最大的持仓。
- 添加通过“输入组”进行参数分组的选项。这可以根据参数的基本逻辑实现参数的可视化分离。
在以下EA交易代码中,输入参数根据其用途进行分组:
input group "Signal"
input int ExtBBPeriod = 20;
input double ExtBBDeviation=2.0;
input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15;
input group "Trend"
input int ExtMAPeriod = 13;
input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15;
input group "ExitRules"
input bool ExtUseSL = true;
input int Ext_SL_Points = 50;
input bool ExtUseTP = false;
input int Ext_TP_Points = 100;
input bool ExtUseTS = true;
input int Ext_TS_Points = 30;
input group "MoneyManagement"
sinput double ExtInitialLot =0.1;
input bool ExtUseAutoLot =true;
input group "Auxiliary"
sinput int ExtMagicNumber =123456;
sinput bool ExtDebugMessage=true;
当这种EA在“策略测试”中启动时,输入参数块可以通过双击组名来折叠或扩展,并且可以通过单个复选框选择组内的所有参数进行优化。
- 修正导入名称匹配MQL5函数名称的DLL函数。例如:
#import "lib.dll"
int func();
#import
int func()
{
return(0);
}
void OnStart()
{
Print( func() );
}
在早期版本中,编译时会返回以下错误:
'func' - 对具有相同参数的重载函数的模糊调用可以是2种函数之一
int func()
int func()
现在,默认情况下将使用优先级更高的内置MQL5函数,来代替错误。导入的函数可以通过显式指定作用域来调用:
void OnStart()
{
Print( lib::func() );
}
- 修正经济日历新闻中的时间规格。现在,交付事件时考虑的是程序端所连接的交易服务器的时区,而不是本地计算机的时区。
- 修正Copyticks和CopyTicksRange函数中的过多内存消耗。
信号
- 修正使用Wine(Mac OS和Linux)工作时信号图表的显示。
Tester
- 策略测试的大规模更新。全新开始页面、重新设计的设置页面、提高了可用性。
开始页面
现在,tester启动之后,用户看到的是一个标准任务列表,而不是多个设置,通过选择任务,用户可以快速开始测试。新设计主要是为没有经验的用户而准备的。
我们选择最频繁的策略测试和优化任务,并将其添加到开始页面。此外,还可以从开始页面重新启动一个以前执行的任务。如果您运行了多个任务,且这些任务不适合开始页面,那么请使用搜索栏。您可以通过任何参数找到测试:程序名称、交易品种、时间周期、建模模式等。
隐藏不相关的参数
选择任务之后,用户继续进一步测试参数:选择EA交易、交易品种、测试周期等。所选任务不需要的所有无关参数都将从设置页面中隐藏。例如,选择数学计算,只需要指定两个参数:选择要测试的程序和优化模式。在测试期间,将会隐藏延迟和报价生成的设置。
方便测试设置
为了方便起见,设置页面上的一些参数已经重新排列。对延迟和可视化参数添加了扩展解释。此外,现在测试设置可以手动保存和加载,因此交易者可以快速返回到以前的设置。
使用相同的选项卡,您可以在MetaEditor中快速打开程序进行编辑。
以点数计算盈利
使用这些设置,您可以启用以点数计算盈利。这种模式加快了测试速度,同时不需要使用转化率以入金货币重新计算盈利(因此没有必要下载对应的价格历史)。在此模式下,取消库存费和手续费的计算。
请注意,当以点数计算盈利时,成交量并不重要。每笔交易只计算盈/亏点数。此外,在此模式下不执行预付款控制。只将其用于快速粗略的策略评估,然后使用更精确的模式检查得到的结果。
一般改进
测试启动/停止按键和进度条已经被移到选项卡栏。因此,用户可以控制任何“策略测试”部分的流程。测试启动/停止命令也被添加到设置和输入部分的快捷菜单中。
- 优化图表现在可以显示在程序端的主工作区,而不是显示在单独的策略测试区。这样,就可以为数据分析提供更多的空间。同时更新了3D可视化系统。
- 为“市场报价中全部交易品种”模式添加保存优化缓存。
- 添加保存测试缓存。
在早期版本中,只有在优化EA交易时才会将所执行任务的结果保存到文件中。现在,单个测试期间也保存缓存文件,通过它用户可以返回到之前的计算,并随时查看统计数据、结余、净值和入金加载图。在未来的版本中,这个选项将支持测试结果的比较。
要加载之前的测试结果,请使用Tester新开始页面:点击“之前的结果”并选择想要的网站:
- 明显加快了测试和优化的速度,包括使用MQL5云网络执行的操作。
- 修正并优化了周期操作。
MetaEditor
- 添加配置代码样式(styler)的功能。
MetaEditor包含一个内置代码样式(styler),它可以根据所采用的标准自动格式化程序文本。现在除了常见样式外,您还可以使用其他流行的标准。为此,请打开MetaEditor设置并选择所需的样式:
可以为样式(styler)额外设置以下参数:
每个缩进空间
设置用于对齐内嵌结构的空格数:
if(condition)
{
}
用空格代替制表符
如果启用此选项,样式(styler)将用空格代替代码中的所有制表符。每个制表符的字符数在“一般”部分中设置。
删除空行
启用此选项后,样式(styler)将删除只有一个换行符的所有行。
在逗号和分号之后插入空格
启用此选项后,样式(styler)将使用元素枚举以可视方式分隔结构。示例:
ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop);
ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);
在声明操作符周围插入空格
启用此选项后,样式(styler)将围绕赋值、等式、比较和其他操作符插入空格。示例:
if(x==1&y!=2)
{
int a=0;
}
if(x == 1 & y != 2)
{
int a = 0;
}
- “在导航中显示”命令已添加到文件书签的快捷菜单。因此,用户可以轻松地在编辑器文件夹结构中找到要编辑的打开文件。
- 修正在工具提示中显示'union'关键字。
用户界面翻译又添加了18种新语言:
- 欧盟地区 — 瑞典语、立陶宛语、丹麦语、拉脱维亚语、爱沙尼亚语、塞尔维亚语、斯洛文尼亚语、斯洛伐克语、芬兰语、格鲁吉亚语
- 亚洲地区 — 爪哇语、马拉地语、孟加拉语、旁遮普语、泰米尔语、泰卢固语
- 非洲地区 — 斯瓦西里语、豪萨语
该平台界面现已支持50种语言,涵盖40多亿人使用的语言。
若要设置界面语言,请进入程序端顶部的“查看\语言”菜单。
文档已更新。
基于崩溃日志进行修复。
更新将通过实时更新系统提供。