乐于分享
好东西不私藏

最简单的双品种基差套利 EA源码分享

最简单的双品种基差套利 EA源码分享
今天周三了,按惯例,上EA,
这是一款5年前做得EA了,是基于双品种套利用的,默认原油两品种 XBRUSD(布油)、XTIUSD(美油),利用两者价差偏离阈值开对冲组合,价差回归自动平仓,属于配对交易套利逻辑!
优点和缺点就不仔细的说了,因为很简单,是属于最简单的那种套利玩法,我个人感觉很一般哈,所以要注明一下,这个是源码,原则上只能跑模拟盘,盈亏我们当然不负责,都是分享,如果你又兴趣,可以下载去玩玩。不懂编译的,找老狼我要源码文件:waihuipai
源码:
#property link      "狼人EA"#property version   "1.2"#property strict//+------------------------------------------------------------------+//| Expert initialization function                                   |//+------------------------------------------------------------------+input string     注释="";enum enDir{   做多,   做空,};//input string 开始工作时间="00:00:00";//input string 结束工作时间="24:00:00";input int     Magic=072788;input string atten="注意:把价格大的作为品种1,反之为品种2";input string 品种1="XBRUSD"//品种1符号input string 品种2="XTIUSD"//品种2符号input double 下单手数=1;input double 基差大于多少下单=3;input enDir 基差放大时品种1做单方向=做空;input enDir 基差放大时品种2做单方向=做多;input double 基差放大后小于多少平仓=2;input double 基差小于多少下单=2;input enDir 基差缩小时品种1做单方向=做多;input enDir 基差缩小时品种2做单方向=做空;input double 基差缩小后大于多少平仓=2;intOnInit()  {//---      return(INIT_SUCCEEDED);  }//+------------------------------------------------------------------+//| Expert deinitialization function                                 |//+------------------------------------------------------------------+voidOnDeinit(constint reason)  {//---  }//+------------------------------------------------------------------+//| Expert tick function                                             |//+------------------------------------------------------------------+intgetSumOrders(string comm){ int orders = 0; for(int i=OrdersTotal()-1;i>=0;i--) {  if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))   {    if (OrderMagicNumber()!=Magic)    {      continue;    }   if(StringFind(OrderComment(),comm)>=0)   {      orders+=1;   }   }   else   {      orders = 0;      i=OrdersTotal()-1;   } } return orders;}boolcheckSignal(int type){   static datetime tradeDt = 0;   int ret=0;   double lot;   double ask1,bid1;   double Bid1=iClose(品种1,0,0);   double Bid2=iClose(品种2,0,0);   if (Bid1<=0)   {      printf("获取品种1价格错误:%s",品种1);        return false;   }   if (Bid2<=0)   {      printf("获取品种2价格错误:%s",品种2);        return false;   }   if (tradeDt != iTime(NULL,0,0))   {          double curDiff = MathAbs(Bid1-Bid2);      if (type == 1 && curDiff>=基差大于多少下单)      {         if (基差放大时品种1做单方向==做空)         {            bid1 = MarketInfo(品种1,MODE_BID);            lot = 下单手数;            if((ret=OrderSend(品种1,OP_SELL,lot,bid1,5,0,0,"基差放大*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)            {               Print(品种1+"卖空OpenErr:",GetLastError()," bid=",bid1," lot=",lot);            }         }          if (基差放大时品种1做单方向==做多)         {            ask1 = MarketInfo(品种1,MODE_ASK);            lot = 下单手数;            if((ret=OrderSend(品种1,OP_BUY,lot,ask1,5,0,0,"基差放大*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)            {               Print(品种1+"买多OpenErr:",GetLastError()," ask1=",ask1," lot=",lot);            }         }            if (ret>=0)         {            while(true)            {               if (基差放大时品种2做单方向==做空)               {                  double bid2 = MarketInfo(品种2,MODE_BID);                  lot = 下单手数;                  if((ret=OrderSend(品种2,OP_SELL,lot,bid2,5,0,0,"基差放大*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)                  {                     Print(品种2+"卖空OpenErr:",GetLastError()," bid=",bid2," lot=",lot);                  }                  else                  {                     tradeDt = iTime(NULL,0,0);                     break;                  }               }                if (基差放大时品种2做单方向==做多)               {                  double ask2 = MarketInfo(品种1,MODE_ASK);                  lot = 下单手数;                  if((ret=OrderSend(品种2,OP_BUY,lot,ask2,5,0,0,"基差放大*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)                  {                     Print(品种2+"买多OpenErr:",GetLastError()," ask1=",ask1," lot=",lot);                  }                  else                  {                     tradeDt = iTime(NULL,0,0);                     break;                  }               }            }         }      }         if (type == 2 && curDiff<=基差小于多少下单)      {         if (基差缩小时品种1做单方向==做空)         {            bid1 = MarketInfo(品种1,MODE_BID);            lot = 下单手数;            if((ret=OrderSend(品种1,OP_SELL,lot,bid1,5,0,0,"基差缩小*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)            {               Print(品种1+"卖空OpenErr:",GetLastError()," bid=",bid1," lot=",lot);            }         }          if (基差缩小时品种1做单方向==做多)         {            ask1 = MarketInfo(品种1,MODE_ASK);            lot = 下单手数;            if((ret=OrderSend(品种1,OP_BUY,lot,ask1,5,0,0,"基差缩小*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)            {               Print(品种1+"买多OpenErr:",GetLastError()," ask1=",ask1," lot=",lot);            }         }            if (ret>=0)         {            while(true)            {               if (基差缩小时品种2做单方向==做空)               {                  double bid2 = MarketInfo(品种2,MODE_BID);                  lot = 下单手数;                  if((ret=OrderSend(品种2,OP_SELL,lot,bid2,5,0,0,"基差缩小*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)                  {                     Print(品种2+"卖空OpenErr:",GetLastError()," bid=",bid2," lot=",lot);                  }                  else                  {                     tradeDt = iTime(NULL,0,0);                     break;                  }               }                if (基差缩小时品种2做单方向==做多)               {                  double ask2 = MarketInfo(品种1,MODE_ASK);                  lot = 下单手数;                  if((ret=OrderSend(品种2,OP_BUY,lot,ask2,5,0,0,"基差缩小*"+DoubleToStr(curDiff,2),Magic,0,clrRed))<0)                  {                     Print(品种2+"买多OpenErr:",GetLastError()," ask1=",ask1," lot=",lot);                  }                  else                  {                     tradeDt = iTime(NULL,0,0);                     break;                  }               }            }         }      }   }   return true;}voidOnTick() {int orderCnt=0;   CheckToClose();   if (!isWorkTime())   {      return;   }   orderCnt = getSumOrders("基差放大");   if (orderCnt == 0)   {      checkSignal(1);   }   orderCnt = getSumOrders("基差缩小");   if (orderCnt == 0)   {      checkSignal(2);   } }boolisWorkTime(){   return true;   datetime refDT;   refDT = TimeCurrent();   datetime start = StrToTime(TimeToStr(refDT, TIME_DATE)+" "+开始工作时间);   datetime end = StrToTime(TimeToStr(refDT, TIME_DATE)+" "+结束工作时间);    if (start>end)    {        if (refDT>=start || refDT<=end)        {            return true;        }    }    if (start<end)    {        //Print("start:=",TimeToStr(start,TIME_DATE|TIME_MINUTES|TIME_SECONDS),"end=",TimeToStr(end),"curr=",TimeToStr(TimeCurrent()));        if (refDT>=start && refDT<=end)        {            return true;        }    }   return false;}voidCheckToClose(){         double Bid1=iClose(品种1,0,0);   double Bid2=iClose(品种2,0,0);   if (Bid1<=0)   {      printf("获取品种1价格错误:%s",品种1);        return ;   }   if (Bid2<=0)   {      printf("获取品种2价格错误:%s",品种2);        return ;   }   for(int i=0;i<OrdersTotal(); i++)     {      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))      {          if (OrderMagicNumber()!=Magic) continue;            if (StringFind(OrderComment(),"基差放大")>=0)          {              double curDiff = MathAbs(Bid1-Bid2);            if (curDiff<=基差放大后小于多少平仓)            {               printf("基差放大后小于多少平仓");               closeByPartComm("基差放大");            }          }          if (StringFind(OrderComment(),"基差缩小")>=0)          {              double curDiff = MathAbs(Bid1-Bid2);            if (curDiff>=基差缩小后大于多少平仓)            {               printf("基差缩小后大于多少平仓");               closeByPartComm("基差缩小");            }          }      }     } }doubleGetSumProfit(int type){   double sumprofit=0;   for(int i=0;i<OrdersTotal(); i++)     {      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))      {          if (OrderMagicNumber()!=Magic) continue;            if (OrderType()==type || type == 2)          {                sumprofit+=(OrderProfit()+OrderCommission()+OrderSwap());              //sumprofit+=(OrderProfit());          }       }      else      {         i=0;         sumprofit = 0;      }     }   return(sumprofit);}voidAllClose(int type=2) {   //printf("Close all:%s",TimeToStr(Time[0]));   while(true)   {      for(int i=OrdersTotal()-1;i>=0;i--)       {        if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))         {          if (OrderMagicNumber() == Magic)          {              if ((type<=1 && OrderType()==type) || type == 2)              {              if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),30,clrGreen))               {                {                  Print("close erro:"GetLastError());                  //i=OrdersTotal()-1;                }               }              }              else              {               if (!OrderDelete(OrderTicket()))               {                  {                     Print("delete erro:"GetLastError());                     //i=OrdersTotal()-1;                  }               }              }           }         }         else         {            i=OrdersTotal()-1;            continue;         }       }       break;      } }voidcloseByComm(string comm){   for(int i=0;i<OrdersTotal();i++)   {      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))      {         if (OrderMagicNumber() == Magic)         {            if (OrderComment() == comm)            {               if (!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5))               {                  printf("[%d]close error:%d",__LINE__,GetLastError());               }               i=0;            }         }      }      else      {         i=0;      }   }}voidcloseByPartComm(string comm){   for(int i=0;i<OrdersTotal();i++)   {      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))      {         if (OrderMagicNumber() == Magic)         {            if (StringFind(OrderComment(),comm)>=0)            {               if (!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5))               {                  printf("[%d]close error:%d",__LINE__,GetLastError());               }               i=0;            }         }      }      else      {         i=0;      }   }}