1、MQ语言简单说明与教程关键字:programtrader MT4 EA MQ MQL本文来自:程序化交易者() 详细出处参考:http:/ MetaStock 、TradeStation.中撰写和检验他们的投资交易战略。有了人工智能系统,你就可以将你的真实账户同交易系统产生的信号联系起来,即通过跟踪和管理你任一时点的未平仓合约、下单和止损的记录来建立这种联系。什么是人工智能系统呢?是用专业的 MetaQuotes 语言编写的于特定图表联系的自动交易系统(ATS) 。它不仅告知客户交易时机,还自动执行交易账户的交易并将信号直发送到交易服务器。同大多数 IT 系统一样,人工智能系统还以历史记录以及
2、表上所反映的交易进出点来测试投资交易战略。另外,人工智能系统的执行代码是与源程序正文分开保存的。这种安排确保客户信息的保密性不受爱打听的人的影响。编写你自己的人工智能系统程序是非常容易的,你不必是专业的程序员,你只要学会一非常简单的语言:MQL,即便是不懂得如何编写自己的系统程序人通常也可以雇佣他所熟识的精通编程的人来编,这些人可能仅需要不超过一个小时的时间来掌握编程和操作方法。这里有许多不同的 MetaStock 和 TradeStation 的客户制定的投资交易战略,其中大多数能较容易的转化成 MQL语言,这使用户能吸取以往经验。在本页就有一些可供下载的“人工智能系统”版本。环球银行 交易
3、平台将人工智能系统设为 *.mql (源程序档用此扩展名)和 *.exp (操作代码用此扩展名)文件存于程序的根目录下的子目录。客户可以通过 NAVIGATORL 浏览窗口管理操作多个(不限数量)的“人工智能系统” 。关于如何开立人工智能系统并将其于交易终端联机问题的程序在环球银行客户用户向导上有详细说明。通过用 METAQUOTES 语言编写“人工智能系统”程序来自动管理交易操作、执行客户自己的战略。METAQUOTES 是相当容易学习、使用和安装的。MQL语言包括大量的用于控制现在和过去的报价、主要算法、逻辑运算的变量,并在建立主要指示器以及指示开立和控制头寸方面起关键作用。这种语言是同
4、TRADERSTION 技术公司开发的 EASY 语言是相类似的,但它有一些特殊功能。程序代码是由 METAEDITOR 文字编辑器编写的,它能将 MQL II 不同部分设定为不同颜色,因而,可帮助用户以 / 标记(双斜线)开始通过专家系统文本注释。注释也可以用斜线星号星号斜线(/*(注释)*/,即如 C 语言一样)来标记。编辑器是固定以灰色显示注释。为了建立和控制投资交易战略,客户必须有一有关记录信号产生、变动的进行交易的结果的信息的日志文件。人工智能系统的日志是在环球银行客户目录中的/logs/YYYYMMDD.log 文件下。当前日志可直接访问下级终端窗口。若要访问 MQL语言的目录系统
5、,就需要打开 METAQOUTES 语言窗口或者按下字典按钮或从工具菜单中查找,这使得用户能获取每一用该语言的信息的祥细数据。 1.主要语言结构同其它语言一样,MQL有一套主要的元素来构建他的主要结构。这些元素应以特殊的方式组合与安排,用以表示特定的语句和公式。 语言的主要对象是数据,即三种类型的数据:数值型、逻辑型、字符型。所有的数值型都用双重格式,逻辑型数据为真或假,字符串是用省略号标记的一串字符。字符串又名为文本串。数据可包括不同类型的变量,也可直接表示为源程序正本。 每一个 METAQUOTES 语句都是一完整结构,可以包含固定词、操作指令、数据、变量、表达式、标点符号,通常是以分号结
6、束。 固定语句是指预先确定的具有特殊和具体意义的词汇。 操作指令是指定特定数据、变量、表达式操作的符号。 变量通常包含数值、字符、逻辑型数据。 表达式是指固定语句、变量、操作指令、数据的联合体,是语言中三种类型数据即数值型、字符型、逻辑型数据综合运用的结果。 标点符号是用来描述表达式、定义参量、划分句子以及数列再排序的。2.标点符号 符 号 名 称 描 述; 分号 在 METAQUOTES II 中标记一段的结束( ) 括号 在表达式的一组数据中改变计算顺序,标记函数中的参量以及在描述变量的初始表达式,标记变量的初始值和变数描述段的排列。, 逗号 当函数已引用时,分开参量,在变量描述段中分开变
7、量,在描述数列长度时分开数据,在存取数组元素时分开指数。: 冒号 用在变量描述段中标记一变量表的开始。“ “ 引号 标记一个字符串(文本串) 。 方括号 标记特定数组长度的数值,标记一个数组中特定元素的存取数,标记访问历史数据的期数。 大括号 用做算术括号。可以用来代替“开始结束 ”将一段指令单独划做一区。/* */ 注释括号 标记注释/ 双斜线 表明一单字元注释的开始3.运算运算可分为 5 种形式:赋值运算、字符运算、数学运算、比较运算和逻辑运算。 3.1 赋值运算赋值运算的“=” (等于)是用来给变量赋予一特定的值(可为数值型、字符型、逻辑型,即取决于变量类型)这种赋值可能是一表达式。例如
8、:变数 COUNTER(0); Counter=counter+1;因而,COUNTER 变量即被赋值为 1。 数值同样也能被赋值给数列。 3.2 字符运算操作字符串时,只有运算符可使用“+” 。特用于连接两个字符。例如: Variable: String(“ “);.String = “some_“ + “text“; 因此,字符变量可以是字符,也可是包含数值和逻辑型数据的复合字符串,而后者在连接数值和逻辑数据之前需将它们转化为字符型。例如: String = “string“ + 1; 这样,这个字符变量就可以包含“string 1”字符了。 操作数不仅可以是数值,还可以是相应的变量以及操
9、作后的表达式。 3.3 数学运算4 种主要的数学运算是:加+ ,减- ,乘* ,除/ ;它们是在数学表达式中用来计算数值的。例如:(Ask+Bid)/ 2,High+20*Point3.4 比较运算比较运算是用于同类型数据之间的比较。第一个数与第二个数比较得出“真”或“假” ,小于“” ,大于 “ ”,等于“=” ,不等于“ ”,小于等于“=” ,大于等于“=” 。逻辑值是 METAQUOTES语言控制下比较表达式运算的结果。例如:if FreeMargin 100 and FreeMargin= 1000; (注:freemargin 大于等于 1000 时,condition1 为 tru
10、e;否则为 false)If not Condition1 then exit;下面是逻辑运算的结果表格。(即:freemargin 在计算过程中储存临时数据需要用到变量。变量是在程序的最开头用关键词、数组、定义来描述。这些词是可以用复数形式的。这些词通常在描述变数语句的开端。而这些词之间的区别在于:“variable” 是用来描述变量, “ array”是用来描述数组 “define”是用以描述用户自定义变量,(这种自定义变量类似于预设变量可以通过设置对话框来修改即外部修改,但不同点在于自定义变量可在程序计算过程中改变) 变量描述语法 NAME(初始值) , “NAME”是变量的名称, “初
11、始值”是变量的初始值。这个初始值界定了变量的类型数值型、字符型、逻辑型 举例: COUNTER(0); 数值变数 STRING1(“SOME STRING”); 字符变量 MYCONDITION(FALSE) 逻辑变量 Array : ArrayNamerows,columns(Initialvalue ); 数组长度一个或多个数值决定数值在 MetaQuotes 语言中数组有可能有一、二、三、四位数值长度。在一般术语中,数组是指一组排列成行的拥有同一名称(数组名)且按顺序给定每一数值序号的变数组。数列在理清同一类型的数据的顺序时是非常方便的。交易终端的历史记录就是数列功能的很好的范例,如开盘
12、价、收盘价、最高价、最低价、成交量。这些数据是以单个元素的形式存取。例如:CLOSE 过去 5 个时点的收盘价。两个元素的数列可以是一个第一次排横序第二次排纵序的结果。例如:Array : MyTable10,5( 0 ); / a 10 rows by 5 columns table (1 个 10 行 5 列的表)print( MyTable ); / print the fourth element in the second row 数列可以包含不同类型的数据数值型、字符型、逻辑型,但是,它需为同一类型,数列建立之初起初使值已经确定化了。 附加用户名的描述语法:Define : Nam
13、e( InitialNumber );NAME 名称变量,INITIALNUMBER 是变量的初始值。 需要指出的是附加用户名变量仅仅是数值型数据。上面已经提到,用户名变量可以在程序的计算过程中修改,这样的修改仅仅在人工智能系统的当前部分有效直到特定智能系统从客户终端操作中撤销。当再次启动人工智能系统时,附加用户名变量又会初始化为新值。 4.2.2 EXIT 语句EXIT 语句是终止系统运作的语句,也就是所谓的预设终止程序。4.2.3 IF-THEN 条件语句IF-THEN 条件语句实现了控制运行系统指令的顺序的功能。这个语句可以由不同方式编写。语法如下: if Condition then
14、Statement;orif Condition then begin /推荐使用Statement;Statement;.end; 当条件是逻辑表达式使用了“True” 或 “False”时;STATEMENT(语句)可以是 MQL语言中的任何指令。算式括号(Begin End)可以由大括号代替。 条件句可以用来分写程序。为此,必须再用到另外一关键词Else :if Condition then Statement1 else Statement2;if Condition then beginStatement;Statement;.endelseStatement;Statement;.
15、end;orif Condition then beginStatement;Statement;.endelse Statement2;orif Condition then Statement1elseStatement;Statement;. 可以使用嵌套式的条件语句。通常,MQL语言中的任意语句都代表一合法指令,变量描述除外。因为,严格的讲,变量描述不是一可执行指令。 4.2.4 The WHILE 循环While loop 语句是确保只要循环条件为“真”包含循环本体的语句就一直执行的语句。一个循环在遇 BREAK 语句是终止。反复循环也可以可用 CONTINUE 语句终止。这个语句使
16、得下一个循环开始。也就是说,这种语句之后会出现 CONTINUE 并且跳至循环末而不再执行这个循环。因而,在条件句中毕会使用使用 BREAK 和 CONTIMUE。语法: while Condition beginStatement;.end; 当条件是循环执行条件句时,每一循环的逻辑表达计算式是以“真” 、 “假”值表示。该条件句可以是 MQL II 语言中的任何指令。算式括号(Begin End)表示循环本体且可以由大括号代替。 BREAK 和 CONTINUE 不是必用的。例子: Counter = 1;while Counter Bars then break;print( Close
17、 );end; 这个例子是说可以循环 10 次。但若 BARS 值小于 10,循环就会提前终止,也就是说循环执行 BARS 次。 4.2.6 BREAK 语句BREAK 语句是使 FOR 和 WHILE 循环中断的语句。前面的例子不仅说明 LOOP 循环的运作,还说明 BREAK 语句的用法。BREAK 语句仅仅可以在循环体中使用。循环也可以是嵌套式的。BREAK 语句使与它最接近的循环中断。换句话说,BREAK 语句中断内部循环而不中断外部循环。 4.2.7 CONTINUE 语句CONTINUE 语句就是提前终止循环而开使执行下一个循环。换句话说,CONTINUE 句之后的语句即被忽视掉。
18、例如: for Counter = 1 to 10 begin.if Counter Bars then continue;print( Close );.end; 这说明这个 循环将执行 10 次。但是,CLOSE 值不会超过 BARS次。4.3 交易终端的预设变数为了方便用户,人工智能系统提供一些交易终端的变量。 AccountNumber 账号(又名 ACCNUM)Ask 卖出价(沽盘价) Balance 交易账户余额 Bars 图表上棍的数量是一非常重要的填充图表数据的变量 Bid 买入价(买价) Close 收盘价 Credit 保证金 Equity 账户的资金状况,包括未实现润Fr
19、eeMargin 交易账户的自由保证金也用来账户资金的实用率 High 一段时间的最高价 Low 一段时间的最低价 Margin 用于支撑未平仓合约的资金 Open 开盘价 Point 当前金融工具(人工智能系统现在正在使用的金融工具)的点数,如 D/JPY - 0.01, USD/CHF - 0.0001 PriceAsk 在 MARKET WATCH(市场观察)窗口显示的现时卖出价 PriceBid - c 在 MARKET WATCH(市场观察)窗口显示的现时买入价 PriceHigh 24 小时内最高卖出价 PriceLow - 24 小时内最高买入价 PriceTime - 在 MA
20、RKET WATCH(市场观察)窗口显示的当前时间 Time 报价表上的棍所表时间 TotalProfit 所有未平仓合约的总未实现利润 TotalTrades 在交易终端的未平仓合约以及延迟了的买卖盘指令的总数 Volume 交易总额(过去一段时间的交易总额) 须指出的是在过去一段时间内 Close, Open, High, Low, Volume, Time 是历史数据数列(级数树列)且允许存取这样的数据。4.4. 构建函数MetaQuotes LanguageII 为不同的用途提供了不同的函数。包括技术指针, 交易函数, 时间函数, 数学和三角函数, 数据转换和输出函数等。 Abs- 返
21、回这个数值的绝对值(模块) 语法 : Abs(nExpression) 参数: 数值。 AccountName 返回到包含用户名的文本串(与 AccName 同义) 。 Alert- 生成包含用户定义的数据的屏幕。 语法: Alert(.)例子:alert(“FreeMargin is “, FreeMargin); 弹出警告窗 freemargin 的值。任何非零数字都可作为参数。 Ceil 返回等于或大于这个指定的数值的最小的最接近的整数。 语法: Ceil(nExpression) 参量: 数值。 CloseOrder 平仓单。 语法: CloseOrder( order, lots,
22、price, slippage, color ) 参量: order-开立头寸的顺序号; lots- 手数; ?价格 - 优先平仓价; /*啊啊问号是神马?price?原文真水,我无语*/slippage- 最大价格滑动; color- 表框的颜色。 Comment- 在图表的左上角产生一个用户自定义的数据。 语法 : Comment(.) 任何非零数字都可作为参数。 Cos 计算并返回用弧度表示的角的余弦。 语法: Cos(nExpression) 参数: 数值 CurTime 返回自 1970 年 1 月 1 日以来所经过的秒数 。 Day- 返回当天的月份数值。 DayOfWeek 返回
23、当天的星期数值。1 - 星期天 , 2 - 星期一., 7 - 星期六。 DeleteOrder 删除过期定单。语法 : DeleteOrder ( order) 参数: order:过期的订单号。 Exp 返回对具体的数值进行说明的数字 语法 : Exp(nExpression) 参数: 数值。 Floor- 返回小于或等于特定数值的最接近的最大的整数值。 语法: Floor(nExpression) 参数: 数值。 Highest-返回指定时期最高开盘价、最高最低价、最高最高价、最高收盘价及总交易量(取决于参数类型) 语法: Highest ( type, beginbar, period
24、s ) 参数: type可采用以下形式返回变数:MODE_OPEN, MODE_LOW, MODE_HIGH, MODE_CLOSE, MODE_VOLUME beginbar 相对于当前棒的位移,从中可以获取数据 periods-计算的时期 Hour-返回当前小时数值。 iADX 一般活动指标 语法: iADX ( period, mode, shift ) 参数: period 计算期间数 mode 可采用以下数据类型: MODE_MAIN(main indicator),MODE_PLUSDI(line +DI), MODE_MINUSDI(line -DI). shift 相对于当前棒
25、(时间向后推移)的位移,数据来源于此 iATR 平均时间间隔指标 语法:iATR( period, shift ) 参数: period 计算期间数 shift 相对于当前棒(时间向后推移)的位移,数据来源于此iBANDS 滚动带指标 语法: iBANDS( period, deviation, mode, shift ) 参数: period 计算期间数 deviation 偏移 mode 可采用以下数据类型: MODE_MAIN(主指标),MODE_PLUSDI(line +DI), MODE_MINUSDI(line -DI). shift 相对于当前棒(时间向后推移)的位移,数据来源于此 iCCI 交易记录指针 语法: iCCI( period, shift ) period 计算期间数 shift 相对于当前棒(时间向后推移)的位移,数据来源于此 iMA 平均移动指标 语法: iMA( period, mode, shift ) period 计算期间数 mode 可采用以下计算模式: MODE_SMA 简单, MODE_EMA 指数, MODE_WMA 有利的.