myeatrade

Posts Tagged ‘MQL4’

MQL4基础:函数

函数是一段已命名的程序,它可以从程序任一部分多次调用。它是由函数返回值的类型说明、函数名称、形式参数和语句块组成。传递参数的个数被限定在64个之内。

示例:

double                       // 返回值的类型
linfunc (double x, double a, double b) // 函数名称和参量列表
{
                             // 语句块
   return (a + b);           // 返回表达式值
}

return语句可以返回函数内表达式的值。如有必要,表达式值的类型可以转换为函数结果类型。没有返回值的函数必须定义成 “void” 型。

示例:

void errmesg(string s)
  {
   Print("错误: "+s);
  }

函数的参数可能存在默认值,这些默认值是用相应类型常量定义的。

示例:

int somefunc(double a, double d=0.0001, int n=5, bool b=true, string s="passed string")
  {
   Print("需求参量 a=",a);
   Print("下列参量被传送: d=",d," n=",n," b=",b," s=",s);
   return (0);
  }

如果为某个参数指定了默认值,那么所有后续的参数也必须指定默认值。

错误范例:

int somefunc(double a, double d=0.0001, int n, bool b, string s="passed string")
  {
  }

函数调用

如果在表达式前出现一个曾未用过的名字,又后跟一个左括号,在上下文环境中它将被视作函数的名字。

函数名称 (x1, x2,..., xn)

函数自变量(形式参数)按值的方式传递,也就是说,先计算每一个表达式xl,…,xn的值,再将其值传递给函数,表达式计算顺序及其值的传递要确保无误。在执行期间,系统将检查那些提供给函数的值和参数的类型。这种形式的函数调用被称为“值传递”。调用函数是为了获得函数返回的表达式值。函数的定义类型必须符合函数返回值的类型。在全局层次,我们可以在程序的任何位置定义和说明函数,即要在其他函数之外定义,在函数之内,不能定义或说明另一个函数。

例如:

int start()
  {
   double some_array[4]={0.3, 1.4, 2.5, 3.6};
   double a=linfunc(some_array, 10.5, 8);
   //...
  }
double linfunc(double x[], double a, double b)
  {
   return (a*x[0] + b);
  }

当我们使用默认参数调用函数时,参数列表使用规则是有要求的。参数列表中无默认值的参数必须指定值,且不可以省略。有默认值的参数要么全省略掉,要么指定值,不可只省略其中部分参数。

例如:

void somefunc(double init,double sec=0.0001,int level=10);  // 函数原型

somefunc();                   // 错误调用, 第一请求参量必须存在。
somefunc(3.14);               // 正确调用
somefunc(3.14, 0.0002);       // 正确调用
somefunc(3.14, 0.0002, 10);   // 正确调用

当我们调用一个函数时,不可以忽略参数,即使那些存在默认值的参数也不行。

somefunc(3.14, , 10);         // 错误调用。第二参量被忽略。

特殊函数

在MQL4中存在三种预定义名称函数:

init() 是一个在模块初始化时调用的函数,可以用此函数在开始自定义指标或者自动交易之前做初始化操作。如果这个函数不可用,初始化时就不会调用任何函数。

start() 是主函数。对于智能交易,它在收到下一跳数据后调用该函数。对于自定义指标,在指标添加到图表之后,或在客户端开始运行之时,也可在收到下一跳数据之后,该函数被调用。对于脚本,在脚本被添加到图表之后立即执行并初始化。如果模块中根本不存在start()函数,模块(智能交易、脚本或自定义指标)就不能执行。

deinit() 是一个模块的析构函数(注:借用C++概念),执行一与init()函数相反的操作。deinit()函数往往用来做“清理善后”的工作,例如,创建对象时开辟了一片内存空问,退出模块前需要释放。如果用户没有编写该函数,它也不会执行任何操作。

预定义函数可以带参数。不过,当客户端调用这些函数时,并不能从外部向它传递参数,只能采用默认值。start(),  init()和deinit()函数可从模块任何一点按照常规函数规则调用,等同于其他函数。

不推荐从init()函数调用start ()函数或是执行交易操作。对于图表数据、市价等,在模块初始化期间,数据可能残缺不全,这时,init()和deinit()函数必须尽快地完成任务。在调用start()函数之前,千万不要开始尝试交易操作。

MQL4基础:控制语句

语句描述了完成一项任务的算法操作规则。程序本身就足这样的语句序列。一条条语句之间以分号 ; 分隔。

一条语句能占一行或多行。二个或更多语句也能书写于同一行上。控制执行顺序的语句(if, if-else,  switch, while和for)可以相互嵌套。

示例:

if(Month() == 12)
  if(Day() == 31) Print("新年快乐!");

语句块

一个复合语句(一个语句块)可以由一条语句组成,也可以由大括弧{}括起来的一条或多条任意类型的语句组成。大括弧{}后而不必跟着分号(;)。

示例:

if(x==0)
  {
   Print("无效位置 x=",x);
   return;
  }

表达式操作符

任何以分号(;)结束的表达式都被视为是一个操作符。这里罗列了一些表达式操作符的范例:

赋值运算符:

Identifier=expression;

x=3;
y=x=3; // 错误

赋值运算符在表达式操作符中只限一次使用。

函数调用运算符:

Function_name(argument1,…, argumentN);

           
  FileClose(file);

空运算符

仅仅只有一个分号(;)组成,用来表示控制语句中无任何语句。

break 语句

break语句可以终止最邻近的switch, whilefor语句的执行。Break语句由最近的终止条件语句控制。本语句目的之一就是当满足一定条件时完成循环的执行。

示例:

// 搜索第一个零元素
for(i=0;i<array_size;i++)
  if((array[i]==0)
    break;

continue 语句

continue语句控制最邻近的循环语句while或for返回循环开始,接着执行下一次循环。continue 语句与break 语句作用相反。

示例:

//  统计数组中非零元素个数
int func(int array[])
  {
   int array_size=ArraySize(array);
   int sum=0;
   for(int i=0;i<array_size; i++)
     {
      if(a[i]==0) continue;
      sum+=a[i];
     }
   return(sum);
  }

return 语句

return语句结束当前函数的执行,返回到调用程序。语句return(expression);结束当前函数的执行并带回函数的结果,其中的表达式必须放在圆括号内,不能使用赋值号。

示例:

int CalcSum(int x, int y)
  {
   return(x+y);
  }

在函数值的类型定义为void类型时,return 语句后面不能使用表达式:

void SomeFunction()
  {
   Print("Hello!");
   return;    // 这个语句能删除
  }

本函数右大括弧 } 表明这个不带表达式的return语句将明确执行。

if-else 语句

如果条件表达式为true,语句序列 operator1 执行,语句序列 operator2 将不执行。如果表达式为false,语句序列 operator2 执行,而语句序列 operator1 不执行。

if (expression)
     operator1
else
     operator2

if 语句的 else 部分可能被省略,因此,如果本语句省略了else 部分,if语句在嵌套时可能会出现歧义。在这种情况下,else 会匹配前而最近的不带 else 部分的 if 语句。

示例:

//   else 部分匹配第二个if操作符:
  if(x>1)
  if(y==2) z=5;
  else     z=6;

// else 部分匹配第一个if操作符: if(x>l) { if(y==2) z=5; } else z=6;
// if 语句嵌套 if(x=='a') { y=1; } else if(x=='b') { y=2; z=3; } else if(x=='c') { y = 4; } else Print("ERROR");

switch 语句

switch 语句比较 expression表达式值 和 case中的constant常量值,如果相等,就执行相应的语句块。每个case中constant值必须是一个整数、字符串常量或常量表达式。常量表达式中不能包含变量和函数调用。Switch后而的表达式(expression)必须是整型。

switch(expression)
  {
   case constant: operators
   case constant: operators
     ...
   default: operators
  }

如果没有一个case表达式值等于expression表达式值,将执行default后面的语句块。此处default语句并不是必需的。如果没有一个case常量和expression值一致,而default语句也不没有,那么不会执行任何动作。关键字case及其常量就像标签,即使switch语句带有数个case语句,程序都会按序执行后而所有的语句块,直至遇到break语句为止。

在编译期间,编译程序将计算常量表达式的值,不允许在一个switch语句内同时存在两个相同的常量值。

示例:

switch(x)
  {
   case 'A':
      Print("CASE A");
      break;
   case 'B':
   case 'C':
      Print("CASE B or C");
      break;
   default:
      Print("NOT A, B or C");
      break;
  }

while 循环语句

如果条件表达式expression值为true,while语句一直执行直至条件表达式变成false。如果条件表达式为false,将跳到下一条语句。

while(expression)
  operator;

while语句执行前,表达式expression必须事先定义过。因此,如果表达式值一开始就为false,while语句根本不会执行。

示例:

while(k<n)
  {
   y=y*x;
   k++;
  }

for 循环语句

表达式1 (Expression1)定义循环的初始变量,表达式2(Expression2)是循环终止条件。当表达式2 (Expression2)为真(true)的时候,循环体重复执行直至Expression2变为假(false)。如果Expression2变为false,循环将会被中断,并继续执行循环语句的下一条语句。每次循环结束后都会计算表达式3(Expression3),用于改变循环条件。

for (Expression1; Expression2; Expression3)
   operator;

for 语句与下面while语句等价:

Expression1;
while(Expression2)
  {
   operator;
   Expression3;
  }

for 语句中我们可以省略三个表达式中任一部分或全部,但足,其中分号 ; 却不能省略。如果省略了表达式2(expression2),则被视作真值。for(; ;)语句是一个死循环,它相当于while(1)语句。表达式1和表达式3都可以内嵌多个逗号(,)分隔的表达式。

示例:

for(x=1;x<=7;x++) Print(MathPower(x,2));
for(;;) { Print(MathPower(x,2)); x++; if(x>10) break; }
for(i=0,j=n-l;i<n;i++,j--) a[i]=a[j];

MQL4基础:运算符和表达式

某些数字和字符的组合是特别重要的,它们被称为运算符,例如:

算术运算符:+ – * / %

逻辑运算符:&& ||

赋值运算符:= += *=

运算符常用在表达式中,只有结合操作数时才有意义。

需要特别注意标点符号,如圆括号、方括号、逗号、冒号、分号。

运算符、标点符号、空格用来分割语句的不同部分。

表达式

一个表达式由一个或多个操作数和运算符组成,一个表达式可以分成若干行来书写。

示例:

a++; b = 10;
x = (y * z) /
    (w + 2) + 127;

一个表达式的最后必须由一个分号(;) 来表示结束。

算术运算符

算术运算符包括加减法、乘除法运算等:

求和                   i = j + 2;
求差                   i = j - 3;
改变符号               x = - x;
求积                   z = 3 * x;
求商                   i = j / 5;
求模                   minutes = time % 60;
自增                   i++;
自减                   k--;

自增/自减运算符不能使用在表达式中。

示例:

int a=3;
a++;              // 有效表达式
int b=(a++)*3;    // 无效表达式

赋值运算符

表达式的值赋给左边的变量。

y = x;   //把变量 x 的值赋予变量 y

下列表达式中赋值运算符结合了算术运算符或位运算符:

y += x;         //在 y 值上加上 x                         
y -= x;         //在 y 值上减去 x                         
y *= x;         //在 y 值上乘以 x                         
y /= x;         //在 y 值上除以 x                        
y %= x;         //在 y 值上求 x 的模                      
y >>= x;        //把 y 值向右做 x 位逻辑移位                
y <<= x;        //把 y 值向左做 x 位逻辑移位                
y &= x;         //AND 位运算符                            
y |= x;         //OR 位运算符                             
y ^= x;         //把 x 和 y 按做逻辑异或的操作

表达式中只能有一个赋值运算符。 位运算符只能用于整型数据。逻辑移位运算符中 x 值只能是小于 5 位的二进制数,过大的数值将会被拒绝。所以移动范围只能是 0 到 31 。 用 %= 运算符求模 ( 求y/x的模),其结果赋予y。

关系运算符

整数0代表逻辑假值FALSE,任何非零的值代表逻辑真值TRUE。

用关系运算符或逻辑运算符组成的表达式值是0 (False)或1 (True)

a = b;     //a等于b          
a != b;    //a不等于b                      
a< b;      //a小于b                        
a >b;      //a大于b                        
a <=b;     //a小于等于b                    
a >= b;    //a大于等于b

2个浮点型数据不能用 = 或 != 运算符比较,但是我们可以把2者相减, 并将所得结果和null进行比较。

布尔运算符

逻辑非运算符(!)的操作数必须是算术类型。如果运算值是FALSE (0),其非运算的结果为TRUE (1);如果运算值不同于FALSE (0),其非运算的结果等于FALSE (0)。

if(!a) Print("不是 'a'");

x和y值的逻辑或运算符 (||)用来表示两个表达式只要有一个成立即可。如果x和y值只要有1个值为真的,表达式值为TRUE (1)。否则,值为FALSE (0)。

if(x<0 || x>=max_bars) Print("超出范围");

x和y值的逻辑与运算符 (&&)。如果x和y的值都是真实的,表达式值为TRUE (1)。否则,值为FALSE (0).

if(p!=x && p>y) Print("TRUE");

位运算符

取反运算符(~)对变量值二进制代码按位取反。表达式值中所有1变为0,0变为1 。

b = ~n;

将二进制代码表示的X逻辑右移Y位。右移是逻辑运算,即左侧用零填满。

x = x >> y;

将二进制代码表示的X逻辑左移Y位,右侧(低位)用零填满。

x = x << y;

二进制表示的x和Y位运算与(&)。如果x和y两个相应的二进制位都为1,则该位的结果为1,否则为0。

b = ((x & y) != 0);

二进制表示的x和Y位运算或(|)。如果x和y两个相应的二进制位都为0,则该位的结果为0,否则为1。

b = x | y;

二进制表示的x和Y位运算异或(~)。如果x和y两个相应的二进制位相异,则该位的结果为1,否则为0。

b = x ^ y;

位运算符只适合整型数据类型。

其他运算符

下标

数组的第i个元素的序号,i可以为整数或整型表达式。

示例:

array[i] = 3; //将3赋予数组的第i个元素。

只有整数才能成为数组的下标。只允许使用四维或四维以下的数组。每维索引是从0到(数组总长度-1)。举一个例子,一个有50个元素组成的一维数组,引用第一个数组元素用array [0],这样,最后一个数组元素将足array[49]。

如果访问数组超出了数组下标范围,系统将会出错 ERR_ARRAY_INDEX_OUT_OF_RANGE (下标超过范围),通过调用GetLastError()函数,获取这些错误信息。

调用xl,x2,…,xn形式参数的函数

每个形参可以是一个常量、一个变量和相应类型的表达式。传递的参数用逗号隔开,并放在圆括号()内,函数名放在圆括号()前。

用此函数返回表达式值。如果函数返回值定义为void型,这些函数调用就不能放在赋值号右边。请确认表达式xl,x2,…,xn是按序执行的。

示例:

double SL=Bid-25*Point;
int    ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,Ask+25*Point,"My comment",123,0,Red);

逗号运算符

用逗号分隔的表达式是按从左到右的顺序执行。所有表达式都是先算左边的,再算右边的,其结果的类型和值由右边表达式决定。函数的参数表也可视为一个范例(参见上面)。

示例:

for(i=0,j=99; i<100; i++,j--) Print(数组[i][j]);

优先级规则

下表中同组运算符优先级相同。排在前面的运算符优先级高,排在后而的运算符优先级低。运算符按优先级顺序从高到低排列如下:

()     函数调用                     从左到右
[]     引用数组元素
!      真假运算符                   从右到左
-      改变符号
++     自增
--     自减
~      "按位取反"运算符
&      "按位与"位运算符             从左到右
|      "按位或"位运算符
^      "按位异或"位运算符
<<     逻辑左移
>>     逻辑右移
*      乘法                        从左到右
/      除法
%      求模
+      加法                        从左到右
-      减法
<      小于                        从左到右
<=     小于等于
>      大于
>=     大于等于
==     等于
!=     不等于
||     逻辑 或                      从左到右
&&     逻辑 与                      从左到右
=      赋值                            从右到左
+=     加法复合赋值运算符
-=     减法复合赋值运算符
*=     乘法复合赋值运算符
/=     除法复合赋值运算符 
%=     求模复合赋值运算符 
>>=    右移复合赋值运算符
<<=    左移复合赋值运算符
&=     按位与复合赋值运算符
|=     按位或复合赋值运算符
^=     按位异或复合赋值运算符
,     逗号                         从左到右

高优先级的圆括号可以改变运算符的执行顺序。

注意:在MQL4程序中,运算符的优先级不同于C 语言。

MQL4基础:数据类型

任何程序都要依靠数据来运行,数据因日的不同可以有不同的类型。比如,数组可以存取整型数据,价格可以用浮点型双精度数表示。在MQL4中没有专门用来表示货币值的数据类型。

不同的数据类型有不同的处理速度,整型数据是最快的。处理双精度的数据需要使用特殊的协处理器,所以,处理浮点型数据比较复杂,它比处理整型数据要慢一些。字符串处理速度是最慢的,因为它要分配/重分配计算机动态内存。

主要的数据类型如下:

color型和datetime型仅仅是为了让我们更清楚地区分图表内容和输入这些参数时才有意义,这些参数可在和能交易的属性标签和自定义指标“输入”标签中设置。color和datatime型数据用整数来表示。int和double型统称为数值型。

在表达式运算中使用了隐式类型转换(自动转换)。

类型转换

在MQL4表达式中使用了隐式类型转换。由低到高转换类型的优先级:

int  (bool,color,datetime);
double;
string;

在运算完成之前(除数据己被定义的),数据自动转换为高优先级类型。当赋值操作完成时,数据会转换成目标数据类型。

示例:

int    i = 1 / 2;     // 没有类型转换,结果为 0
int    i = 1 / 2.0;   // 表达式中有浮点型数据,但会转换成整型数据,结果为 0
double d = 1.0 / 2.0; // 没有类型转换,结果为 0.5
double d = 1 / 2.0;   // 表达式计算的结果是浮点型数据,和目标类型一样,结果为 0.5
double d = 1 / 2;     // 表达式是整型数据的计算,然后被定义为浮点型数据,结果为 0.0
string s = 1.0/8;     // 表达式转成双精度型,再转成字符串型,结果为"0.12500000"(含10个字符)
string s = NULL;      // 整型常量转成字符串型,结果为"0"(含1个字符)
string s = "Ticket #"+1234;//表达式转成字符串型,与目标类型相同,结果为"Ticket #12345"

类型转换不但运用在常量中,还被运用在相应的变量中。

整型常量

十进制: 数字 0 – 9 ,包括负数。

示例:

12, 111, -956 1007

十六进制: 数字 0 – 9 , 字符 a – f 或者 A – F 代表 10 – 15; 以 0x 或者 0X 开头。

示例:

0x0A, 0x12, 0X12, 0x2f, 0xA3, 0Xa3, 0X7C7

整型数据占用 4 字节的内存空间,其数值范围介于 -2147483648 ~ 2147483647 之间。如果超出这个范围,则视为无效。

字符常量

任何带单引号的单一字符或者类似 ‘\x10’ 形式的十六进制ASCII 码都是整型的字符常量。字符常量中包含一些特殊字符,如单引号(‘)、双引号(“)、问号(?)、反斜线(\)和控制符,必须以反斜线开头(\)转义表示,如下表所示:

换行             NL (LF)  \n
制表符           HT       \t
回车             CR       \r
反斜线           \        \\
单引号           '        \'
双引号           "        \"
十六进制ASCII    hh       \xhh

如果上述字符不使用反斜线,结果将不被定义:

int a = 'A';
int b = '$';
int c = '©';      // 代码0xA9
int d = '\xAE';   // 符号 ® 代码

字符数据占用 4 字节的空间。其数值范围介于 0 ~ 255 之间。如果超出这个范围,则视为无效。

布尔型常量

布尔型(Boolean) 常量用来表示 真值(true) 和 假值(false), 还可以用数字 1 和 0 进行表示。True 和 TRUE,False 和 FALSE都可使用(字母不区分大小写)。

示例:

>bool a = true;
bool b = false;
bool c = 1;

布尔型常量占用长度为4字节的内存空间,它用0或1的值表示。

浮点常量(双精度常量)

浮点型数据由整数部分、小数点(.)和小数部分组成,其中整数部分和小数部分都是一组十进制数字。

示例:

double a = 12.111;
double b = -956.1007;
double c = 0.0001;
double d = 16;

浮点型数据 (双精度)占用 8 字节的内存空间。其数值范围介于 -1.7e-308 ~ 1.7e308 之间。如果超出这个范围,则视为无效。

字符串常量

字符串数据是用双引号括起来的一连串 ASCII 字符,如:”Character constant”。

字符串数据是双引号里的一组字符,如果需要在字符串中插入一个双引号(“),在它前而必须使用反斜杠(\)。如果有前置反斜杠(\),任何特殊字符都能用在字符串中。字符串长度介于0到255个字符之问,如果超过这个长度,尾部多余的字符将被忽略,编译器也会有相应的提示。

示例:

"This is a character string"
"Copyright symbol \t\xA9"
"this line contains a line feed symbol \n"
"C:\\Program Files\\MetaTrader 4"
"A" "1234567890" "0" "$"

字符串数据占用 8 个字节的空间。其中第一部分为长的整型,存储字符串缓冲区的长度。第二部分是32位的存储字符串缓冲区的地址。

颜色常量

颜色数据可以用三种方法表示: 用字符表示、用整数表示或者是颜色名(只能是已经命名的Web颜色)。

用字符表示的方法是用三个数字来表示三种主要颜色:红、绿、蓝的比例。 颜色数据以 C 开头,并用单引号括住。每种颜色的比例值在 0 ~ 255 之间。

整数表示的方法是使用十六进制或十进制数字。十六进制数字如 0x00BBGGRR, 其中 RR 是红色的比例,GG 是绿色的比例,BB 是蓝色的比例。十进制数不能直接体现红、蓝、绿的比例 ,而是十六进制数字的十进制表示方式。

特殊的颜色名可以参考Web颜色表

示例:

// 用字符表示
C'128,128,128'    // 灰色
C'0x00,0x00,0xFF' // 蓝色
// 用颜色名表示
Red
Yellow
Black
// 用整数表示
0xFFFFFF          // 白色
16777215          // 白色
0x008000          // 绿色
32768             // 绿色

颜色数据占用 4 字节的内存空间。第一个字节一般被忽略,后三个字节包含了红绿蓝的组成信息。

时间日期常量

时间日期常量可以当作一个文本行来表示,它由6个部分组成:年、月、日、时、分、秒,以D开头,并用单引号括起来,其中日期(年、月、日)、时

问(时、分、秒)、甚至两者都可以同时省略。日期时问型常量变化范围1970. 1.1一2037. 12.31。

示例:

D'2004.01.01 00:00'     // 新年
D'1980.07.19 12:30:27'
D'19.07.1980 12:30:27'
D'19.07.1980 12'        //等于  D'1980.07.19 12:00:00'
D'01.01.2004'           //等于  D'01.01.2004 00:00:00'
D'12:30:27'             //等于  D'[编译日期] 12:30:27'
D''                     //等于  D'[编译日期] 00:00:00'

日期时间数据占用 4 字节空间长度的整型数值。其值从1970年1月1日00:00开始以秒的形式显示总秒数。

MQL4基础:语法

目录[hide]

MQL4 的语法类似于C语言,除了以下这些特点:

  • 没有地址运算符;
  • 没有 do … while 语句;
  • 没有 goto … 语句;
  • 没有 [条件][表达式 1]:[表达式 2] 语句;
  • 没有复合数据类型 (结构);
  • 不允许复合赋值,例如:val1=val2=0; arr[i++]=val; cond=(cnt=OrdersTotal)>0; 等等;
  • 逻辑表达式的计算完成前不可以提前终止。

注释

多行注释使用 /* 作为开始到 */ 结束,在这之间不能嵌套使用。单行注释以 // 开始,到行末结束,它可以被嵌套到多行注释之中。注释允许空行和空白。

示例:

// 单行注释
/*  multi-
    line         // 嵌入单行注释
    comment
*/

标识符

标识符用来给变量、函数和数据类型进行命名,其长度不能超过31个字符。标示符可以使用数字0-9、大小写英文字母大写A-Z和小写a-z(区分大小字母)还有下划线(_)。此外标示符的首字符不能是数字,标识符也不能使用保留字。

示例:

NAME1 namel Total_5 Paper

保留字

下面列出的标识符是系统自用的保留字,每个保留字都有其特定含义,用户不能随意使用。

数据类型 储存类型 操作符 其他
bool extern break false
color static case true
datetime   continue  
double   default  
int   else  
string   for  
void   if  
    return  
    switch  
    while  

MQL4简介

MetaQuotes Language 4 (MQL4) 是一种新型的内置型程序用来编写交易策略。 这种语言允许用户创建自己的智能交易,使自己的交易策略能够完全自动地执行,尤其适合用户实现自己的交易策略。除此之外,用户还可以使用MQL4 创建自定义指标,脚本和库。

内包含了大量可以分析当前及历史报价所必备的函数,以及一些基本的算术运算符和逻辑操作符,并内置了一些基本的技术指标和订单管理命令。

MetaEditor 4(文本编辑器)用于编写 MQL4 程序源码,支持语法高亮显示,帮助用户方便地编写智能交易程序。 MetaQuotes Language Dictionary 是 MQL4 语言的帮助工具,这是一部简化的指南,包含了我们可能用到的各种功能,类目,运算符、保留字和其他的语言成分都已分门别类,我们能够从中找到相关的使用说明。

MetaQuotes Language 4 可以编写出不同功能、不同目的程序:

  • 智能交易
    智能交易是一种附加到特定图表的自动交易系统(MTS)。对于指定的货币对,它随若收到的每一跳(tick)数据自动运行,如果此时智能交易还在忙若处理前一跳数据的话(也就是说智能交易还未完成它的操作),就不会再次被启动了。这种交易系统能够在提醒用户可以交易的同时,自动将交易定单直接送到交易服务器。与大多数交易系统一样,客户端支持用历史数据测试交易策略,并在图表上显示买入和卖出点。

    智能交易存储在 terminal_directory\experts 目录。

  • 自定义指标
    自定义指标是指那些己集成在客户端的指标之外用户独自编写出的新的技术指标。和内置的技术指标一样,不能用来自动交易,只能作为分析数据的工具。

    自定义指标储存在 terminal_directory\experts\indicators

  • 脚本
    脚本是执行特定功能的一段程序,和智能交易不同,脚本不能单独执行,只能被调用。

    脚本存储在 terminal_dictionary\experts\scripts 目录。


  • 库是经常使用的自定义函数的集合。库中的脚本不能单独运行。

    库存储在terminal_directory\experts\libraries 目录。

  • 包含文件
    包含文件常用于在源码中引用程序块。在编译阶段,这些文件能够被包含在智能交易、脚本、自定义指标和库的源码中。使用包含文件比调用库更优越,因为调用库会导致额外开销。

    建议包含文件储存在 terminal_directory\experts\include 目录。

第 9 页,共 9 页« 最新...56789
menu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loadermenu image pre-loader