mt4编程大全
更新时间:2024-05-07 08:43:01 阅读量: 综合文库 文档下载
语法 [Syntax]
代码格式
空格建、Tab键、换行键和换页符都可以成为代码排版的分隔符,你能使用各种符号来增加代码的可读性。 注释
多行注释使用 /* 作为开始到 */ 结束,在这之间不能够嵌套。单行注释使用 // 作为开始到新的一行结束,可以被嵌套到多行注释之中。 示例:
// 单行注释 /* 多行 注释 // 嵌套的单行注释 注释结束 */ 标识符
标识符用来给变量、函数和数据类型进行命名,长度不能超过31个字节
你可以使用数字0-9、拉丁字母大写A-Z和小写a-z(大小写有区分的)还有下划线(_)。此外首字母不可以是数字,标识符不能和保留字冲突. 示例:
// NAME1 namel Total_5 Paper 保留字
下面列出的是固定的保留字。不能使用以下任何保留字进行命名。 数据类型 bool color
存储类型 extern static
操作符 break case
其它 false true
datetime double int string void
continue default else for if return switch while
数据类型 [Data types]
数据类型概述 主要数据类型有:
? ? ? ?
Integer (int) Boolean (bool) ?èò?eà?? (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码字符的使用连续的两个双引号来包括需要表示的内容如:\示例:
\\\\
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' 运算符和表达式 [Operations & Expressions]
表达式
一个表达式可以拥有多个字符和操作符,一个表达式可以写在几行里面。 示例:
a++; b = 10; x = (y*z)/w; 注:分号(;)是表达式的结束符。
算术运算符
Sum of values i = j + 2; Difference of values i = j - 3; Changing the operation sign x = - x; Product of values z = 3 * x; Division quotient i = j / 5; Division remainder minutes = time % 60; Adding 1 to the variable value i++; Subtracting 1 from the variable value k--; 加减1的运算符不能被嵌套在表达式中
int a=3; a++; // 可行的表达式 int b=(a++)*3; // 不可行的表达式
赋值运算符
注:将右侧的结果赋值给左侧的变量
将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(\逻辑运算符或(||)用来表示两个表达式只要有一个成立即可。 示例:
if(xl) Print(\逻辑运算符和(&&)用来表示两个表达式要同时成立才行。 示例:
if(p!=x && p>y) Print(\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[i] = 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, \
优先级规则
下面是从上到下的运算优先规则,优先级高的将先被运算。
() 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 , Comma From left to right 操作符 [Operators]
格式和嵌套
格式.一个操作符可以占用一行或者多行,两个或多个操作符可以占用更多的行。 嵌套.执行控制符(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
继续操作符
一个continue;我们将其放在嵌套内的指定位置,用来在指定情况下跳过接下来的运算,直接跳入下一次的循环。 示例:
// summary of nonzero elements of array int func(int array[]) { int array_size=ArraySize(array); int sum=0; for(int i=0;i { if(a[i]==0) continue; sum+=a[i]; } 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(\}
选择操作符 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(\break; case 'B': case 'C': Print(\break; default: Print(\break; }
循环操作符 while while (expression) operator;
只要表达式expression为真就执行操作operator 示例:
while(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 函数定义 一个函数是由返回值、输入参数、内嵌操作所组成的。 示例: double // 返回值类型 linfunc (double x, double a, double b) // 函数名和输入参数 { // 内嵌的操作 return (a*x + b); // 返回值 } 如果没有返回值那么返回值的类型可以写为void 示例: void errmesg(string s) { Print(\} 函数调用 function_name (x1,x2,...,xn) 示例: int somefunc() { 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()当数据变动时触发,对于自定义指标或者自动交易的编程主要依靠此函数进行。 变量 [Variables] 定义变量 定义基本类型 基本类型包括 ? ? ? ? 示例: 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 = \ 数组类型 示例: int mta[6] = {1,4,9,16,25,36}; 外部函数引用 示例: #import \int MessageBoxA(int hWnd ,string szText, string szCaption,int nType); int SendMessageA(int hWnd,int Msg,int wParam,int lParam); #import \double round(double value); #import 预处理程序 [Preprocessor] 定义常数 #define identifier_value 常数可以是任何类型的,常数在程序中不可更改。 示例: #define ABC 100 #define PI 0.314 #define COMPANY_NAME \ 编译参数定义 #property identifier_value 示例: #property link \#property copyright \#property stacksize 1024 以下是所有的参数名称: 参数名称 link copyright stacksize indicator_chart_window 类型 说明 string 设置一个链接到公司网站 string 公司名称 int void 堆栈大小 显示在走势图窗口 显示在新区块 显示缓存最高8 图形区间最低点 图形区间最高点 indicator_separate_window void indicator_buffers indicator_minimum indicator_maximum indicator_colorN indicator_levelN show_confirm show_inputs 嵌入文件 #include #include #include \ 引入函数或其他模块 #import \func1(); func2(); #import 示例: #import \int int int color 第N根线的颜色,最高8根线 double predefined level N for separate window custom indicator void void 当程序执行之前是否经过确认 before script run its property sheet appears; disables show_confirm property int MessageBoxA(int hWnd,string lpText,string lpCaption, int uType); int MessageBoxExA(int hWnd,string lpText,string lpCaption, int uType,int wLanguageId); #import \#import \int GetDC(int hWnd); int ReleaseDC(int hWnd,int hDC); #import 账户信息 [Account Information] double AccountBalance() 返回账户余额 示例: Print(\ double AccountCredit() 返回账户信用点数 示例: Print(\ string AccountCompany() 返回账户公司名 示例: Print(\ string AccountCurrency() 返回账户所用的通货名称 示例: Print(\ double AccountEquity() 返回资产净值 示例: Print(\ double AccountFreeMargin() Returns free margin value of the current account. 示例: Print(\ int AccountLeverage() 返回杠杆比率 示例: Print(\ double AccountMargin() Returns margin value of the current account. 示例: Print(\ string AccountName() 返回账户名称 示例: Print(\ int AccountNumber() 返回账户数字 示例: Print(\ double AccountProfit() 返回账户利润 示例: Print(\数组函数 [Array Functions] int ArrayBsearch( double array[], double value, int count=WHOLE_ARRAY, int start=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() int ArrayCopy( object& dest[], object source[], int start_dest=0, int start_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, int timeframe=0) 复制一段走势图上的数据到一个二维数组,数组的第二维只有6个项目分别是: 0 - 时间, 1 - 开盘价, 2 - 最低价, 3 - 最高价, 4 - 收盘价, 5 - 成交量. :: 输入参数 dest_array[] - 目标数组 symbol - 标示,当前所需要的通货的标示 timeframe - 图表的时间线 示例: double array1[][6]; ArrayCopyRates(array1,\Print(\ 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]),\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(\else Print(\ int ArrayInitialize( double& array[], double value) 对数组进行初始化,返回经过初始化的数组项的个数 :: 输入参数 array[] - 需要初始化的数组 value - 新的数组项的值 示例: //---- 把所有数组项的值设置为2.1 double myarray[10]; ArrayInitialize(myarray,2.1); corresponds to \day bar opened at \bool ArrayIsSeries( object array[]) 检查数组是否连续的(time,open,close,high,low, or volume). :: 输入参数 array[] - 需要检查的数组 示例: if(ArrayIsSeries(array1)==false) ArrayInitialize(array1,0); else { Print(\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(\ 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(\ 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[i]=iMA(NULL,0,12,0,MODE_EMA,PRICE_CLOSE,i)-iMA(NULL,0,26,0,MODE_EMA,PRICE_CLOSE,i); for(i=0; i signal_buffer[i]=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, int sort_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 类型转换函数 [Conversion Functions] string CharToStr( int char_code) 将字符型转换成字符串型结果返回 :: 输入参数 char_code - 字符的ACSII码 示例: string str=\// 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(\ int StrToInteger( string value) 将字符串型转换成整型结果返回 :: 输入参数 value - 数字的字符串 示例: int var1=StrToInteger(\ datetime StrToTime( string value) 将字符串型转换成时间型结果返回,输入格式为 yyyy.mm.dd hh:mi :: 输入参数 value - 时间的字符串 示例: datetime var1; var1=StrToTime(\var1=StrToTime(\var1=StrToTime(\ 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); 公用函数 [Common Functions] void Alert( ... ) 弹出一个显示信息的警告窗口 :: 输入参数 ... - 任意值,如有多个可用逗号分割 示例: if(Close[0]>SignalLevel) Alert(\ string ClientTerminalName() 返回客户终端名称 示例: Print(\ string CompanyName() 返回公司名称 示例: Print(\ void Comment( ... ) 显示信息在走势图左上角 :: 输入参数 ... - 任意值,如有多个可用逗号分割 示例: double free=AccountFreeMargin(); Comment(\ int GetLastError() 取最后错误在错误中的索引位置 示例: int err; int handle=FileOpen(\if(handle<1) { err=GetLastError(); Print(\,\return(0); } int GetTickCount() 取时间标记,函数取回用毫秒标示的时间标记。 示例: int start=GetTickCount(); // do some hard calculation... Print(\ void HideTestIndicators(bool hide) 使用此函数设置一个在Expert Advisor的开关,在测试完成之前指标不回显示在图表上。 :: 输入参数 hide - 是否隐藏 True或者False 示例: HideTestIndicators(true); bool IsConnected() 返回客户端是否已连接 示例: if(!IsConnected()) { Print(\return(0); } // Expert body that need opened connection // ... bool IsDemo() 返回是否是模拟账户 示例: if(IsDemo()) Print(\else Print(\ bool IsDllsAllowed() 返回是否允许载入Dll文件 示例: #import \int MessageBoxA(int hWnd ,string szText, string szCaption,int nType); ... ... if(IsDllsAllowed()==false) { Print(\return(0); } // expert body that calls external DLL functions MessageBoxA(0,\ bool IsLibrariesAllowed() 返回是否允许载入库文件 示例: #import \int somefunc(); ... ... if(IsLibrariesAllowed()==false) { Print(\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(\ bool IsTradeAllowed() 返回是否允许交易 示例: if(IsTradeAllowed()) Print(\ double MarketInfo( string symbol, int type) 返回市场当前情况 :: 输入参数 symbol - 通货代码 type - 返回结果的类型 示例: double var; var=MarketInfo(\ int MessageBox( string text=NULL, string caption=NULL, int flags=EMPTY) 弹出消息窗口,返回消息窗口的结果 :: 输入参数 text - 窗口显示的文字 caption - 窗口上显示的标题 flags - 窗口选项开关 示例: #include if(ObjectCreate(\{ int ret=MessageBox(\MB_YESNO|MB_ICONQUESTION); if(ret==IDNO) return(false); } // continue int Period() 返回图表时间线的类型 示例: Print(\ void PlaySound( string filename) 播放音乐文件 :: 输入参数 filename - 音频文件名 示例: if(IsDemo()) PlaySound(\ void Print( ... ) 将文本打印在结果窗口内 :: 输入参数 ... - 任意值,复数用逗号分割 示例: Print(\Print(\double pi=3.141592653589793; Print(\// Output: PI number is 3.14159265 // Array printing for(int i=0;i<10;i++) Print(Close[i]); bool RefreshRates() 返回数据是否已经被刷新过了 示例: int ticket; while(true) { ticket=OrderSend(Symbol(),OP_BUY,1.0,Ask,3,0,0,\if(ticket<=0) { int error=GetLastError(); if(error==134) break; // not enough money if(error==135) RefreshRates(); // prices changed break; } else { OrderPrint(); break; } //---- 10 seconds wait Sleep(10000); } void SendMail( string subject, string some_text) 发送邮件到指定信箱,需要到菜单 Tools -> Options -> Email 中将邮件打开. :: 输入参数 subject - 邮件标题 some_text - 邮件内容 示例: double lastclose=Close[0]; if(lastclose string ServerAddress() 返回服务器地址 示例: Print(\ void Sleep( int milliseconds) 设置线程暂停时间 :: 输入参数 milliseconds - 暂停时间 1000 = 1秒 示例: Sleep(5); void SpeechText( string text, int lang_mode=SPEECH_ENGLISH) 使用Speech进行语音输出 :: 输入参数 text - 阅读的文字 lang_mode - 语音模式 SPEECH_ENGLISH (默认的) 或 SPEECH_NATIVE 示例: double lastclose=Close[0]; SpeechText(\ string Symbol() 返回当前当前通货的名称 示例: int total=OrdersTotal(); for(int pos=0;pos int UninitializeReason() 取得程序末初始化的理由 示例: // this is example int deinit() { switch(UninitializeReason()) { case REASON_CHARTCLOSE: case REASON_REMOVE: CleanUp(); break; // clean up and free all expert's resources. case REASON_RECOMPILE: case REASON_CHARTCHANGE: case REASON_PARAMETERS: case REASON_ACCOUNT: StoreData(); break; // prepare to restart } //... } 自定义指标函数 [Custom Indicator Functions] void IndicatorBuffers(int count) 设置自定义指标缓存数 :: 输入参数 count - 缓存数量 示例: #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Silver //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double ind_buffer1[]; double ind_buffer2[]; double ind_buffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 additional buffers are used for counting. IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3); SetIndexDrawBegin(0,SignalSMA); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2); //---- 3 indicator buffers mapping SetIndexBuffer(0,ind_buffer1); SetIndexBuffer(1,ind_buffer2); SetIndexBuffer(2,ind_buffer3); //---- name for DataWindow and indicator subwindow label IndicatorShortName(\//---- initialization done return(0); } int IndicatorCounted() 返回缓存数量 示例: int start() { int limit; int counted_bars=IndicatorCounted(); //---- check for possible errors if(counted_bars<0) return(-1); //---- last counted bar will be recounted if(counted_bars>0) counted_bars--; limit=Bars-counted_bars; //---- main loop for(int i=0; i { //---- ma_shift set to 0 because SetIndexShift called abowe ExtBlueBuffer[i]=iMA(NULL,0,JawsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); ExtRedBuffer[i]=iMA(NULL,0,TeethPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); ExtLimeBuffer[i]=iMA(NULL,0,LipsPeriod,0,MODE_SMMA,PRICE_MEDIAN,i); } //---- done return(0); } void IndicatorDigits( int digits) 设置指标精确度 :: 输入参数 digits - 小数点后的小数位数 示例: #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Silver //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double ind_buffer1[]; double ind_buffer2[]; double ind_buffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 additional buffers are used for counting. IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3); SetIndexDrawBegin(0,SignalSMA); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2); //---- 3 indicator buffers mapping SetIndexBuffer(0,ind_buffer1); SetIndexBuffer(1,ind_buffer2); SetIndexBuffer(2,ind_buffer3); //---- name for DataWindow and indicator subwindow label IndicatorShortName(\//---- initialization done return(0); } void IndicatorShortName( string name) 设置指标的简称 :: 输入参数 name - 新的简称 示例: #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Silver //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double ind_buffer1[]; double ind_buffer2[]; double ind_buffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 additional buffers are used for counting. IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3); SetIndexDrawBegin(0,SignalSMA); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2); //---- 3 indicator buffers mapping SetIndexBuffer(0,ind_buffer1); SetIndexBuffer(1,ind_buffer2); SetIndexBuffer(2,ind_buffer3); //---- name for DataWindow and indicator subwindow label IndicatorShortName(\//---- initialization done return(0); } void SetIndexArrow( int index, int code) 在指标上设置一个箭头符号 :: 输入参数 index - 第几根指标线 0-7 code - 符号的编码,参照 Wingdings 字体 示例: SetIndexArrow(0, 217); bool SetIndexBuffer( int index, double array[]) 设置指标线的缓存数组 :: 输入参数 index - 第几根指标线 0-7 array[] - 缓存的数组 示例: double ExtBufferSilver[]; int init() { SetIndexBuffer(0, ExtBufferSilver); // set buffer for first line // ... } void SetIndexDrawBegin( int index, int begin) 设置划线的开始点 :: 输入参数 index - 第几根指标线 0-7 begin - 划线的开始点 示例: #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Silver //---- indicator parameters extern int FastEMA=12; extern int SlowEMA=26; extern int SignalSMA=9; //---- indicator buffers double ind_buffer1[]; double ind_buffer2[]; double ind_buffer3[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 additional buffers are used for counting. IndicatorBuffers(3); //---- drawing settings SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3); SetIndexDrawBegin(0,SignalSMA); IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+2); //---- 3 indicator buffers mapping SetIndexBuffer(0,ind_buffer1); SetIndexBuffer(1,ind_buffer2); SetIndexBuffer(2,ind_buffer3); //---- name for DataWindow and indicator subwindow label IndicatorShortName(\//---- initialization done return(0); } void SetIndexEmptyValue( int index, double value) 设置划线的空值,空值不划在和出现在数据窗口 :: 输入参数 index - 第几根指标线 0-7 value - 新的空值 示例: SetIndexEmptyValue(6,0.0001); void SetIndexLabel( int index, string text) 设置指标线的名称 :: 输入参数 index - 第几根指标线 0-7 text - 线的名称,Null不会显示在数据窗口中 示例: //+------------------------------------------------------------------+ //| Ichimoku Kinko Hyo initialization function | //+------------------------------------------------------------------+ int init() { //---- SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,Tenkan_Buffer); SetIndexDrawBegin(0,Tenkan-1); SetIndexLabel(0,\//---- SetIndexStyle(1,DRAW_LINE); SetIndexBuffer(1,Kijun_Buffer); SetIndexDrawBegin(1,Kijun-1); SetIndexLabel(1,\//---- a_begin=Kijun; if(a_begin SetIndexStyle(2,DRAW_HISTOGRAM,STYLE_DOT); SetIndexBuffer(2,SpanA_Buffer); SetIndexDrawBegin(2,Kijun+a_begin-1); SetIndexShift(2,Kijun); //---- Up Kumo bounding line does not show in the DataWindow SetIndexLabel(2,NULL); SetIndexStyle(5,DRAW_LINE,STYLE_DOT); SetIndexBuffer(5,SpanA2_Buffer); SetIndexDrawBegin(5,Kijun+a_begin-1); SetIndexShift(5,Kijun); SetIndexLabel(5,\//---- SetIndexStyle(3,DRAW_HISTOGRAM,STYLE_DOT); SetIndexBuffer(3,SpanB_Buffer); SetIndexDrawBegin(3,Kijun+Senkou-1); SetIndexShift(3,Kijun); //---- Down Kumo bounding line does not show in the DataWindow SetIndexLabel(3,NULL); //---- SetIndexStyle(6,DRAW_LINE,STYLE_DOT); SetIndexBuffer(6,SpanB2_Buffer); SetIndexDrawBegin(6,Kijun+Senkou-1); SetIndexShift(6,Kijun); SetIndexLabel(6,\//---- SetIndexStyle(4,DRAW_LINE); SetIndexBuffer(4,Chinkou_Buffer); SetIndexShift(4,-Kijun); SetIndexLabel(4,\//---- return(0); } void SetIndexShift( int index, int shift) 设置指标线的位移数 :: 输入参数 index - 第几根指标线 0-7 shift - 位移多少 示例: //+------------------------------------------------------------------+ //| Alligator initialization function | //+------------------------------------------------------------------+ int init() { //---- line shifts when drawing SetIndexShift(0,JawsShift); SetIndexShift(1,TeethShift); SetIndexShift(2,LipsShift); //---- first positions skipped when drawing SetIndexDrawBegin(0,JawsShift+JawsPeriod); SetIndexDrawBegin(1,TeethShift+TeethPeriod); SetIndexDrawBegin(2,LipsShift+LipsPeriod); //---- 3 indicator buffers mapping SetIndexBuffer(0,ExtBlueBuffer); SetIndexBuffer(1,ExtRedBuffer); SetIndexBuffer(2,ExtLimeBuffer); //---- drawing settings SetIndexStyle(0,DRAW_LINE); SetIndexStyle(1,DRAW_LINE); SetIndexStyle(2,DRAW_LINE); //---- index labels SetIndexLabel(0,\SetIndexLabel(1,\SetIndexLabel(2,\//---- initialization done return(0); } void SetIndexStyle( int index, int type, int style=EMPTY, int width=EMPTY, color clr=CLR_NONE) 设置指标线的样式 :: 输入参数 index - 第几根指标线 0-7 type - 线形状的种类,详见线条种类 style - 划线的样式 width - 显得宽度(1,2,3,4,5) clr - 线的颜色 示例: SetIndexStyle(3, DRAW_LINE, EMPTY, 2, Red); 日期时间函数 [Date & Time Functions] datetime CurTime( ) 返回当前时间 示例: if(CurTime()-OrderOpenTime()<360) return(0); int Day() 返回当前日期 示例: if(Day()<5) return(0); int DayOfWeek( ) 返回当前日期是星期几 0-星期天,1,2,3,4,5,6 示例: // do not work on holidays. if(DayOfWeek()==0 || DayOfWeek()==6) return(0); int DayOfYear( ) 返回当前日期在年内的第几天 示例: if(DayOfYear()==245) return(true); int Hour() 返回当前的小时数 0-23 示例: bool is_siesta=false; if(Hour()>=12 || Hour()<17) is_siesta=true; datetime LocalTime() 返回当前电脑时间 示例: if(LocalTime()-OrderOpenTime()<360) return(0); int Minute() 返回当前分钟 示例: if(Minute()<=15) return(\ int Month() 返回当前月份 示例: if(Month()<=5) return(\ int Seconds() 返回当前秒数 示例: if(Seconds()<=15) return(0); int TimeDay( datetime date) 返回输入日期中的日期 :: 输入参数 date - 输入日期 示例: int day=TimeDay(D'2003.12.31'); // day is 31 int TimeDayOfWeek( datetime date) 返回输入日期中的日期是星期几 (0-6) :: 输入参数 date - 输入日期 示例: int weekday=TimeDayOfWeek(D'2004.11.2'); // day is 2 - tuesday int TimeDayOfYear( datetime date) 返回输入日期中的日期在当年中的第几天 :: 输入参数 date - 输入日期 示例: int day=TimeDayOfYear(CurTime()); int TimeHour( datetime time) 返回输入日期中的小时 :: 输入参数 date - 输入日期 示例: int h=TimeHour(CurTime()); int TimeMinute( datetime time) 返回输入日期中的分钟 :: 输入参数 date - 输入日期 示例: int m=TimeMinute(CurTime()); int TimeMonth( datetime time) 返回输入日期中的月份 :: 输入参数 date - 输入日期 示例: int m=TimeMonth(CurTime()); int TimeSeconds( datetime time) 返回输入日期中的秒钟 :: 输入参数 date - 输入日期 示例: int m=TimeSeconds(CurTime()); int TimeYear( datetime time) 返回输入日期中的年份 :: 输入参数 date - 输入日期 示例: int y=TimeYear(CurTime()); int TimeYear( datetime time) 返回当前年份 示例: // return if date before 1 May 2002 if(Year()==2002 && Month()<5) return(0); 文件处理函数 [File Functions] void FileClose(int handle) 关闭正在已经打开的文件. :: 输入参数 handle - FileOpen()返回的句柄 示例: int handle=FileOpen(\if(handle>0) { // working with file ... FileClose(handle); } void FileDelete(string filename) 删除文件,如果发生错误可以通过GetLastError()来查询 注:你只能操作terminal_dir\\experts\\files目录下的文件 :: 输入参数 filename - 目录和文件名 示例: // file my_table.csv will be deleted from terminal_dir\\experts\\files directory int lastError; FileDelete(\lastError=GetLastError(); if(laseError!=ERR_NOERROR) { Print(\,\return(0); } void FileFlush(int handle) 将缓存中的数据刷新到磁盘上去 :: 输入参数 handle - FileOpen()返回的句柄 示例: int bars_count=Bars; int handle=FileOpen(\if(handle>0) { FileWrite(handle, \for(int i=0;i bool FileIsEnding(int handle) 检查是否到了文件尾. :: 输入参数 handle - FileOpen()返回的句柄 示例: if(FileIsEnding(h1)) { FileClose(h1); return(false); } bool FileIsLineEnding( int handle) 检查行是否到了结束 :: 输入参数 handle - FileOpen()返回的句柄 示例: if(FileIsLineEnding(h1)) { FileClose(h1); return(false); } int FileOpen( string filename, int mode, int delimiter=';') 打开文件,如果失败返回值小于1,可以通过GetLastError()获取错误 注:只能操作terminal_dir\\experts\\files目录的文件 :: 输入参数 filename - 目录文件名 mode - 打开模式 FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE. delimiter - CSV型打开模式用的分割符,默认为分号(;). 示例: int handle; handle=FileOpen(\if(handle<1) { Print(\return(false); } int FileOpenHistory( string filename, int mode, int delimiter=';') 打开历史数据文件,如果失败返回值小于1,可以通过GetLastError()获取错误 :: 输入参数 filename - 目录文件名 mode - 打开模式 FILE_BIN, FILE_CSV, FILE_READ, FILE_WRITE. delimiter - CSV型打开模式用的分割符,默认为分号(;). 示例: int handle=FileOpenHistory(\if(handle<1) { Print(\return(false); } // work with file // ... FileClose(handle); int FileReadArray( int handle, object& array[], int start, int count) 将二进制文件读取到数组中,返回读取的条数,可以通过GetLastError()获取错误 注:在读取之前要调整好数组大小 :: 输入参数 handle - FileOpen()返回的句柄 array[] - 写入的数组 start - 在数组中存储的开始点 count - 读取多少个对象 示例: int handle; double varray[10]; handle=FileOpen(\if(handle>0) { FileReadArray(handle, varray, 0, 10); FileClose(handle); } double FileReadDouble( int handle, int size=DOUBLE_VALUE) 从文件中读取浮点型数据,数字可以是8byte的double型或者是4byte的float型。 :: 输入参数 handle - FileOpen()返回的句柄
正在阅读:
mt4编程大全05-07
三相电动机缺相的原因及预防03-29
街道2021年开展计划生育“双月会战”活动实施方案08-16
银行员工行为排查情况总结05-01
2013宁夏回族自治区毛概经典复习资料一点通科目一03-11
百货商场--年度促销活动策划案607-19
解读“两高”《关于执行〈中华人民共和国刑法〉确定罪名的补充规定(三)》12-08
小数点移动教学反思02-27
河南省耕地面积动态变化趋势及驱动力分析10-16
经皮给药系统-透皮贴剂研究进展04-21
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 编程
- 大全
- mt4