之前 | 之后 | |
---|---|---|
起动 | 所有挂单类型和SL/TP的卖价/买价 | 限价订单卖价/买价 最终止损,止损限价和SL/TP订单 |
执行 | 所有挂单类型和SL/TP的订单指定价格 | 所有挂单类型和SL/TP的订单起动时的卖价/买价 |
让我们考虑Si-6.16 交易品种的示例。起动价格的新买入止损订单 = 设定72580 而当前价格是:Bid=72570,Ask=72572,Last=72552。在价格流新收到的当前价格:
起动交易工具止损订单的是最终价。所以价格流中收到的Last price=72580 激活买入止损订单。在早期版本中,相同价格将用于执行该订单。这个行为是错误的,因为市场中没有Ask=72580 执行买入交易。
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]
更新内容将通过LiveUpdate系统提供。
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 // 持仓标签
);
净额系统
通过这个系统,在同一时间,一个交易品种您只能有一个普通持仓:
这没关系,导致反向交易的是 — 已执行的市场订单或触发的挂单。
下面示例显示了执行两个每笔0.5手的EURUSD买入交易:
执行这两个交易即是1手的一个普通持仓。
锁仓系统
通过这个系统,您可以一个交易品种拥有多个持仓,包括反向持仓。
如果您有一个交易品种的持仓,执行一个新交易(或触发挂单),那么会另外建立一个新持仓。您当前持仓不会改变。
下面示例显示了执行两个每笔0.5手的EURUSD买入交易:
执行这些交易则会新建两个独立的持仓。
新交易操作类型 - Close By
新的交易类型已经被加入锁仓账户 — 通过反向持仓来平仓。这个操作允许在单一交易品种关闭两个反向的持仓。如果反向持仓手数不同,那么两个持仓中只有一个订单保留持仓。其交易量将等于平仓手数的差异值,而持仓方向和开盘价将匹配平仓的更大(交易量)。
相比单独关闭两个持仓,关闭反向持仓允许交易者保留一个点差:
在后面那种情况下,下单"close by" 订单。平仓信息在该评论指明。一组反向持仓通过两个"out by"交易关闭。关闭两个持仓得到的总利润/亏损只在一个交易中指明。
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 // 持仓标签
);
添加教学视频"如何在MQL5向导中创建自动交易"的链接到MQL5向导。请观看该三分钟视频,开发自动交易,无需编写单行代码。
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 // 删除的对象类型 );
更新文档。
现在,您可以无需注册即可从您的MetaTrader 4/5 程序端直接一步购买任何市场 应用程序。只需点击购买和选择首选支付方式。
然后,您将被重新定向到支付系统的网页,完成购买。PayPal,WebMoney,Neteller 或银行卡 - 您可以选择从现有自动交易和指标商店购买产品的支付方式。
购买之后,我们仍然建议您注册一个MQL5.community账户,以便您的产品可以自动连接到您的账户。MQL5账户可以帮您更新产品并在多台电脑上安装它。此外,MQL5.community 账户还可以使您有机会访问MetaTrader平台的大量的其他服务, 例如复制成功交易者交易的 交易信号,可以连续操作应用程序的虚拟主机 和从开发者订购独一无二自动交易的自由职业者服务。
现在,您应该了解了获得自动交易的最快最轻松的方法。5 000多种MetaTrader 应用程序已做好准备,在市场中等待着您 - 只需 选择和购买!