学好智能交易系统(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 arrayint 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);条件操作符ifif (expression)operator;假使表达式为真那么实施操作。示例:if(a==x)temp*=3;temp=MathAbs(temp);条件操作符if-elseif (expression)operator1elseoperator2假使表达式为真那么实施operator1,假使为假实施operator2,else后还可以跟进多个if实施多项选择。详见示例。示例:if(x>1)if(y==2)z=5;elsez=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");}选择操作符switchswitch (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;}循环操作符whilewhile (expression)operator;只要表达式expression为真就实施操作operator示例:while(k{y=y*x;k++;}循环操作符forfor (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;ia=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 modeArrayCopySeries(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 - 从目标数组的第几位开始写入,默觉得0start_source - 从源数组的第几位开始读取,默觉得0count - 读取多少位的数组示例:double array1[][6];double array2[10][6];// fill array with some dataArrayCopyRates(array1);ArrayCopy(array2, array1,0,Bars-9,10);// now array2 has first 10 bars in the historyint 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-5symbol - 标示,目前所需要的通货的标示timeframe - 图表的时间线示例:datetime daytimes[];int shift=10,dayshift;// All the Time[] timeseries are sorted in descendant modeArrayCopySeries(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 2bool ArrayGetAsSeries(object array[])检查数组能否是有组织序列的数组(能否从最后到最开始排序过的),假使不是返回否:: 输入参数array[] - 需要检查的数组示例:if(ArrayGetAsSeries(array1)==true)Print("array1 is indexed as a series array");elsePrint("array1 is indexed normally (from left to right)");int ArrayInitialize( double& array[], double value)对数组执行初始化,返回经历初始化的数组项的个数:: 输入参数array[] - 需要初始化的数组value - 新的数组项的值示例://---- 把所有数组项的值设置为2.1double 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);// 数组中总项目数为80bool 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; imacd_buffer=iMA(NULL,0,12,0,MODE_EMA,PR洲际交易所_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PR洲际交易所_CLOSE,i);for(i=0; isignal_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,9ArraySort(num_array);// now array is sorted 1,3,4,6,9ArraySort(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 WORLDstring DoubleToStr( double value, int digits)将双精度浮点型转换成字符串型结果返回:: 输入参数value - 浮点型数字digits - 小数点后多少位,0-8示例:string value=DoubleToStr(1.28473418, 5);// value is 1.28473double NormalizeDouble( double value, int digits)将双精度浮点型格式化后结果返回:: 输入参数value - 浮点型数字digits - 小数点后多少位,0-8示例:double var1=0.123456789;Print(NormalizeDouble(var1,5));// output: 0.12346double 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 datevar1=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 functionsMessageBoxA(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 functionssomefunc();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 - 窗口选项开关示例:#includeif(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);}// continueint 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