- 新的消息设计。现在,MQL5.community消息和来自桌面平台的推送消息显示为类似于流行的移动messenger聊天。
- 现在可以直接从平台切换到23种可用语言的其中一种。例如,如果您喜欢使用英语界面,您可以在"关于"页面进行选择而无需改变您设备的语言设置。
修正测试期间每年按百分比计算手续费。
修正测试进行中生成的图表上的结余计算和展示。
公开测试两个月后,多元化MetaTrader 5 平台网页版 现已官方对外发布。它允许从任何浏览器和任何操作系统进行外汇和金融市场交易。仅需网络连接即可,无需安装任何软件。
该应用将桌面版的主要优势(高速,支持多元化市场和扩展的交易功能)与网页程序端的便利性和跨平台特性相结合。该发布版的主要功能在于测试版中所没有的市场深度。
网页平台允许交易者执行技术分析和交易操作,就像在桌面版一样。网页平台提供以下特性:
现在从桌面平台转移SSL证书到移动平台更加容易。您不再需要iTunes去完成它。
MetaTrader 5允许您通过使用证书为您的账户添加额外保护。没有证书,则无法连接。如果证书在桌面版创建,您应该能够通过移动设备进入您的账户转移它。
为此,请打开桌面平台,在导航窗口右击所需的账户,并选择转移。设置只有您知道的证书密码,打开移动平台,连接您的账户。您将被立即提供导入证书。
此外,最新版还具有从MetaTrader 4转移账户的迁移对话框。如果您的账户已经转移到第五代交易平台,我们热烈欢迎,并提供有关新特性的信息和要求更改您的密码。
之前 |
之后 |
|
---|---|---|
起动 | 所有挂单类型和SL/TP的卖价/买价 |
限价订单卖价/买价 最终止损,止损限价和SL/TP订单 |
执行 | 所有挂单类型和SL/TP的订单指定价格 |
所有挂单类型和SL/TP的订单起动时的卖价/买价 |
让我们考虑Si-6.16 交易品种的示例。起动价格的新买入止损订单 = 设定72580 而当前价格是:Bid=72570,Ask=72572,Last=72552。在价格流新收到的当前价格:
起动交易工具止损订单的是最终价。所以价格流中收到的Last price=72580 激活买入止损订单。在早期版本中,相同价格将用于执行该订单。这个行为是错误的,因为市场中没有Ask=72580 执行买入交易。
修正崩溃日志中报告的错误。
MetaTrader 5 网页平台测试版现已发布。新产品将网页程序端的便利性和跨平台的特性与MetaTrader 5桌面版的优势相结合 – 高速,支持多元化市场和扩展的交易功能。
MetaTrader 5 网页平台可在MQL5.community上使用,它允许交易者从任何浏览器和操作系统,包括Windows,Mac和Linux,执行金融市场的交易操作。您只需要一个网络连接。不需要额外的软件。
测试版拥有以下特性:
净额系统
通过这个系统,在同一时间,一个交易品种您只能有一个普通持仓:
这没关系,导致反向交易的是 — 已执行的市场订单或触发的挂单。
下面示例显示了执行两个每笔0.5手的EURUSD买入交易:
执行这两个交易即是1手的一个普通持仓。
锁仓系统
通过这个系统,您可以一个交易品种拥有多个持仓,包括反向持仓。
如果您有一个交易品种的持仓,执行一个新交易(或触发挂单),那么会另外建立一个新持仓。您当前持仓不会改变。
下面示例显示了执行两个每笔0.5手的EURUSD买入交易:
执行这些交易则会新建两个独立的持仓。
新交易操作类型 - Close By
新的交易类型已经被加入锁仓账户 — 通过反向持仓来平仓。这个操作允许在单一交易品种关闭两个反向的持仓。如果反向持仓手数不同,那么两个持仓中只有一个订单保留持仓。其交易量将等于平仓手数的差异值,而持仓方向和开盘价将匹配平仓的更大(交易量)。
相比单独关闭两个持仓,关闭反向持仓允许交易者保留一个点差:
在后面那种情况下,下单"close by" 订单。平仓信息在该评论指明。一组反向持仓通过两个"out by"交易关闭。关闭两个持仓得到的总利润/亏损只在一个交易中指明。
订单和持仓(包括历史订单)标签在导入过程中不会保留,因为从MetaTrader 4导入一个历史记录可能相当于MetaTrader 5中的4个历史操作。所有的交易记录都会分配新的标签。
根据交易商导入的方式可以保留或替代账号。
class CAnimal { public: CAnimal(); // 构造函数 virtual void Sound() = 0; // 纯虚拟函数 private: double m_legs_count; // 动物脚的数量 };这里Sound() 是一个纯虚拟函数,因为它声明为纯虚拟函数PURE (=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(); //--- 构造函数或析构函数始终调用自己的函数, //--- 即使它们是虚拟函数并且已经被派生类中已调用的函数所覆盖 //--- 如果调用的函数是纯虚拟函数 //--- 调用会引起“纯虚拟函数调用”的关键的执行错误 } };然而,抽象类的构造函数和析构函数可以调用其他成员函数。
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)); // 错误:应该有两个参数函数指针可以被存储并作为参数传递。您不能得到非静态类函数的指针。
ulong PositionGetTicket( int index // 持仓列表索引 );
bool PositionSelectByTicket(
ulong ticket // 持仓标签
);
新持仓账户系统类似于MetaTrader 4中的系统,并结合第五代平台的全部优势 - 使用多个交易(包括部分填充)执行订单,止损限价订单,和更多订单模式。
立即更新平台了解锁仓选项的工作方式。新建一个新模拟账户时,启用\"使用锁仓\"选项。如果您交易商的服务器已经更新及配置,就可使用这个选项。
新持仓账户系统类似于MetaTrader 4中的系统,并结合第五代平台的全部优势 - 使用多个交易(包括部分填充)执行订单,止损限价订单,和更多订单模式。
立即更新平台了解锁仓选项的工作方式。新建一个新模拟账户时,启用\"使用锁仓\"选项。如果您交易商的服务器已经更新及配置,就可使用这个选项。
添加教学视频"如何在MQL5向导中创建自动交易"的链接到MQL5向导。请观看该三分钟视频,开发自动交易,无需编写单行代码。
Terminal
2015.10.14 14:48:18.486 Data Folder: C:\Program Files\MetaTrader 5 2015.10.14 14:48:18.486 Windows 7 Professional (x64 based PC), IE 11.00, UAC, 8 x Intel Core i7 920 @ 2.67GHz, RAM: 8116 / 12277 Mb, HDD: 534262 / 753865 Mb, GMT+03:00 2015.10.14 14:48:18.486 MetaTrader 5 build 1190 started (MetaQuotes Software Corp.)
struct MqlTick { datetime time; // 最近更新价格的时间 double bid; // 当前卖价 double ask; // 当前买价 double last; // 当前收盘价 ulong volume; // 当前收盘价的交易量 long time_msc; // 以毫秒为单位的最近更新价格的时间 uint flags; // 报价标识 };无论与之前报价相比是否有变化都会填充每个报价参数。因此,可以找出过去任何时刻的正确价格,无需在报价历史搜索之前的值。例如,即使报价到达期间只有卖价变化,该结构仍然包含其他参数,包括之前的买价,交易量等等。您可以分析报价标识,找出具体更改了哪个数据:
//+------------------------------------------------------------------+ //| TemplTest.mq5 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" //+------------------------------------------------------------------+ //| 声明一个模板类 | //+------------------------------------------------------------------+ template<typename T> class TArray { protected: T m_data[]; public: bool Append(T item) { int new_size=ArraySize(m_data)+1; int reserve =(new_size/2+15)&~15; //--- if(ArrayResize(m_data,new_size,reserve)!=new_size) return(false); //--- m_data[new_size-1]=item; return(true); } T operator[](int index) { static T invalid_index; //--- if(index<0 || index>=ArraySize(m_data)) return(invalid_index); //--- return(m_data[index]); } }; //+------------------------------------------------------------------+ //| 指针数组的模板类析构函数,删除 | //| 对象,数组中存储指针的对象。 | //| | //| 请注意继承TArray 模板类 | //+------------------------------------------------------------------+ template<typename T> class TArrayPtr : public TArray<T *> { public: void ~TArrayPtr() { for(int n=0,count=ArraySize(m_data);n<count;n++) if(CheckPointer(m_data[n])==POINTER_DYNAMIC) delete m_data[n]; } }; //+--------------------------------------------------------------------------+ //| 声明类。对象指针将存储在数组中 | //+--------------------------------------------------------------------------+ class CFoo { int m_x; public: CFoo(int x):m_x(x) { } int X(void) const { return(m_x); } }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ TArray<int> ExtIntArray; // 例如 TArray (int 类型 的特定TArray ) TArray<double> ExtDblArray; // 例如TArray (double类型的特定 TArray ) TArrayPtr<CFoo> ExtPtrArray; // 例如 TArrayPtr (CFoo类型的特定 TArrayPtr ) //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { //--- 用数据填充数组 for(int i=0;i<10;i++) { int integer=i+10; ExtIntArray.Append(integer); double dbl=i+20.0; ExtDblArray.Append(dbl); CFoo *ptr=new CFoo(i+30); ExtPtrArray.Append(ptr); } //--- 输出数组内容 string str="Int:"; for(int i=0;i<10;i++) str+=" "+(string)ExtIntArray[i]; Print(str); str="Dbl:"; for(int i=0;i<10;i++) str+=" "+DoubleToString(ExtDblArray[i],1); Print(str); str="Ptr:"; for(int i=0;i<10;i++) str+=" "+(string)ExtPtrArray[i].X(); Print(str); //--- 通过new创建的CFoo对象不应删除,因为它们在TArrayPtr<CFoo>对象的析构函数被删除 }执行结果:
int ObjectsDeleteAll( long chart_id, // 图表ID const string prefix, // 对象名称前缀 int sub_window=-1, // 窗口指数 int object_type=-1 // 删除的对象类型 );
修正崩溃日志中报告的错误。
更新文档。