MetaTrader 5 Android版,现在能够轻松创建初始真实交易账户。从菜单选择“开立真实账户”并在服务器列表中找到您的交易商。您只需附加两份文件,包括您的身份证明文件和银行账户账单。然后您的请求将被转发至交易商,同时开立账户时您可能会被要求提供其他信息。
MetaTrader 5 Android版,现在能够轻松创建初始真实交易账户。从菜单选择“开立真实账户”并在服务器列表中找到您的交易商。您只需附加两份文件,包括您的身份证明文件和银行账户账单。然后您的请求将被转发至交易商,同时开立账户时您可能会被要求提供其他信息。
union LongDouble { long long_value; double double_value; };与结构不同,不同的union成员属于同一个内存区。在该示例中,LongDouble函数的union是通过共享同一个内存区的long和double类型值来声明。请注意,由于long_value 和 double_value 变量重复(在内存中),所以union不可以同时存储long整型值和double真实型值(不同于结构)。 换句话说,MQL5程序随时都可以将union的数据处理为整型(long)或真实型(double)值。因此,union允许接收表示相同数据序列的两种(或更多种)选项。
union LongDouble { long long_value; double double_value; }; //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { //--- LongDouble lb; //--- 获得并显示无效 -nan(ind) 数字 lb.double_value=MathArcsin(2.0); printf("1. double=%f integer=%I64X",lb.double_value,lb.long_value); //--- 最大的标准化数值 (DBL_MAX) lb.long_value=0x7FEFFFFFFFFFFFFF; printf("2. double=%.16e integer=%I64X",lb.double_value,lb.long_value); //--- 最小的正标准化 (DBL_MIN) lb.long_value=0x0010000000000000; printf("3. double=%.16e integer=%.16I64X",lb.double_value,lb.long_value); } /* Execution result 1. double=-nan(ind) integer=FFF8000000000000 2. double=1.7976931348623157e+308 integer=7FEFFFFFFFFFFFFF 3. double=2.2250738585072014e-308 integer=0010000000000000 */
class Foo { int value; public: string Description(void){return IntegerToString(value);}; //--- 默认构造函数 Foo(void){value=-1;}; //--- 参数化构造函数 Foo(int v){value=v;}; }; //+------------------------------------------------------------------+ //| 包括 Foo 类型对象的结构 | //+------------------------------------------------------------------+ struct MyStruct { string s; Foo foo; }; //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { //--- MyStruct a,b; Foo an_foo(5); a.s="test"; a.foo=an_foo; Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); //--- Print("b=a"); b=a; //--- Print("a.s=",a.s," a.foo.Description()=",a.foo.Description()); Print("b.s=",b.s," b.foo.Description()=",b.foo.Description()); /* Execution result; a.s=test a.foo.Description()=5 b.s= b.foo.Description()=-1 b=a a.s=test a.foo.Description()=5 b.s=test b.foo.Description()=5 */ }在隐式操作符中执行对象的成员逐一复制。
ENUM_POSITION_REASON | ENUM_DEAL_REASON | ENUM_ORDER_REASON | 原因描述 |
---|---|---|---|
POSITION_REASON_CLIENT | DEAL_REASON_CLIENT | ORDER_REASON_CLIENT | 激活从桌面程序端下单的订单而执行该操作 |
POSITION_REASON_MOBILE | DEAL_REASON_MOBILE | ORDER_REASON_MOBILE | 激活从手机应用下单的订单而执行该操作 |
POSITION_REASON_WEB | DEAL_REASON_WEB | ORDER_REASON_WEB | 激活从网页平台下单的订单而执行该操作 |
POSITION_REASON_EXPERT | DEAL_REASON_EXPERT | ORDER_REASON_EXPERT | 激活从MQL5程序下单的订单而执行该操作,例如EA交易或脚本 |
- | DEAL_REASON_SL | ORDER_REASON_SL | 激活止损而执行该操作 |
- | DEAL_REASON_TP | ORDER_REASON_TP | 激活止赢而执行该操作 |
- | DEAL_REASON_SO | ORDER_REASON_SO | 由于Stop out 事件而执行该操作 |
- | DEAL_REASON_ROLLOVER | - | 由于展期交割而执行交易 |
- | DEAL_REASON_VMARGIN | - | 收取变动预付款后执行交易 |
- | DEAL_REASON_SPLIT | - | 股票或其他资产分割(价格减少)后执行交易,宣布分割期间拥有持仓 |
新版MetaTrader 5 iOS build 1605提供了轻松开立初始交易账户的可能性。请从菜单选择“开立真实账户”并在服务器列表寻找您的交易商。填写您的个人详细资料,附加两份可以确认您身份和地址的文档并提交请求。您的交易商将会为您开立一个真实账户,必要情况下您还需要提供其他信息。
新版MetaTrader 5 iOS还具有优化和重新设计邮箱版块的特性:
更新文档。
MetaTrader 5 Android的交易历史现在能够以持仓的形式显示。在此之前,历史标签仅仅包含订单和交易信息,然而现在,可以根据持仓信息来分析交易。持仓相关的全部交易数据都集中显示在一条记录,显示如下:
现在交易历史能够以持仓的形式显示。在此之前,历史标签仅仅包含订单和交易数据。现在,它还包括了持仓数据。交易平台收集持仓相关的交易数据,然后将数据合并为一个记录。该记录包括:
//+------------------------------------------------------------------+ //| 模板函数 | //+------------------------------------------------------------------+ template<typename T1,typename T2> string Assign(T1 &var1,T2 var2) { var1=(T1)var2; return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| bool+string的特殊重载 | //+------------------------------------------------------------------+ string Assign(bool &var1,string var2) { var1=(StringCompare(var2,"true",false) || StringToInteger(var2)!=0); return(__FUNCSIG__); } //+------------------------------------------------------------------+ //| 脚本起始函数 | //+------------------------------------------------------------------+ void OnStart() { int i; bool b; Print(Assign(i,"test")); Print(Assign(b,"test")); }代码执行后,我们可以看到Assign() 模板函数已被用于int+string组,而重载版也已在第二次调用时用于bool+string组。
string Assign<int,string>(int&,string) string Assign(bool&,string)
template<typename T> T Func() { return (T)0; } void OnInit() { Func<double>(); // 模板函数显式规范 }因此,类型的显式规范将会执行代表参数而非调用参数。
更新文档。
更新文档。
添加通过Facebook注册和登录您的MQL5.com账户的功能。如果您拥有该群组网络的账户,只需几次点击您就可以访问聊天功能及全套的MetaTrader 5服务。
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");
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 */
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"); }
#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); }结果:
#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); //--- }结果:
更新文档。
在交易对话框添加买入,卖出和关闭按键的工具提示。工具提示包括操作期间买入或卖出安全性的信息,以帮助新手了解交易的过程。
标准程序库中加入了MQL5版的ALGLIB数值分析库 。
程序库特点
如何使用
ALGLIB 文件位于\MQL5\Include\Math\Alglib。若要使用这些函数,请将主程序文件添加到您的程序:
#include <Math\Alglib\alglib.mqh>
标准程序库包含了数理统计函数。MQL5 现在提供R语言的功能,这是最好的统计数据处理和分析工具之一。
程序库特点
统计程序库包含计算数据统计特征的函数以及统计分布操作的函数:
如何使用
统计程序库文件位于 \MQL5\Include\Math\Stat。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:
#include <Math\Stat\Binomal.mqh> #include <Math\Stat\Cauchy.mqh>
程序库函数的详细描述可在文章MQL5统计分布 - 使用最好的R中得到。
标准程序库中加入了MQL5版的Fuzzy程序库。Fuzzy程序库实现了Mamdani和Sugeno模糊推理系统。
程序库特点
如何使用
Fuzzy程序库文件位于\MQL5\Include\Math\Fuzzy。若要使用该程序库,请将所需函数的文件添加到您的程序,例如:
#include <Math\Fuzzy\mamdanifuzzysystem.mqh> #include <Math\Fuzzy\sugenofuzzysystem.mqh>
程序库的详细描述可在代码库:Fuzzy - 开发模糊模型的程序库中得到
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); } } }
//--- 绘制相同颜色的蜡烛图 #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,clrRedDRAW_CANDLES 风格允许设置自定义颜色的蜡烛图。使用PlotIndexSetInteger函数运行指标期间还可以动态更改所有颜色(drawing_index_DRAW_CANDLES, PLOT_LINE_COLOR, modifier_number, color),在这里modifier_number 可能是以下的值:
//--- 设置边框和阴影的颜色 PlotIndexSetInteger(0,PLOT_LINE_COLOR,0,clrBlue); //--- 设置牛市蜡烛图主体颜色 PlotIndexSetInteger(0,PLOT_LINE_COLOR,1,clrGreen); //--- 设置熊市蜡烛图主体颜色 PlotIndexSetInteger(0,PLOT_LINE_COLOR,2,clrRed);
更新文档。
class CFoo final { //--- 类主体 }; class CBar : public CFoo { //--- 类主体 };当如上面显示的一样试图以'final'修饰符从一个类继承时,编译器显示一个错误:
class CFoo { void virtual func(int x) const { } };类函数重写在继承类:
class CBar : public CFoo { void func(short x) { } };但是自变量类型错误的从'int' 变为'short'。实际上,替代重写的重载类函数在这种情况下执行。根据重载函数定义算法进行操作时,编译器在有些情况下可能会选择基本类中定义的类函数而不是重写的类函数。
class CBar : public CFoo { void func(short x) override { } };如果在重写过程中更改了类函数签名,编译器将无法在发布编译错误的父类中找到相同签名的类函数:
class CFoo { void virtual func(int x) final { } }; class CBar : public CFoo { void func(int) { } };当如上面显示的一样试图以'final'修饰符重写一个类函数,编译器显示一个错误:
更新文档。
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对象 } //+------------------------------------------------------------------+
string text="Hello"; ushort symb=text[0]; // 将返回符号'H'代码