首页学院交易策略EA智能交易文章详细

MT4 MQL4学习

外汇网2021-06-17 09:41:20 65
汇外网 - 全球专业的黄金外汇门户导航行情资讯网站

学好智能交易系统(EA),让你的梦想从这里起飞

MT4外汇交易平台里给我们给予了一套非常完美的交易系统设计语言-MQL4,通过MQL4语言可以设计出我们想要的赚钱模式,一套完美的智能交易系统(EA),让我们躺在睡觉一样能赚钱的程序,iMT4论坛为我们给予了一个能达到我们梦想的MT4专业平台,让你的梦想从这里起飞。

学习写EA第一讲:编程基础知识——语法

代码格式

空格建、Tab键、换行键和换页符都可以形成代码排版的分隔符,你能运用各种符号来增长代码的可读性。

注释

多行注释运用 /* 作为开始到 */ 终结,在这之间不能够嵌套。单行注释运用 // 作为开始到新的一行终结,可以被嵌套到多行注释当中。

示例:

// 单行注释

/* 多行

注释 // 嵌套的单行注释

注释终结 */

标识符

标识符用来给变量、函数和报告类型执行命名,长度不能胜过31个字节

你可以运用数字0-9、拉丁字母大写A-Z和小写a-z(大小写有区分的)仍有下划线(_)。另外首字母不可以是数字,标识符不能和保留字矛盾.

示例:

// NAME1namel Total_5 Paper

保留字

下面列出的是固定的保留字。不能运用下方任何保留字执行命名。

报告类型

存储类型

操作符

其它

bool

extern

break

false

color

static

case

true

datetime

continue

double

default

int

else

string

for

void

if

return

switch

while

学习写EA第二讲:报告类型简述

首要报告类型有:

Integer (int)

Boolean (bool)

Char (char)

String (string)

Floating-point number (double)

Color (color)

Datetime (datetime)

我们用Integer类型报告来作为DateTime和Color报告的存储。

运用下方方式可以执行类型站换:

int (bool,color,datetime);

double;

string;

Integer 类型

十进制: 数字0-9;0不能作为第一个字母

示例:

12, 111, -956 1007

十六进制: 数字0-9;拉丁字母a-f或A-F用来表明10-15;运用0x或者0X作为开始。

示例:

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

Integer 变量的取值规模为-2147483648到2147483647。

Literal 类型

任意在单引号中的字符或十六进制的任意ASCII码比如'x10'均为被看作为一个字符,

一部分字符比如单引号('),双引号("),问号(?),反斜杠()和一部分控制符都需要在以前加一个反斜杠()执行转意后表明出来:

line feed NL (LF) n

horizontal tab HT t

carriage return CR r

reverse slash \

single quote ' '

double quote " "

hexadecimal ASCII-code hh xhh

以上字符假使不经历反斜杠执行转意将不能被运用

示例:

int a = 'A';

int b = '$';

int c = '©'; // code 0xA9

int d = 'xAE'; // symbol code ®

Boolean 类型

Boolean 用来表明 是 和 否, 还可以用数字 1 和 0 执行表明。True和Flase可以忽视大小写。

示例:

bool a = true;

bool b = false;

bool c = 1;

Floating-point number 类型

浮点型变量在整数型后面加一个点(.)用来更精确的表明十进制数字。

示例:

double a = 12.111;

double b = -956.1007;

double c = 0.0001;

double d = 16;

浮点型的取值规模从 2.2e-308 到 1.8e308.

String 类型

字符串型是用来表明接连的ASCII码字符的运用接连的两个双引号来包含需要表明的内容如:"Character constant".

示例:

"This is a character string"

"Copyright symbol txA9"

"this line with LF symbol n"

"A" "1234567890" "0" "$"

Color 类型

颜色类型可以运用下方示例里的几种方式执行定义。

示例:

// symbol constants

C'128,128,128' // gray

C'0x00,0x00,0xFF' // blue

// named color

Red

Yellow

Black

// integer-valued representation

0xFFFFFF // white

16777215 // white

0x008000 // green

32768 // green

Datetime 类型

时间类型运用年、月、日、时、分、秒来执行定义,你可以运用下方示例中的方式来定义变量。

示例:

D'2004.01.01 00:00' // New Year

D'1980.07.19 12:30:27'

D'19.07.1980 12:30:27'

D'19.07.1980 12' //equal to D'1980.07.19 12:00:00'

D'01.01.2004' //equal to D'01.01.2004 00:00:00'

D'12:30:27' //equal to D'[compilation date] 12:30:27'

D'' //equal to D'[compilation date] 00:00:00'

学习写EA第三讲:赋值运算符

赋值运算符

注:将右侧的结果赋值给左侧的变量

将x的值赋值给y 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;

得到逻辑AND的值 y &= x;

得到逻辑OR的值 y |= x;

得到逻辑非OR的值 y ^= x;

注:一个表达式只能有一个赋值运算符.

关系运算符

用返回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;

真假运算符

否定运算符(!),用来表明真假的反面的结果。

// 假使a不是真的

if(!a)

Print("not 'a'");

逻辑运算符或(||)用来表明两个表达式只要有一个成立刻可。

示例:

if(xl)

Print("out of range");

逻辑运算符和(&&)用来表明两个表达式要同期成立才行。

示例:

if(p!=x && p>y)

Print("true");

n++;

位逻辑运算符

~ 运算符对操作数实施按位求补操作。

b = ~n;

>> 运算符对操作数实施向右位移操作。

x = x >> y;

<< 运算符对操作数实施向左位移操作。

x = x << y;

一元 & 运算符返回操作数的地址

为整型和 bool 类型预定义了二进制 & 运算符。对于整型,& 计算操作数的按位“与”。对于 bool 操作数,& 计算操作数的逻辑“与”;也就是说,当且仅当两个操作数都是 true 时,其结果才为 true。

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

二进制 | 运算符是为整型和 bool 类型预定义的。对于整型,| 对操作数执行按位“或”运算。对于 bool 操作数,| 对操作数执行逻辑“或”计算,也就是说,当且仅当两个操作数都是 false 时,其结果才为 false。

b = x | y;

为整型和 bool 类型预定义了 ^ 二进制操作数。对于整型,^ 计算操作数的按位“异或”。对于 bool 操作数,^ 计算操作数的逻辑“异或”;也就是说,当且仅当只有一个操作数为 true 时,其结果才为 true。

b = x ^ y;

注:位逻辑运算符只作用于Integers类型

其它运算符

索引、定位在数组中i位置的值。

array= 3;

//
3负数到array数组第i位置上

运用 x1,x2,...,xn 如此的方法将各种值传送到function中执行运算。

示例:

double SL=Ask-25*Point;

double TP=Ask+25*Point;

int ticket=OrderSend(Symbol(),OP_BUY,1,Ask,3,SL,TP,

"My comment",123,0,Red);

优先级规则

下面是从上到下的运算优先规则,优先级高的将先被运算。

() Function call From left to right

[] Array element selection

! Negation From left to right

~ Bitwise negation

- Sign changing operation

* Multiplication From left to right

/ Division

% Module division

+ Addition From left to right

- Subtraction

<< Left shift From left to right

>> Right shift

< Less than From left to right

<= Less than or equals

> Greater than

>= Greater than or equals

== Equals From left to right

!= Not equal

& Bitwise AND operation From left to right

^ Bitwise exclusive OR From left to right

| Bitwise OR operation From left to right

&& Logical AND From left to right

|| Logical OR From left to right

= Assignment From right to left

+= Assignment addition

-= Assignment subtraction

*= Assignment multiplication

/= Assignment division

%= Assignment module

>>= Assignment right shift

<<= Assignment left shift

&= Assignment bitwise AND

|= Assignment bitwise OR

^= Assignment exclusive OR

学习写EA第四讲:操作符

格式和嵌套

格式.一个操作符可以占用一行或者多行,两个或多个操作符可以占用许多的行。

嵌套.实施控制符(if,if-else, switch, while and for)可以执行任意嵌套.

复合操作符

一个复合操作符有一个(一个区段)和由一个或多个任何类型的操作符构成的的附件{}. 每个表达式运用分号作为终结(;)

示例:

if(x==0)

{

x=1; y=2; z=3;

}

表达式操作符

任何以分号(;)终结的表达式都被看为是一个操作符。

Assignment operator.

Identifier=expression;

标识符=表达式;

示例:

x=3;

y=x=3; // 这是错误的

一个操作符中只能有一个表达式。

调用函数操作符

Function_name(argument1,..., argumentN);

函数名称(参数1,...,参数N);

示例:

fclose(file);

空操作符

只有一个分号构成(;).我们用它来表明没有任何表达式的空操作符.

停止操作符

一个break; , 我们将其放在嵌套内的指定位置,用来在指定情形下跳出循环操作.

示例:

// 从0开始搜索数组

for(i=0;i

if((array==0)

break;

继续操作符

一个continue;我们将其放在嵌套内的指定位置,用来在指定情形下跳过接下去的运算,直接跳入下一次的循环。

示例:

// summaryof nonzero elements of array

int func(int array[])

{

int array_size=ArraySize(array);

int sum=0;

for(int i=0;i

{

if(a==0) continue;

sum+=a
;

}

return(sum);

}

返回操作符

一个return;将需要返回的结果放在return后面的()中。

示例:

return(x+y);

条件操作符if

if (expression)

operator;

假使表达式为真那么实施操作。

示例:

if(a==x)

temp*=3;

temp=MathAbs(temp);

条件操作符if-else

if (expression)

operator1

else

operator2

假使表达式为真那么实施operator1,假使为假实施operator2,else后还可以跟进多个if实施多项选择。详见示例。

示例:

if(x>1)

if(y==2)

z=5;

else

z=6;

if(x>l)

{

if(y==2) z=5;

}

else

{

z=6;

}

// 多项选择

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 constant1: operators; break;

case constant2: operators; break;

...

default: operators; break;

}

当表达式expression的值等于结果之一时,实施其结果下的操作。不管结果如何全会实施default中的操作。

示例:

case 3+4://正确的

case X+Y: //错误的

被选择的结果只可以是常数,不可为变量或表达式。

示例:

switch(x)

{

case 'A':

Print("CASE An");

break;

case 'B':

case 'C':

Print("CASE B or Cn");

break;

default:

Print("NOT A, B or Cn");

break;

}

循环操作符while

while (expression)

operator;

只要表达式expression为真就实施操作operator

示例:

while(k

{

y=y*x;

k++;

}

循环操作符for

for (expression1; expression2;expression3)

operator;

用表达式1(expression1)来定义初始变量,当表达式2(expression2)为真的时机实施操作operator,在每次循环终结后实施表达式3(expression3)

用while可以表明为如此:

expression1;

while (expression2)

{

operator;

expression3;

};

示例:

for(x=1;x<=7;x++)

Print(MathPower(x,2));

运用for(;;)可以产生一个死循环如同while(true)一样.

表达式1和表达式3都可在内嵌多个用逗号(,)分割的表达式。

示例:

for(i=0,j=n-l;i

a=a[j];

学习写EA第五讲:函数定义

函数定义

一个函数是由返回值、输入参数、内嵌操作所构成的。

示例:

double // 返回值类型

linfunc (double x, double a, double b) // 函数名和输入参数

{

// 内嵌的操作

return (a*x + b);

// 返回值

}

假使没有返回值那么返回值的类型可以写为void

示例:

voiderrmesg(string s)

{

Print("error: "+s);

}

函数调用

function_name (x1,x2,...,xn)

示例:

intsomefunc()

{

double a=linfunc(0.3, 10.5, 8);

}

double linfunc(double x, double a, double b)

{

return (a*x + b);

}

特殊函数init()deinit()start()

init()在载入时调用,可以用此函数在开始自定义指标或者自动交易以前做初始化操作。

deinit()在卸载时调用,可以用此函数在去处自定义指标或者自动交易以前做初始化操作。

start()当报告变动时触发,对于自定义指标或者自动交易的编程首要依靠此函数执行。

学习写EA第六讲:定义变量

定义基本类型

基本类型包含

string - 字符串型;

int - 整数型;

double - 双精度浮点数型;

bool - 布尔型

示例:

string MessageBox;

int Orders;

double SymbolPrice;

bool bLog;

定义附加类型

附加类型包含

datetime - 时间型,运用无符号整型数字存储,是1970.1.1 0:0:0开始的秒数

color - 颜色,运用三色的整型数字编码而成

示例:

extern datetime tBegin_Data = D'2004.01.01 00:00';

extern color cModify_Color = C'0x44,0xB9,0xE6';

定义数组类型

示例:

int a[50]; //一个一维由五十个int构成的数组

double m[7][50]; //一个两维由7x50个double构成的数组

内部变量定义

内部变量顾名思义是以内部运用的,可以理解为在目前嵌套内所运用的变量。

函数参数定义

示例:

void func(int x, double y, bool z)

{

...

}

函数的参数内的变量只能在函数内才生效,在函数外无法运用,而且在函数内对变量执行的修改在函数外无法生效。

调用函数示例:

func(123, 0.5);

假使有需要在变量传入由参数传入函数内操作后保留修改在函数外生效的情形的话,可以在参数定义的类型名称后加之修饰符(&)。

示例:

void func(int& x, double& y, double& z[])

{

...

}

静态变量定义

在报告类型前加之static就可以将变量定义成静态变量

示例:

{

static int flag

}

全局变量定义

全局变量是指在整个程序中都能够调用的变量,只需将变量定义卸载所有嵌套之外即可。

示例:

int Global_flag;

int start()

{

...

}

附加变量定义

附加变量可以允许由用户自己输入。

示例:

extern double InputParameter1 = 1.0;

int init()

{

...

}

初始化变量

变量务必经历初始化才可以运用。

基本类型

示例:

int mt = 1; // integer 初始化

// double 初始化

double p = MarketInfo(Symbol(),MODE_POINT);

// string 初始化

string s = "hello";

数组类型

示例:

int mta[6] = {1,4,9,16,25,36};

变量

外部函数引用

示例:

#import "user32.dll"

int MessageBoxA(int hWnd ,string szText,

string szCaption,int nType);

int SendMessageA(int hWnd,int Msg,int wParam,int lParam);

#import "lib.ex4"

double round(double value);

#import

学习写EA第七讲:预处理程序

定义常数

#defineidentifier_value

常数可以是任何类型的,常数在程序中不可更改。

示例:

#defineABC 100

#define PI 0.314

#define COMPANY_NAME "MetaQuotes Software Corp."

编译参数定义

#property identifier_value

示例:

#propertylink "http://www.metaquotes.net"

#property copyright "MetaQuotes Software Corp."

#property stacksize 1024

下方是所有的参数名称:

参数名称

类型

表明

link

string

设置一个链接到公司网站

copyright

string

公司名称

stacksize

int

堆栈大小

indicator_chart_window

void

表明在行情图窗口

indicator_separate_window

void

表明在新区块

indicator_buffers

int

表明缓存最高8

indicator_minimum

int

图形区间最低位

indicator_maximum

int

图形区间最高位

indicator_colorN

color

第N根线的颜色,最高8根线

indicator_levelN

double

predefined level N for separate window custom indicator

show_confirm

void

当程序实施以前能否经历证实

show_inputs

void

before script run its property sheet appears; disablesshow_confirm property

嵌入文件

#include

示例:

#include

#include"file_name"

示例:

#include"mylib.h"

引入函数或其余模块

#import "file_name"

func1();

func2();

#import

示例:

#import"user32.dll"

int MessageBoxA(int hWnd,string lpText,string lpCaption,

int uType);

int MessageBoxExA(int hWnd,string lpText,string lpCaption,

int uType,int wLanguageId);

#import "melib.ex4"

#import "gdi32.dll"

int GetDC(int hWnd);

int ReleaseDC(int hWnd,int hDC);

#import

学习写EA第八讲:账户信息

double AccountBalance()

返回账户余额

示例:

Print("Account balance = ",AccountBalance());

double AccountCredit()

返回账户信用点数

示例:

Print("Account number ", AccountCredit());

string AccountCompany()

返回账户公司名

示例:

Print("Account company name ", AccountCompany());

string AccountCurrency()

返回账户所用的通货名称

示例:

Print("account currency is ", AccountCurrency());

double AccountEquity()

返回资产净值

示例:

Print("Account equity = ",AccountEquity());

double AccountFreeMargin()

Returns free margin value of the current account.

示例:

Print("Account free margin = ",AccountFreeMargin());

int AccountLeverage()

返回杠杆比率

示例:

Print("Account #",AccountNumber(), " leverage is ",AccountLeverage());

double AccountMargin()

Returns margin value of the current account.

示例:

Print("Account margin ", AccountMargin());

string AccountName()

返回账户名称

示例:

Print("Account name ", AccountName());

int AccountNumber()

返回账户数字

示例:

Print("account number ", AccountNumber());

double AccountProfit()

返回账户利润

示例:

Print("Account profit ", AccountProfit());

学习写EA第九讲:数组函数和类型转换函数

数组函数 [ArrayFunctions]

int ArrayBsearch( double array[], double value, int count=WHOLE_ARRAY, intstart=0, int direction=MODE_ASCEND)

搜索一个值在数组中的位置

此函数不能用在字符型或接连数字的数组上.

:: 输入参数

array[] - 需要搜索的数组

value - 将要搜索的值

count - 搜索的数量,默认搜索所有的数组

start - 搜索的开始点,默认从头开始

direction - 搜索的方向,MODE_ASCEND 顺序搜索 MODE_DESCEND 倒序搜索

示例:

datetime daytimes[];

int shift=10,dayshift;

// All the Time[] timeseries are sorted in descendant mode

ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);

if(Time[shift]>>=daytimes[0]) dayshift=0;

else

{

dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);

if(Period()

dayshift++;

}

Print(TimeToStr(Time[shift])," corresponds to ",dayshift," daybar opened at ",

TimeToStr(daytimes[dayshift]));

int ArrayCopy( object& dest[], object source[], int start_dest=0, intstart_source=0, int count=WHOLE_ARRAY)

复制一个数组到此外一个数组。

只有double[],int[], datetime[], color[], 和 bool[] 这些类型的数组可以被复制。

:: 输入参数

dest[] - 目标数组

source[] - 源数组

start_dest - 从目标数组的第几位开始写入,默觉得0

start_source - 从源数组的第几位开始读取,默觉得0

count - 读取多少位的数组

示例:

double array1[][6];

double array2[10][6];

// fill array with some data

ArrayCopyRates(array1);

ArrayCopy(array2, array1,0,Bars-9,10);

// now array2 has first 10 bars in the history

int ArrayCopyRates( double& dest_array[], string symbol=NULL, inttimeframe=0)

复制一段行情图上的报告到一个二维数组,数组的第二维只有6个项目分别是:

0 - 时间,

1 - 开盘价,

2 - 最低价,

3 - 最高价,

4 - 收盘价,

5 - 成交量.

:: 输入参数

dest_array[] - 目标数组

symbol - 标示,目前所需要的通货的标示

timeframe - 图表的时间线

示例:

double array1[][6];

ArrayCopyRates(array1,"欧元兑美元", PERIOD_H1);

Print("Current bar ",TimeToStr(array1[0][0]),"Open",array1[0][1]);

int ArrayCopySeries( double& array[], int series_index, string symbol=NULL,int timeframe=0)

复制一个系列的行情图报告到数组上

注: 假使series_index是MODE_TIME,那么第一个参数务必是日期型的数组

:: 输入参数

dest_array[] - 目标数组

series_index - 想要取的系列的名称或编号,0-5

symbol - 标示,目前所需要的通货的标示

timeframe - 图表的时间线

示例:

datetime daytimes[];

int shift=10,dayshift;

// All the Time[] timeseries are sorted in descendant mode

ArrayCopySeries(daytimes,MODE_TIME,Symbol(),PERIOD_D1);

if(Time[shift]>=daytimes[0]) dayshift=0;

else

{

dayshift=ArrayBsearch(daytimes,Time[shift],WHOLE_ARRAY,0,MODE_DESCEND);

if(Period()

}

Print(TimeToStr(Time[shift])," corresponds to ",dayshift," daybar opened at ", TimeToStr(daytimes[dayshift]));

int ArrayDimension( int array[])

返回数组的维数

:: 输入参数

array[] - 需要检查的数组

示例:

int num_array[10][5];

int dim_size;

dim_size=ArrayDimension(num_array);

// dim_size is 2

bool ArrayGetAsSeries(object array[])

检查数组能否是有组织序列的数组(能否从最后到最开始排序过的),假使不是返回否

:: 输入参数

array[] - 需要检查的数组

示例:

if(ArrayGetAsSeries(array1)==true)

Print("array1 is indexed as a series array");

else

Print("array1 is indexed normally (from left to right)");

int ArrayInitialize( double& array[], double value)

对数组执行初始化,返回经历初始化的数组项的个数

:: 输入参数

array[] - 需要初始化的数组

value - 新的数组项的值

示例:

//---- 把所有数组项的值设置为2.1

double myarray[10];

ArrayInitialize(myarray,2.1);

bool ArrayIsSeries( object array[])

检查数组能否接连的(time,open,close,high,low, or volume).

:: 输入参数

array[] - 需要检查的数组

示例:

if(ArrayIsSeries(array1)==false)

ArrayInitialize(array1,0);

else

{

Print("Series array cannot be initialized!");

return(-1);

}

int ArrayMaximum( double array[], int count=WHOLE_ARRAY, int start=0)

找出数组中最大值的定位

:: 输入参数

array[] - 需要检查的数组

count - 搜索数组中项目的个数

start - 搜索的开始点

示例:

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};

int maxValueIdx=ArrayMaximum(num_array);

Print("Max value = ", num_array[maxValueIdx]);

int ArrayMinimum( double array[], int count=WHOLE_ARRAY, int start=0)

找出数组中最小值的定位

:: 输入参数

array[] - 需要检查的数组

count - 搜索数组中项目的个数

start - 搜索的开始点

示例:

double num_array[15]={4,1,6,3,9,4,1,6,3,9,4,1,6,3,9};

double minValueidx=ArrayMinimum(num_array);

Print("Min value = ", num_array[minValueIdx]);

int ArrayRange( object array[], int range_index)

取数组中指定维数中项目的数量。

:: 输入参数

array[] - 需要检查的数组

range_index - 指定的维数

示例:

int dim_size;

double num_array[10,10,10];

dim_size=ArrayRange(num_array, 1);

int ArrayResize( object& array[], int new_size)

重定义数组大小

:: 输入参数

array[] - 需要检查的数组

new_size - 第一维中数组的新大小

示例:

double array1[][4];

int element_count=ArrayResize(array, 20);

// 数组中总项目数为80

bool ArraySetAsSeries( double& array[], bool set)

设置指数数组为系列数组,数组0名的值是最后的值。返回以前的数组状态

:: 输入参数

array[] - 需要处理的数组

set - 能否是设置为系列数组,true或者false

示例:

double macd_buffer[300];

double signal_buffer[300];

int i,limit=ArraySize(macd_buffer);

ArraySetAsSeries(macd_buffer,true);

for(i=0; i

macd_buffer=iMA(NULL,0,12,0,MODE_EMA,PR洲际交易所_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PR洲际交易所_CLOSE,i);

for(i=0; i

signal_buffer=iMAOnArray(macd_buffer,limit,9,0,MODE_SMA,i);

int ArraySize( object array[])

返回数组的项目数

:: 输入参数

array[] - 需要处理的数组

示例:

int count=ArraySize(array1);

for(int i=0; i

{

// do some calculations.

}

int ArraySort( double& array[], int count=WHOLE_ARRAY, int start=0, intsort_dir=MODE_ASCEND)

对数组执行排序,系列数组不可执行排序

:: 输入参数

array[] - 需要处理的数组

count - 对多少个数组项执行排序

start - 排序的开始点

sort_dir - 排序方式,MODE_ASCEND顺序排列 MODE_DESCEND倒序排列

示例:

double num_array[5]={4,1,6,3,9};

// now array contains values 4,1,6,3,9

ArraySort(num_array);

// now array is sorted 1,3,4,6,9

ArraySort(num_array,MODE_DESCEND);

// now array is sorted 9,6,4,3,1

=============================================================================================

2类型转换函数[Conversion Functions]

string CharToStr( int char_code)

将字符型转换成字符串型结果返回

:: 输入参数

char_code - 字符的ACSII码

示例:

string str="WORL" + CharToStr(44);

// 44 is code for 'D'

// resulting string will be WORLD

string DoubleToStr( double value, int digits)

将双精度浮点型转换成字符串型结果返回

:: 输入参数

value - 浮点型数字

digits - 小数点后多少位,0-8

示例:

string value=DoubleToStr(1.28473418, 5);

// value is 1.28473

double NormalizeDouble( double value, int digits)

将双精度浮点型格式化后结果返回

:: 输入参数

value - 浮点型数字

digits - 小数点后多少位,0-8

示例:

double var1=0.123456789;

Print(NormalizeDouble(var1,5));

// output: 0.12346

double StrToDouble( string value)

将字符串型转换成双精度浮点型结果返回

:: 输入参数

value - 数字的字符串

示例:

double var=StrToDouble("103.2812");

int StrToInteger( string value)

将字符串型转换成整型结果返回

:: 输入参数

value - 数字的字符串

示例:

int var1=StrToInteger("1024");

datetime StrToTime( string value)

将字符串型转换成时间型结果返回,输入格式为 yyyy.mm.dd hh:mi

:: 输入参数

value - 时间的字符串

示例:

datetime var1;

var1=StrToTime("2003.8.12 17:35");

var1=StrToTime("17:35");

// returns with current date

var1=StrToTime("2003.8.12");

// returns with midnight time"00:00"

string TimeToStr( datetime value, int mode=TIME_DATE|TIME_MINUTES)

将时间型转换成字符串型返回

:: 输入参数

value - 时间的数字,从1970.1.1 0:0:0 到当下的秒数

mode - 返回字符串的格式TIME_DATE(yyyy.mm.dd),TIME_MINUTES(hh:mi),TIME_SECONDS(hh:mi:ss)

示例:

strign var1=TimeToStr(CurTime(),TIME_DATE|TIME_SECONDS);

学习写EA第十讲:公用函数

公用函数 [Common Functions]

void Alert( ... )

弹出一个表明信息的警示窗口

:: 输入参数

... - 任意值,如有多个可用逗号分割

示例:

if(Close[0]>SignalLevel)

Alert("Close price coming ", Close[0],"!!!");

string ClientTerminalName()

返回客户终端名称

示例:

Print("Terminal name is ",ClientTerminalName());

string CompanyName()

返回公司名称

示例:

Print("Company name is ",CompanyName());

void Comment( ... )

表明信息在行情图左上角

:: 输入参数

... - 任意值,如有多个可用逗号分割

示例:

double free=AccountFreeMargin();

Comment("Account free margin is",DoubleToStr(free,2),"n","Current time is",TimeToStr(CurTime()));

int GetLastError()

取最后错误在错误中的索引位置

示例:

int err;

int handle=FileOpen("somefile.dat", FILE_READ|FILE_BIN);

if(handle<1)

{

err=GetLastError();

Print("error(",err,"): ",ErrorDescription(err));

return(0);

}

int GetTickCount()

取时间标记,函数取回用毫秒标示的时间标记。

示例:

int start=GetTickCount();

// do some hard calculation...

Print("Calculation time is ", GetTickCount()-start, "milliseconds.");

void HideTestIndicators(bool hide)

运用此函数设置一个在Expert Advisor的开关,在试探完成以前指标不回表明在图表上。

:: 输入参数

hide - 能否隐藏 True或者False

示例:

HideTestIndicators(true);

bool IsConnected()

返回客户端能否已连接

示例:

if(!IsConnected())

{

Print("Connection is broken!");

return(0);

}

// Expert body that need opened connection

// ...

bool IsDemo()

返回能否是模拟账户

示例:

if(IsDemo()) Print("I am working on demo account");

else Print("I am working on real account");

bool IsDllsAllowed()

返回能否允许载入Dll文件

示例:

#import "user32.dll"

int MessageBoxA(int hWnd ,string szText, string szCaption,int nType);

...

...

if(IsDllsAllowed()==false)

{

Print("DLL call is not allowed. Experts cannot run.");

return(0);

}

// expert body that calls external DLL functions

MessageBoxA(0,"an message","Message",MB_OK);

bool IsLibrariesAllowed()

返回能否允许载入库文件

示例:

#import "somelibrary.ex4"

int somefunc();

...

...

if(IsLibrariesAllowed()==false)

{

Print("Library call is not allowed. Experts cannot run.");

return(0);

}

// expert body that calls external DLL functions

somefunc();

bool IsStopped()

返回能否处在停止状态

示例:

while(expr!=false)

{

if(IsStopped()==true) return(0);

// long time procesing cycle

// ...

}

bool IsTesting()

返回能否处在试探模式

示例:

if(IsTesting()) Print("I am testing now");

bool IsTradeAllowed()

返回能否允许交易

示例:

if(IsTradeAllowed()) Print("Trade allowed");

double MarketInfo( string symbol, int type)

返回市场目前情形

:: 输入参数

symbol - 通货代码

type - 返回结果的类型

示例:

double var;

var=MarketInfo("欧元兑美元",MODE_BID);

int MessageBox( string text=NULL, string caption=NULL, int flags=EMPTY)

弹出消息窗口,返回消息窗口的结果

:: 输入参数

text - 窗口表明的文字

caption - 窗口上表明的标题

flags - 窗口选项开关

示例:

#include

if(ObjectCreate("text_object", OBJ_TEXT, 0, D'2004.02.20 12:30',1.0045)==false)

{

int ret=MessageBox("ObjectCreate() fails with code"+GetLastError()+"nContinue?", "Question",MB_YESNO|MB_ICONQUESTION);

if(ret==IDNO) return(false);

}

// continue

int Period()

返回图表时间线的类型

示例:

Print("Period is ", Period());

void PlaySound( string filename)

播放音乐文件

:: 输入参数

filename - 音频文件名

示例:

if(IsDemo()) PlaySound("alert.wav");

void Print( ... )

将文本打印在结果窗口内

:: 输入参数

... - 任意值,复数用逗号分割

示例:

Print("Account free margin is ", AccountFreeMargin());

Print("Current time is ", TimeToStr(CurTime()));

double pi=3.141592653589793;

Print("PI number is ", DoubleToStr(pi,8));

// Output: PI number is 3.14159265

// Array printin

标签:

随机快审展示
加入快审,优先展示

加入VIP