#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; } }}