诚信为本
量力而为
当前位置:峰汇在线 ea编程知识 正文

mt4EA编程中的开平仓语句

在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编程中,是不可能这么简单的,通常会涉及到很多种条件的选择及限制,还是需要根据具体的策略来灵活应对。

版权所有转载请注明标题及链接:峰汇在线 » mt4EA编程中的开平仓语句