文档已更新。
文档已更新。
datetime iTime( string symbol, //交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift //转移 );
double iOpen( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
double iHigh( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
double iLow( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
double iClose( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
long iVolume( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
int iBars( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe // 周期 );
int iBarShift( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 datetime time, // 时间 bool exact=false // 模式 );
int iLowest( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int type, // 时间序列标识符 int count, // 元素数量 int start // 指数 );
int iHighest( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int type, // 时间序列标识符 int count, // 元素数量 int start // 指数 );
long iRealVolume( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
long iTickVolume( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
long iSpread( string symbol, // 交易品种 ENUM_TIMEFRAMES timeframe, // 周期 int shift // 转移 );
void TesterHideIndicators( bool hide //标识 );
文档已更新。
MetaTrader 5 build 1745将是最后一个支持Microsoft Windows XP/2003/Vista操作系统的平台版本。
几个月以前,我们曾经发布未来将停止对旧版本操作系统的支持的公告。Windows 2003,Windows Vista,尤其是Microsoft Windows XP都已经是过时的操作系统。微软在三年前就已经停止对Windows XP的支持,因为由于技术上的限制,在这个操作系统上可能无法实现硬件的潜在性能。
MetaTrader 5 build 1745和之前的版本将可以继续在以上操作系统上运行,但是却不能再接收任何更新。此外,安装程序也将无法在这些操作系统上运行。
现在运行MetaTrader 5所需的最低操作系统版本为Windows 7。然而,我们仍强烈建议您使用64位版本的Windows 10。
新版平台发布后,将停止对旧版本的桌面版和移动版的支持:
为了支持新的共享项目,我们更新了MQL5存储的操作协议。因此,平台更新后,您将需要检查核对来自存储的所有数据。更新过程中,MQL5存储中的所有数据都不会丢失或受到影响。
更新到新版平台之前,我们建议您执行提交操作,将所有本地更改发送到MQL5存储。
如何工作
例如,您可以创建一个工具显示美元指数(USDX)。它使用下面的公式:
50.14348112 * pow(ask(EURUSD),-0.576) * pow(USDJPY,0.136) * pow(ask(GBPUSD),-0.119) * pow(USDCAD,0.091) * pow(USDSEK,0.042) * pow(USDCHF,0.036)
注意:USDEUR和USDGBP货币对在源美元指数公式中使用。因为平台中仅可以使用反向货币对,因此合成交易品种公式中使用的是负能量和买价,而不是卖价。
平台将根据您交易商提供的其他六个交易品种报价来计算新工具的实时价格。价格变化将在市场报价窗口和图表上显示:
int CustomTicksAdd( const string symbol, // 交易品种名称 const MqlTick& ticks[] // 可以用于自定义交易品种的报价数据数组 );CustomTicksAdd函数允许提供报价,如同从交易商服务器接收这些报价。数据被发送至市场报价窗口,而不是直接写入报价数据库。然后,程序端将报价从市场报价窗口保存至数据库。如果在一次调用中传递了大量的数据,那么函数行为就会发生变化来节省资源。如果传送的报价数超过256个,那么数据会被分成两个部分。较大的部分直接记录到报价数据库(类似CustomTicksReplace)。第二部分由最近的128个报价组成,被发送到市场报价,程序端从这里将报价保存到数据库。
功能全面的项目现在已可以在MetaEditor中使用。程序开发过程已变得更加方便。
现在主要的MQL5程序文件不会呈现为项目文件。项目是独立的"MQPROJ"文件,它可以存储程序设置,编译所有已用文件的参数和信息。主要的项目设置可以从独立的对话框访问,所以,现在无需通过#property在源代码中指定项目设置。
为了便于进行项目工作,还提供了独立的导航标签。全部文件,例如包含文件,资源文件,标题文件和其他文件都被安排到这个标签类别中。所有文件都会自动添加到项目导航中。例如,如果您包括了一个新的MQH文件,那么它将自动出现在导航的“相关性”部分。
在更新的MQL5存储在线库中也实现了对新项目的支持。现在,通过与MQL5.community其他成员的协作,开发大型项目变得更加方便。
为组项目提供了新的共享项目部分。在这部分创建的项目会即时发送到存储中:您可以授予其他用户的权限并立即开始协作。
当您在共享项目中编译一个项目时,根据程序类型,可执行文件EX5会自动复制到本地专家,指标或脚本目录。您可以轻松地在图表上启动程序,而无需手动复制文件。
MQL5存储操作中的新功能
为了实现对新共享项目的支持,我们已经更改了MQL5存储的操作协议。因此,平台更新后,您将需要检查核对来自存储的所有数据。更新过程中,MQL5存储中的所有数据都不会丢失或受到影响。
“检查存储”命令现在已经不可用。而是使用“激活MQL5存储”和“更新存储文件”命令来接收数据:
新项目:创建和操作细节的示例
新项目版块已被添加到MetaEditor。项目是一个mqproj文件,可以存储普通程序属性和有关所有已用文件的信息。现在,程序属性可以通过独立的MetaEditor对话框方便地管理,不必在源代码中手动更改属性(使用#property指令)。
如果您有可用代码,您可以通过使用“来自源代码的新项目”命令来轻松地测试新项目。
在已选文件所在的目录中,将会创建一个具有相同名称和mqproj为扩展名的新项目文件。通过#property在源代码中指定的主要程序属性将被自动添加到项目,包括名称,版权,版本,链接到开发者网站和程序描述。
编译MQL5程序的两个新选项已被添加到项目属性:
若要使用项目服务,请使用导航窗口独立的项目标签。项目服务中使用的所有文件都以方便的形式展示在这个标签。当项目从源文件生成时,所有使用的包含文件(在主MQ5文件及其包含文件中通过#include目录指定)都会自动添加到相关性部分。
当新的包含文件添加到源代码时,它也出现在项目导航中。已用的标题文件添加到标题版块;在项目中用作资源的图片,声音和其他MQL5程序也被添加到资源版块。带有源代码的MQ5文件显示在资源版块。在“设置和文件”版块,您可以添加其他文件,例如用于测试的set文件和图表模板。
使用快捷菜单命令向项目添加现有文件或从项目中删除文件。删除文件时请注意,因为您不但可以从项目中移除文件(解除绑定)还可以从硬盘中彻底删除文件:
创建一个新项目犹如创建普通MQL5程序一样简单。单击“新项目”,选择新程序类型并指定MQL5向导中的属性(例如名称,事件处理程序)。
若要获得可执行文件EX5,您可以打开这个项目并按下F7(编译命令)或打开程序的主MQ5文件并编译它。
MQL5存储中的共享项目:操作细节
共享项目是由一个单独的共享项目版块来管理。如果您还没有连接存储库,请在所需文件夹的快捷菜单执行“激活MQL5存储”命令。MetaEditor将检查您的存储库是否包含任何保存数据以及是否有任何共享项目可供您使用。所有可用的数据都将从存储库中恢复并上传到您的电脑(检验操作)。可用的组项目出现在共享项目版块。若要恢复项目,请在快捷菜单中执行“在存储库检查”。
若要创建新组项目,请选择共享项目文件夹并点击“新项目”:
然后完成标准的MQL5步骤:设置所需程序的类型,名称和属性。对于组项目,您应该使用清晰易懂的名称,以便其他参与者能够轻松地找到它们。项目名称中只可以使用没有空格的拉丁字符和数字。
创建的对象会立刻添加到MQL5存储库中。项目中使用的标准程序库文件不会添加到存储库中,您可以手动添加它们。
若要允许其他参与者使用项目,请打开项目属性。在这里,您可以通过指定MQL5.community登录名,以及为组工作设定公共参数,来向选定用户授予权限:
当您编译一个组项目时,根据程序类型,可执行文件EX5会自动复制到本地专家,指标或脚本目录。它允许您在程序端立即运行程序而不必手动复制到适当的目录。
MQL5存储中的公共项目:参与开发
如上所述,MQL5存储中的每个组项目都有公共设置:项目可以是私人的,也可以是对其他人公开的。现在,您可以免费加入的所有项目都显示在单独的“公共项目”标签。
每个人都可以找到心仪的项目并加入其开发过程。仅需单击加入,接收存储项目。
//+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { //--- 作为二进制数组的模板文件 unsigned char my_template[]= { 0xFF,0xFE,0x3C, ... ,0x00 // 本例中数据数组被缩短 }; //--- 保存和应用模板 if(FileSave("my_template.tpl",my_template)) { Print("Custom template saved in \\MQL5\\Files"); if(ChartApplyTemplate(0,"\\Files\\my_template.tpl")) Print("Custom template applied to the current chart"); else Print("Failed to apply custom template"); } else Print("Failed to save custom template"); }
函数 | 行为 |
---|---|
CustomSymbolCreate | 在指定组以指定名称创建一个自定义交易品种 |
CustomSymbolDelete | 删除指定名称的自定义交易品种 |
CustomSymbolSetInteger | 为自定义交易品种设置整型属性值 |
CustomSymbolSetDouble | 为自定义交易品种设置真实型属性值 |
CustomSymbolSetString | 为自定义交易品种设置字符串类型属性值 |
CustomSymbolSetMarginRate | 根据订单类型和方向为自定义交易品种设置预付款比例 |
CustomSymbolSetSessionQuote | 为指定交易品种和工作日设置指定报价期的起止时间 |
CustomSymbolSetSessionTrade | 为指定交易品种和工作日设置指定交易时期的起止时间 |
CustomRatesDelete | 在指定时间间隔内从自定义交易品种的价格历史记录中删除所有柱形图 |
CustomRatesReplace | 在指定时间间隔内用MqlRates类型数组的数据完全替换自定义交易品种的价格历史记录 |
CustomRatesUpdate | 将缺失的柱形图添加到自定义交易品种的历史记录并用MqlRates类型数组的数据替换现有的数据 |
CustomTicksAdd | 将MqlTick类型的数组数据添加到自定义交易品种的价格历史记录。自定义交易品种必须在市场报价窗口中选择。 |
CustomTicksDelete | 在指定时间间隔内从自定义交易品种的价格历史记录中删除所有报价 |
CustomTicksReplace | 在指定时间间隔内用MqlTick类型数组的数据完全替换自定义交易品种的价格历史记录 |
程序库位于程序端工作目录的Include\Generic文件夹。
bool ArraySwap( void& array1[], // 第一数组 void& array2[] // 第二数组 );这个函数接受相同类型和相同维度的动态数组。对于多维数组,除了第一元素以外,所有维度中的元素数量都应该匹配。
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 | - | 股票或其他资产分割(价格减少)后执行交易,宣布分割期间拥有持仓 |
更新文档。
//+------------------------------------------------------------------+ //| 模板函数 | //+------------------------------------------------------------------+ 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>(); // 模板函数显式规范 }因此,类型的显式规范将会执行代表参数而非调用参数。
更新文档。
更新文档。
#resource path_to_resource_file as type_of_resource_variable name_of_resource_variable
#resource "data.bin" as int ExtData[] // 声明包含data.bin文件数据的数值数组 #resource "data.bin" as MqlRates ExtData[] // 声明包括data.bin文件数据的简单结构数组 #resource "data.txt" as string ExtCode // 声明包含data.txt文件数据的字符串 #resource "data.txt" as string ExtCode[] // 声明包含data.txt文件数据的字符串 #resource "image.bmp" as bitmap ExtBitmap[] // 声明包含BMP文件位图文件的一维数组,数组大小 = width * height #resource "image.bmp" as bitmap ExtBitmap2[][] // 声明包含BMP文件位图文件的二维数组,数组大小[hight][width]
更新文档。
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'代码
更新文档。
修正测试期间每年按百分比计算手续费。
修正测试进行中生成的图表上的结余计算和展示。
公开测试两个月后,多元化MetaTrader 5 平台网页版 现已官方对外发布。它允许从任何浏览器和任何操作系统进行外汇和金融市场交易。仅需网络连接即可,无需安装任何软件。
该应用将桌面版的主要优势(高速,支持多元化市场和扩展的交易功能)与网页程序端的便利性和跨平台特性相结合。该发布版的主要功能在于测试版中所没有的市场深度。
网页平台允许交易者执行技术分析和交易操作,就像在桌面版一样。网页平台提供以下特性: