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

ea编程中多货币对交易的开仓函数

有很多策略需要在一个EA中进行多货币对交易,如著名的黄金甲五币联动EA就是一个EA交易五个货币对。

不管是单一货币对交易还是多货币对交易策略的EA,其运行核心都是依照某种条件开仓并按照某种规则止损止盈或平仓。我们这里且不讨论它的开仓条件,也不研究它怎么平仓,我们主要来研究下开仓的编程技巧。

用mql4语言编写一个EA,不管是复杂的多货币对还是单一品种,它的开仓都是用 OrderSend 函数,我们就先看下 OrderSend 函数的几个参量:

OrderSend(货币名称,开仓类型,手数,价格,偏差,止损,止盈,注释,订单识别码,有效期(挂单),标记颜色)

上面是用中文标注了OrderSend 函数的所用参量,如果单一品种,直接填充好所有参量调用就可以,这里也不用多说。

而对于多货币对开仓,由于不同货币对的名称、买卖价格、点是不同的,所以我们可以先将不同的地方单独构造成函数以便调用。

获取货币对的多单开仓价格Ask函数:

double SymAsk(string sym)
{
 return(SymbolInfoDouble(sym,SYMBOL_ASK));
}

获取货币对的空单开仓价格Bid函数:

double SymBid(string sym)
{
 return(SymbolInfoDouble(sym,SYMBOL_BID));
}

获取货币对点的函数:

double SymPoint(string sym)
{
 return(SymbolInfoDouble(sym,SYMBOL_POINT));
} 

接下来,就要结合上面几个函数构造多个货币对通用的开仓 OrderSend 函数,为了便于说明,我们可以假设它们利用相同的手数、止损止盈点数、订单识别码来开仓,当然,如果实际策略中不同货币对需要采用不同的参数,那么再将它们在演变成变量即可。下面定义共用变量:

input double  Lots         = 0.01;//开仓手术

input int     StopLoss     = 1000;//止损点数
input int     TakeProfit   = 3000;//止盈点数 
input int     Magic        = 138999;//订单识别码
int    slippage = 10;//偏差

现在就可以构造多货币对开仓的 OrderSend 函数了。

多货币对通用开多单函数:

 void OpenBuyTk(string sym)
{ 

   if(!OrderSend(sym,OP_BUY,Lots,SymAsk(sym),slippage,SymAsk(sym)-StopLoss*SymPoint(sym),SymAsk(sym)+TakeProfit*SymPoint(sym),"Buy_"+sym,Magic,0,CLR_NONE))
    {
     Print("OrderSend BUY Error #",GetLastError());
    }  
} 

多货币对通用开空单函数:

 void OpenSellTk(string sym)
{ 
 if(!OrderSend(sym,OP_SELL,Lots,SymBid(sym),slippage,SymBid(sym)+StopLoss*SymPoint(sym),SymBid(sym)-TakeProfit*SymPoint(sym),"Sell_"+sym,Amagic,0,CLR_NONE))
   {
     Print("OrderSend SELL Error #",GetLastError());
   }   
} 

函数构造好了,下面就可以直接调用了,比如欧元兑美元开多单条件满足就可以执行:

if(......){OpenBuyTk("EURUSD");}

其它货币对或者开空单调用方法也是同理。

当然,本文也只是简单粗糙的举例说明一种思路,实际编程开发中的具体情况可能是多种多样的,那还是需要具体策略具体对待,比如不同的货币对所采用的止损止盈点数是不同的,那就需要将止损止盈也演变成OpenBuyTk/OpenSellTk函数的变量。又或者说,多货币对交易中的一些不同变量在不需要作为输入变量的时候,也可以考虑用数组来定义,有些时候用数组结合for循环能大幅度简化编程工作。

多货币对交易的EA,也是很多的,外汇EA编程网就有开发这方面的示例,可以参考看看的。

版权所有转载请注明标题及链接:峰汇在线 » ea编程中多货币对交易的开仓函数