#property link " "
#property version "1.00"
#property strict
//+------------------------------------------------------------------
//| @重要:本程序本人已不使用,仅限用于帮助研究网格交易和MQL4代码, |
// 如果使用该程序,赢了是您的,亏了也是您的 |
//+------------------------------------------------------------------
extern float _volume;//网格仓位
extern float _step;//网格步长(格子密度)
extern float _limit_high;//网格上限
extern float _limit_low;//网格下限
extern int _interval=60;//自动化交易,每XX秒检查一次网格
struct TicketInfo
{
int op;
float price;
int ticketid;
};
//+------------------------------------------------------------------+
//| define variables |
//+------------------------------------------------------------------+
float InitPriceList[];
TicketInfo BuyOrders[],SellOrders[],OpenBuyNow[],OpenSellNow[];
static TicketInfo OpenBuyPre[],OpenSellPre[];
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(_interval);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
datetime begin,end;
begin=TimeCurrent();
//+------------------------------------------------------------------+
//| (1)根据输入的价格区间和密度,生成要下单的价格 |
//+------------------------------------------------------------------+
GetInitPriceList(InitPriceList,_limit_high,_limit_low,_step);
//+------------------------------------------------------------------+
//| (2)获取当前已下单的价格 |
//+------------------------------------------------------------------+
GetOrders(BuyOrders,SellOrders);
Alert("init price begin");
for(int i=0;i Alert(InitPriceList[i]); } Alert("buy begin"); for(int i=0;i Alert(BuyOrders[i].price); } Alert("sell begin"); for(int i=0;i Alert(SellOrders[i].price); } //+------------------------------------------------------------------+ //| (3)根据(1),检查(2)中应下单但没下单的,下单 | //+------------------------------------------------------------------+ CheckSendOrder(InitPriceList,BuyOrders,SellOrders); //+------------------------------------------------------------------+ //| 附1:该部分不属于网格,是为了每次开仓、平仓能收到邮件提醒,设置成| //qq邮件,短信也能收到提醒q邮件,微信也能收到提醒 | //+------------------------------------------------------------------+ GetPureOrders(OpenBuyNow,BuyOrders,OP_BUY); GetPureOrders(OpenSellNow,SellOrders,OP_SELL); //+------------------------------------------------------------------+ //| get the difference and send mail | //+------------------------------------------------------------------+ CheckSendMail(OpenBuyPre,OpenBuyNow); CheckSendMail(OpenSellPre,OpenSellNow); end=TimeCurrent(); Alert("time1:"+begin+"end:"+end); } //+------------------------------------------------------------------+ void GetOrders(TicketInfo &_BuyOrders[],TicketInfo &_SellOrders[]) { ArrayFree(_BuyOrders); ArrayFree(_SellOrders); for(int i=0;i if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol()==Symbol() &&(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP))// { ArrayResize(_BuyOrders,ArraySize(_BuyOrders)+1,ArraySize(_BuyOrders)); _BuyOrders[ArraySize(_BuyOrders)-1].op=OrderType(); _BuyOrders[ArraySize(_BuyOrders)-1].ticketid=OrderTicket(); _BuyOrders[ArraySize(_BuyOrders)-1].price=OrderComment(); } if(OrderSymbol()==Symbol() && (OrderType()==OP_SELL || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP))// { ArrayResize(_SellOrders,ArraySize(_SellOrders)+1,ArraySize(_SellOrders)); _SellOrders[ArraySize(_SellOrders)-1].op=OrderType(); _SellOrders[ArraySize(_SellOrders)-1].ticketid=OrderTicket(); _SellOrders[ArraySize(_SellOrders)-1].price=OrderComment(); } } } } //+------------------------------------------------------------------+ void GetInitPriceList(float &_InitPriceList[],float _fHigh,float _fLow,float _fStep) { ArrayFree(_InitPriceList); if(_fHigh<0 || _fLow<0 || _fStep <0) { Alert("input para error"); }else { int iCount=(int)((_fHigh-_fLow)/_fStep) +1; //Alert("high:"+_fHigh); //Alert("low:"+_fLow); //Alert("step:"+_fStep); ArrayResize(_InitPriceList,iCount); for(int i=0;i _InitPriceList[i]=_fLow+i*_fStep; } } } void CheckSendOrder(float &_InitPriceList[],TicketInfo &_BuyOrders[],TicketInfo &_SellOrders[]) { for(int i=0;i if(!FindPrice(_InitPriceList[i],_BuyOrders)) { int ticket1=OrderSend(Symbol(),OP_BUYLIMIT,_volume,_InitPriceList[i],0,0,_InitPriceList[i]+_step,_InitPriceList[i],0,0,clrNONE); int ticket2=OrderSend(Symbol(),OP_BUYSTOP,_volume,_InitPriceList[i],0,0,_InitPriceList[i]+_step,_InitPriceList[i],0,0,clrNONE); } if(!FindPrice(_InitPriceList[i],_SellOrders)) { int ticket3=OrderSend(Symbol(),OP_SELLLIMIT,_volume,_InitPriceList[i],0,0,_InitPriceList[i]-_step,_InitPriceList[i],0,0,clrNONE); int ticket4=OrderSend(Symbol(),OP_SELLSTOP,_volume,_InitPriceList[i],0,0,_InitPriceList[i]-_step,_InitPriceList[i],0,0,clrNONE); } } Alert("Error:"+GetLastError()); } bool FindPrice(float _Price,TicketInfo &_Orders[]) { bool bFound=false; for(int i=0;i if(_Orders[i].price==_Price) { bFound=true; break; } } Alert("found:"+bFound); return bFound; } bool FindTicket(int _Ticket,TicketInfo &_Orders[]) { bool bFound=false; for(int i=0;i if(_Orders[i].ticketid==_Ticket) { bFound=true; break; } } return bFound; } void GetPureOrders(TicketInfo &_PureOrders[],TicketInfo &_MixOrders[],int _OP) { ArrayFree(_PureOrders); for(int i=0;i if(_MixOrders[i].op==_OP) { ArrayResize(_PureOrders,ArraySize(_PureOrders)+1,ArraySize(_PureOrders)); _PureOrders[ArraySize(_PureOrders)-1].price=_MixOrders[i].price;//price _PureOrders[ArraySize(_PureOrde rs)-1].ticketid=_MixOrders[i].ticketid;//price } } } void CheckSendMail(TicketInfo &_OrdersPre[],TicketInfo &_OrdersNow[]) { for(int i=0;i if(!FindTicket(_OrdersPre[i].ticketid ,_OrdersNow))//原有,新没有,close { if(OrderSelect(_OrdersPre[i].ticketid,SELECT_BY_TICKET,MODE_HISTORY)) { string sSubject=StringConcatenate(Symbol()," Closed