MT4网格交易法

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#property copyright ""
#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 ",OrderType()," @",OrderClosePrice()," by Ticket:",OrderTicket());
Alert(sSubject);
SendMail(sSubject,"");
}
}
}

for(int i=0;i{
if(!FindTicket(_OrdersNow[i].ticketid,_OrdersPre))//新有,原没有,open
{
if(OrderSelect(_OrdersNow[i].ticketid,SELECT_BY_TICKET,MODE_TRADES))
{
string sSubject=StringConcatenate(Symbol()," Opened ",OrderType()," @",OrderOpenPrice()," by Ticket:",OrderTicket());
Alert(sSubject);
SendMail(sSubject,"");
}
}
}
//把now 赋值为 pre
ArrayFree(_OrdersPre);
ArrayCopy(_OrdersPre,_OrdersNow,0,0,WHOLE_ARRAY);

}

相关文档
最新文档