cwit 发表于 2008-4-27 23:56:28

MQ4编程手册

MQ4编程手册
From 汇123--外汇交易百科知识
Jump to: navigation, search
MQ4语法
MQ4数据类型
运算符和表达式
操作符

[ 本帖最后由 cwit 于 2008-4-27 23:57 编辑 ]

cwit 发表于 2008-4-27 23:58:11

MQ4语法From 汇123--外汇交易百科知识
Jump to: navigation, search


目录[隐藏]
[*]1 代码格式[*]2 注释[*]3 标识符[*]4 保留字[编辑]
代码格式空格建、Tab键、换行键和换页符都可以成为代码排版的分隔符,你能使用各种符号来增加你带骂得可读性。
[编辑]
注释多行注释使用 /* 作为开始到 */ 结束,在这之间不能够嵌套。单行注释使用 // 作为开始到新的一行结束,可以被嵌套到多行注释之中。示例:
// 单行注释 /* 多行   注释 // 嵌套的单行注释 注释结束 */[编辑]
标识符标识符用来给变量、函数和数据类型进行命名,长度不能超过31一个字节你可以使用数字0-9、拉丁字母大写A-Z和小写a-z(大小写有区分的)还有下划线(_)。此外首字母不可以是数字,标识符不能和保留字冲突. 示例:
// NAME1 namel Total_5 Paper[编辑]
保留字下面列出的是固定的保留字。不能使用以下任何保留字进行命名。
数据类型存储类型操作符其它boolexternbreakfalsecolorstaticcasetrue datetimecontinuedoubledefaultintelsestringforvoid ifreturn switch while

cwit 发表于 2008-4-27 23:58:52

MQ4数据类型From 汇123--外汇交易百科知识
Jump to: navigation, search
目录[隐藏]
[*]1 数据类型概述[*]2 Integer 类型[*]3 Literal 类型[*]4 Boolean 类型[*]5 Floating-point number 类型[*]6 String 类型[*]7 Color 类型[*]8 Datetime 类型[编辑]
数据类型概述主要数据类型有:
[*]Integer (int)[*]Boolean (bool)[*]ëèòåðàëû (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, 0X7C7Integer 变量的取值范围为-2147483648到2147483647。
[编辑]
Literal 类型任意在单引号中的字符或十六进制的任意ASCII码例如'\x10'都是被看作为一个字符,一些字符例如单引号('),双引号("),问号(?),反斜杠(\)和一些控制符都需要在之前加一个反斜杠(\)进行转意后表示出来:
line feed NL (LF) \nhorizontal tab HT \tcarriage return CR \rreverse slash \ \\single quote ' \'double quote " \"hexadecimal ASCII-code hh \xhh以上字符如果不经过反斜杠进行转意将不能被使用示例:
int a = 'A';int b = '$';int c = '©'; // code 0xA9int 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 \t\xA9""this line with LF symbol \n""A" "1234567890" "0" "$"[编辑]
Color 类型颜色类型可以使用以下示例里的几种方式进行定义。 示例:
// symbol constantsC'128,128,128' // grayC'0x00,0x00,0xFF' // blue// named colorRedYellowBlack// integer-valued representation0xFFFFFF // white16777215 // white0x008000 // green32768 // green[编辑]
Datetime 类型时间类型使用年、月、日、时、分、秒来进行定义,你可以使用以下示例中的方式来定义变量。示例:
D'2004.01.01 00:00' // New YearD'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' 12:30:27'D //equal to D' 00:00:00'

cwit 发表于 2008-4-27 23:59:30

运算符和表达式From 汇123--外汇交易百科知识
Jump to: navigation, search
目录[隐藏]
[*]1 表达式[*]2 算术运算符[*]3 赋值运算符[*]4 关系运算符[*]5 真假运算符[*]6 位逻辑运算符[*]7 其它运算符[*]8 优先级规则[编辑]
表达式一个表达式可以拥有多个字符和操作符,一个表达式可以写在几行里面。示例:
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("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, Comma From left to right

cwit 发表于 2008-4-27 23:59:57

操作符From 汇123--外汇交易百科知识
Jump to: navigation, search
目录[隐藏]
[*]1 格式和嵌套[*]2 复合操作符[*]3 表达式操作符[*]4 调用函数操作符[*]5 空操作符[*]6 停止操作符[*]7 继续操作符[*]8 返回操作符[*]9 条件操作符 if[*]10 选择操作符 switch[*]11 循环操作符 while[*]12 循环操作符 for[编辑]
格式和嵌套格式.一个操作符可以占用一行或者多行,两个或多个操作符可以占用更多的行。嵌套.执行控制符(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<ARRAY_SIZE;I++)if((array==0)break;[编辑]
继续操作符一个continue;我们将其放在嵌套内的指定位置,用来在指定情况下跳过接下来的运算,直接跳入下一次的循环。示例:
// summary of 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-else== if (expression) operator1 else operator2 如果表达式为真那么执行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 A\n");break;case 'B':case 'C':Print("CASE B or C\n");break;default:Print("NOT A, B or C\n");break;}[编辑]
循环操作符 whilewhile (expression) operator; 只要表达式expression为真就执行操作operator 示例:
while(k<N){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;i<N;I++,J--)a=a;

cupid_venus 发表于 2008-7-1 22:33:42

MQ4 是什么啊?

yaooay 发表于 2008-7-2 00:48:44

to cupid venus, 感兴趣的话这方面的例子很多, 我来转载一个编制自动交易系统的简单例子:
介绍
鉴于许多中国的交易者对交易系统了解不多,本文解释使用MQ4语言编制自动交易系统的基本知识.

Title 编制自动交易系统的基本知识
一个交易系统大致包括以下几个方面:
1 开仓策略,即什么条件满足时开仓, 如某条线和某条线上交叉或下交叉,
2 平仓策略,即什么条件满足时平仓, 包括止赢设置,止损设置,和跟踪止赢设置三个方面.
3 资金管理, 其中一个方面就是下单的大小
4 时间管理, 如持仓时间,开平仓时间间隔等
5 账户状态分析,如交易历史,当前资金/仓位/各仓为盈亏状态等.

当然一个交易系统不必包括全部内容,本文做为入门知识也仅通过实例介绍交易系统程序的基本构成.

//+------------------------------------------------------------------+
//|                           Designed by OKwh, China               |
//|                   Copyright 2007, OKwh Dxdcn                  |
//|                                 http://blog.sina.com.cn/FXTrade |
//+------------------------------------------------------------------+
#propertycopyright "Copyright 2007 , Dxd, China."
#propertylink      "http://blog.sina.com.cn/FXTrade ,http://www.mql4.com/users/DxdCn"
#define MAGICMA 200610011231
//+------------------------------------------------------------------+
//| 注意没有指标文件那些property                   |
//+------------------------------------------------------------------+
extern int whichmethod = 1;   //1~4 种下单方式1 仅开仓, 2 有止损无止赢, 3 有止赢无止损, 4 有止赢也有止损
extern double TakeProfit = 100;   //止赢点数
extern   double StopLoss = 20;    //止损点数
extern double MaximumRisk   = 0.3; //资金控制,控制下单量
extern double TrailingStop =25;   //跟踪止赢点数设置
extern   int maxOpen = 3;   //最多开仓次数限制
extern   int maxLots = 5;   //最多单仓持仓量限制
extern int bb = 0;       //非零就允许跟踪止赢
extern double MATrendPeriod=26;//使用26均线 开仓条件参数本例子

int i, p2, xxx,p1, res;
double Lots;
datetime lasttime;       //时间控制, 仅当一个时间周期完成才检查条件
int init()   //初始化
{
Lots = 1;
lasttime = NULL;
return(0);
}
int deinit() { return(0); } //反初始化
//主程序
int start()
{
CheckForOpen();    //开仓 平仓 条件检查 和操作
if (bb>0)   CTP();   //跟踪止赢
return(0);
}
//+------下面是各子程序--------------------------------------------+
double LotsOptimized()   //确定下单量,开仓调用 资金控制
{
double lot=Lots;
int   orders=HistoryTotal();   // history orders total
int   losses=0;             // number of losses orders without a break
//MarketInfo(Symbol(),MODE_MINLOT);   相关信息
//MarketInfo(Symbol(),MODE_MAXLOT);
//MarketInfo(Symbol(),MODE_LOTSTEP);
lot=NormalizeDouble(MaximumRisk * AccountBalance()/AccountLeverage(),1);   //开仓量计算
if(lot<0.1) lot=0.1;
if(lot>maxLots) lot=maxLots;
return(lot);
}

//平仓持有的买单
void CloseBuy()
{
if (OrdersTotal( ) > 0 )   
{
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)   break;
if(OrderType()==OP_BUY)
{
    OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
    Sleep(5000);
}
}
}
}
//平仓持有的卖单
void CloseSell()
{
if (OrdersTotal( ) > 0 )   
{
for(i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)   break;
if(OrderType()==OP_SELL)
    {
    OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
    Sleep(5000);
    }
}
}
}
//判断是否买或卖或平仓
int buyorsell()   //在这个函数计算设置你的交易信号这里使用MACD 和MA 做例子
{
double MacdCurrent, MacdPrevious, SignalCurrent;
double SignalPrevious, MaCurrent, MaPrevious;
MacdCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,0);
MacdPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,1);
SignalCurrent=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);
SignalPrevious=iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);
MaCurrent=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,0);
MaPrevious=iMA(NULL,0,MATrendPeriod,0,MODE_EMA,PRICE_CLOSE,1);
if(MacdCurrent<0 && MacdCurrent>SignalCurrent && MacdPrevious<SignalPrevious
    && MaCurrent>MaPrevious)
return (1); // 买 Ma在上升,Macd在0线上,并且两线上交叉
if(MacdCurrent>0 && MacdCurrent<SignalCurrent && MacdPrevious>SignalPrevious
    && MaCurrent<MaPrevious)
return (-1); // 卖
return (0); //不交易
}
int nowbuyorsell = 0;
void CheckForOpen()
{
if (Time == lasttime ) return; //每时间周期检查一次时间控制
lasttime = Time;
nowbuyorsell = buyorsell(); //获取买卖信号

if (nowbuyorsell == 1) //买 先结束已卖的
CloseSell();
if (nowbuyorsell == -1) //卖 先结束已买的
    CloseBuy();
if (TimeDayOfWeek(CurTime()) == 1)
{
if (TimeHour(CurTime()) < 3 ) return; //周一早8点前不做 具体决定于你的时区和服务器的时区时间控制
}
if (TimeDayOfWeek(CurTime()) == 5)
{
if (TimeHour(CurTime()) > 19 ) return; //周五晚11点后不做
}

if (OrdersTotal( ) >= maxOpen) return ;   
//如果已持有开仓次数达到最大,不做
if (nowbuyorsell==0) return;   //不交易
TradeOK();   //去下单交易
}
void TradeOK()   //去下单交易
{
int error ;
if (nowbuyorsell == 1) //买
{
    switch (whichmethod)
    {
    case 1:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);break;
    case 2:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,0,"",MAGICMA,0,Blue); break;
    case 3:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,Ask+TakeProfit*Point,"",MAGICMA,0,Blue);break;
    case 4:   res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",MAGICMA,0,Blue);break;
    default : res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);break;
    }
    if (res <=0)
    {
    error=GetLastError();
    if(error==134)Print("Received 134 Error after OrderSend() !! ");         // not enough money
    if(error==135) RefreshRates();   // prices have changed
    }
    Sleep(5000);
    return ;   
}
if (nowbuyorsell == -1) //卖
{
    switch (whichmethod)
    {
    case 1:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); break;
    case 2:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,0,"",MAGICMA,0,Red); break;
    case 3:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,Bid-TakeProfit*Point,"",MAGICMA,0,Red); break;
    case 4:   res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",MAGICMA,0,Red); break;
    default : res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red); break;
    }
    if (res <=0)
    {
    error=GetLastError();
    if(error==134) Print("Received 134 Error after OrderSend() !! ");         // not enough money
    if(error==135) RefreshRates();   // prices have changed
    }
    Sleep(5000);
    return ;   
}
}
void CTP()   //跟踪止赢
{
bool bs = false;
for (int i = 0; i < OrdersTotal(); i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)   break;
if (OrderType() == OP_BUY)
{
    if ((Bid - OrderOpenPrice()) > (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)))    //开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置
    {
    if (OrderStopLoss() < Bid - TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT))
    {
      bs = OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Green);
    }
    }
}
else if (OrderType() == OP_SELL)
{
    if ((OrderOpenPrice() - Ask) > (TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)))//开仓价格 当前止损和当前价格比较判断是否要修改跟踪止赢设置

    {
    if ((OrderStopLoss()) > (Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT)))
    {   
      bs = OrderModify(OrderTicket(), OrderOpenPrice(),
      Ask + TrailingStop * MarketInfo(OrderSymbol(), MODE_POINT), OrderTakeProfit(),0, Tan);
}
    }
}
}
}
Conclusion 结论
本例 介绍了自动交易系统程序文件的基本构成, 略加修改就可以用于建立你自己系统.
比如根据你的下单策略修改buyorSell()函数.

[ 本帖最后由 yaooay 于 2008-7-2 00:54 编辑 ]

cupid_venus 发表于 2008-7-2 15:43:20

呵呵,得研究研究
页: [1]
查看完整版本: MQ4编程手册