在mt4平台上要编写一个自动交易的ea,那其最基本的策略思路就是根据某种条件开仓。这就涉及到两个概念:一个条件,一个开仓。条件是根据不同的交易策略思路而定的,可以比较K线阴阳作为开仓条件,也可以将均线金叉死叉作为开仓条件,等等,也可以说开仓条件是千万种的。而开仓就是执行开仓语句或者说开仓函数来开新订单。
在mql4语言中,开仓函数是OrderSend()函数,我们可以先看一下OrderSend()的结构:
int OrderSend(
string symbol, //货币名称
int cmd, // 订单类型
double volume, // 手数
double price, // 价格
int slippage, // 偏差
double stoploss, // 止损
double takeprofit, // 止盈
string comment=NULL, // 注释
int magic=0, // 订单识别码
datetime expiration=0, // 有效期(用于挂单)
color arrow_color=clrNONE // 颜色
);
在原则上,MQL4语言将OrderSend()函数归为int类型。实际执行当中我们用bool类型也是可以的。这里不讨论挂单,只以开现价单来说,如果要成功执行OrderSend()函数,那么就需要正确赋值其各个参量所需数值:
- 货币名称默认Symbol()为当前图表货币;
- 订单类型多单为OP_BUY,空单为OP_SELL;
- 手数我们可以定义ea输入变量:input double Lots = 0.03;
- 价格,开多单是Ask,开空单用Bid;
- 偏差我们也可以定义个ea输入变量:input int slippage = 10;
- 止损同样定义输入变量:input int StopLoss = 500;//止损点数
- 止盈和止损一样定义:input int TakeProfit = 1000;//止盈点数
- 注释可以根据需要定义,也可以留“”空值;
- 订单识别码可以定义:input int my_magic = 172583815;//订单识别码
- 有效期对于挂单有效,现价单用0值代替;
- 颜色,开仓点位图表上标记箭头颜色,根据需要设置,不需要就复制clrNONE;
每个参量的赋值弄好后,我们假设条件是阳线开多单,阴线开空单,那么下面就可以用OrderSend()开仓函数来执行开多单和空单了。代码如下:
//开多单
if(Close[0]>Open[0]
{
if(!OrderSend(Symbol(),OP_BUY,Lots,Ask,slippage,Ask-StopLoss*Point,Ask+TakeProfit*Point,"EA开多单",my_magic,0,clrRed))
{
Print("OrderSend BUY Error #",GetLastError());
}
}
//开空单
if(Close[0]<Open[0]
{
if(!OrderSend(Symbol(),OP_SELL,Lots,Bid,slippage,Bid+StopLoss*Point,Bid-TakeProfit*Point,"EA开空单",my_magic,0,clrLime))
{
Print("OrderSend SELL Error #",GetLastError());
}
}
跟随着图表中蜡烛阴阳的切换,就会执行上面两个语句来分别开多单和空单,在实际编写中,还是需要注意各个参量赋值的正确性。多空单的止损止盈赋值是有区别的,多单止损在下,止盈在上。空单则是止损在上,止盈在下。如果有的策略不需要止损或止盈,那还要单独将其数值演变成0。
当然,这仅仅的是开仓函数示范,它会跟着K线阴阳无穷尽开仓。所以实际编写中还需要进一步去限制开仓条件,比如说只开一单,那就可以定义,当持仓数量为0时符合开多条件再开多单,或者当持仓数量为0时符合开空单条件再开空单。
这种带上止损止盈数值的订单,通常是不需要再执行平仓的,顺其自然止损止盈好了。当然,也有些策略需要根据某种条件来执行平仓,比如上面的开仓例子中,可以用阳线平空单,阴线平多单。
在MQL4语言中,平仓是用OrderClose()函数,同样,我们可以先看下OrderClose()函数的结构:
bool OrderClose(
int ticket, // 订单编号
double lots, // 手数
double price, // 平仓价格
int slippage, // 偏差
color arrow_color // 平仓箭头颜色
);
由于平仓需要先获取持仓单信息,所以OrderClose()函数是无法跟开仓函数一样单独执行,为了便于调用的方便,我们可以自行创造一个void()平仓功能性函数,示例代码如下:
//以订单样式平仓的自定义平仓函数
void Clostk(int type)
{
for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)
{
if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)==true)
{
if(OrderSymbol()==Symbol() && OrderType() ==type && OrderMagicNumber()== my_magic)
{
if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),slippage,CLR_NONE))
{
Print("OrderClose Error #",GetLastError());
}
}
}
}
}
平仓函数造好了,后面就可以调用 Clostk(OP_BUY) 平多单,Clostk(OP_SELL)平空单。假设上面例子中,阳线平空单,阴线平多单,代码示范分别如下:
//阳线平空单
if(Close[1]>Open[1]){Clostk(OP_SELL);}
//阴线平多单
if(Close[1]<Open[1]){Clostk(OP_BUY);}
总结起来,mql4语言中的开仓是用OrderSend()语句,平仓是用OrderClose()语句,其最简单的用法如上面示例所示。在具体的外汇ea编程中,是不可能这么简单的,通常会涉及到很多种条件的选择及限制,还是需要根据具体的策略来灵活应对。