程序端
- 修正导致无法将名称中带有'-'、'='、'_'和'+'符号的交易品种添加到市场报价的错误。
MQL5
- 优化和改进MQL5标准程序库中的代码格式。
MetaEditor
- 修正通过'\n'和'\r'行结束字符进行的扩展搜索。
import sys chart_symbol='unknown' chart_tf=1 if len(sys.argv) == 3: chart_symbol, chart_tf = sys.argv[1:3]; print("Hello world from", chart_symbol, chart_tf) >> Hello world from T.NYSE 15
long DatabaseImport( int database, // 在DatabaseOpen中接收到的数据库句柄 const string table, // 要向其插入数据的表格名称 const string filename, // 要从中导入数据的文件名 uint flags, // 标识组合 const string separator, // 数据分隔符 ulong skip_rows, // 要跳过的首行数 const string skip_comments // 定义注释的字符串 );
long DatabaseExport( int database, // 在DatabaseOpen中接收到的数据库句柄 const string table_or_sql, // 表格名称或SQL查询 const string filename, // 用于数据导出的CSV文件名 uint flags, // 标识组合 const string separator // CSV文件中的数据分隔符 );
long DatabasePrint( int database, // 在DatabaseOpen中接收到的数据库句柄 const string table_or_sql, // 表格或SQL查询 uint flags // 标识组合 );
int FileSelectDialog( string caption, // 窗口标题 string initial_dir, // 初始目录 string filter, // 扩展过滤器 uint flags, // 标识组合 string& filenames[], // 包含文件名的数组 string default_filename // 默认文件名 );新函数使用户能够与MQL5程序进行有效互动。
#property optimization_chart_mode "3d,InpX,InpY"该属性可以设置优化结束时打开的图表类型,以及X和Y轴的程序参数。
double MathArctan2( double y // 点的y坐标 double x // 点的x坐标 );
添加旁遮普语(印度)的用户界面翻译。
文档已更新。
基于崩溃日志进行修复。
更新将通过实时更新系统提供。
class CFoo { public: struct Item { int x; }; }; //+------------------------------------------------------------------+ class CBar { public: struct Item { int x; }; }; CBar::Item item; // 正确声明Bar类的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; }执行时,输出以下结果:
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":
input int ExtBBPeriod = 20; // 布林带周期 input double ExtBBDeviation=2.0; // 偏差 input ENUM_TIMEFRAMES ExtSignalTF=PERIOD_M15; // BB时间周期 input group "Trend" input int ExtMAPeriod = 13; // Moving Average period input ENUM_TIMEFRAMES ExtTrendTF=PERIOD_M15; // MA 时间周期 input group "ExitRules" input bool ExtUseSL = true; // 使用“止损” input int Ext_SL_Points = 50; // StopLoss in points input bool ExtUseTP = false; // 使用“止盈” input int Ext_TP_Points = 100; // TakeProfit in points 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; // EA幻数 sinput bool ExtDebugMessage=true; // 打印调试信息当这种EA在“策略测试”中启动时,输入参数块可以通过双击组名来折叠或扩展,并且可以通过单个复选框选择组内的所有参数进行优化。
#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() ); }
if(condition) { //--- }
// 之前样式 ParameterGetRange("InpX",enable,x_cur,x_start,x_step,x_stop); // 之后样式 ParameterGetRange("InpX", enable, x_cur, x_start, x_step, x_stop);
// 之前样式 if(x==1&y!=2) { int a=0; } // 之后样式 if(x == 1 & y != 2) { int a = 0; }
用户界面翻译又添加了18种新语言:
该平台界面现已支持50种语言,涵盖40多亿人使用的语言。
若要设置界面语言,请进入程序端顶部的“查看\语言”菜单。
文档已更新。
基于崩溃日志进行修复。
更新将通过实时更新系统提供。
Python是一种用于开发脚本和应用程序的现代高水平编程语言。它包含用于机器学习、自动化处理以及数据分析和可视化的多个程序库。
MetaTrader Python程序包是为有效快速地从MetaTrader 5程序端直接通过处理器通信获得交易所数据而设计的。通过这种途径接收的数据可以进一步用于统计计算和机器学习。
连接
函数
bool TesterDeposit( double money //入金金额 );
文档已更新。
更新内容通过LiveUpdate系统提供。
#import "TestLib.dll" //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { int x=41; TestClass::Inc(x); Print(x); }TestClass的Inc函数C#代码如下:
public class TestClass { public static void Inc(ref int x) { x++; } }作为执行结果,脚本返回值为42。
struct MqlTick
{
datetime time; // 最后价格更新时间
double bid; // 当前卖价
double ask; // 当前买价
double last; // 最后一笔交易的当前价格
ulong volume; // 当前最后价格的交易量
long time_msc; // 以毫秒计算的最后价格更新时间
uint flags; // 报价标识
double volume_real; // 准确性更高的当前最后价格的交易量
};
struct MqlBookInfo { ENUM_BOOK_TYPE type; //ENUM_BOOK_TYPE枚举的订单类型 double price; // 价格 long volume; // 交易量 double volume_real; //准确度更高的交易量 };
//+------------------------------------------------------------------+ //| 默认包装 | //+------------------------------------------------------------------+ struct A { char a; int b; }; //+------------------------------------------------------------------+ //| 指定包装 | //+------------------------------------------------------------------+ struct B pack(4) { char a; int b; }; //+------------------------------------------------------------------+ //| 脚本程序起始函数 | //+------------------------------------------------------------------+ void OnStart() { Print("sizeof(A)=",sizeof(A)); Print("sizeof(B)=",sizeof(B)); } //+------------------------------------------------------------------+结论:
sizeof(A)=5 sizeof(B)=8在MSDN中了解关于结构中对齐方式的更多信息。
enum Main { PRICE_CLOSE_, PRICE_OPEN_ }; input Main Inp=PRICE_CLOSE; //+------------------------------------------------------------------+ //| 起始函数 | //+------------------------------------------------------------------+ void OnStart() { }编译器显示警告:
class X { }; void f(int) { } template<typename T> void a(T*) { new T(2); } // 以前,编译器在这里生成错误 template<typename T> void a() { f(0); } void OnInit() { a<X>(); }
更新将通过实时更新系统提供。
Documentation has been updated.
文档已更新。
Documentation has been updated.
文档已更新。
datetime iTime( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
double iOpen( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
double iHigh( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
double iLow( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
double iClose( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
long iVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
int iBars( string symbol, // Symbol ENUM_TIMEFRAMES timeframe // Period );
int iBarShift( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period datetime time, // Time bool exact=false // Mode );
int iLowest( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int type, // Timeseries identifier int count, // Number of elements int start // Index );
int iHighest( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int type, // Timeseries identifier int count, // Number of elements int start // Index );
long iRealVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
long iTickVolume( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
long iSpread( string symbol, // Symbol ENUM_TIMEFRAMES timeframe, // Period int shift // Shift );
void TesterHideIndicators( bool hide // Flag );
Documentation has been updated.
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 will be the last platform version supporting Microsoft Windows XP/2003/Vista. The minimum required operating system version for running MetaTrader 5 is Windows 7. However, we strongly recommend using the 64-bit version of Windows 10.
MetaTrader 5 build 1745将是最后一个支持Microsoft Windows XP/2003/Vista操作系统的平台版本。现在运行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[] // 第二数组 );这个函数接受相同类型和相同维度的动态数组。对于多维数组,除了第一元素以外,所有维度中的元素数量都应该匹配。