锁仓EA策略源码解析与顺势加码应用指南
//+------------------------------------------------------------------+
//2006.12.20 V2.0 增加了对手动订单的主动止盈功能
//2007.01.03 V2.1 对于已经成交的对冲单,系统不能自动平仓或删除,需要手动平仓。
//2007.01.09 V2.2 系统自动生成对冲单后,如果手动订单设置了止盈,则取消该止盈设置。
#property copyright ""
#property link ""
#include
extern bool USE_ATR=true;
extern int PercentATR=40; //40% ATR
extern double HedgingLevel=30;
extern bool AutoTakeProfit=false;
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//----
Hedge_Assistante();
//----
return(0);
}
//+------------------------------------------------------------------+
void Hedge_Assistante()
{
int i,Tic,Ticket,Hedge,Type;
double TP;
string msg="/n"+"ATR(14)="+iATR(Symbol(),PERIOD_D1,14,0)+"/n"+"dHigh:"+iHigh(Symbol(),PERIOD_D1,0)+" dLow:"+
iLow(Symbol(),PERIOD_D1,0)+"/n"+"AtrHi:"+(iLow(Symbol(),PERIOD_D1,0)+iATR(Symbol(),PERIOD_D1,14,0))+
" AtrLo:"+(iHigh(Symbol(),PERIOD_D1,0)-iATR(Symbol(),PERIOD_D1,14,0));
Comment( msg,Red,10);
//1)仅对BUY/SELL手动订单进行止盈操作,BUY/SELL STOP和BUY/SELL LIMIT类型的订单不受影响。
//2)GBP/USD止盈设为17点,其他货币对止盈设为10点。
if(AutoTakeProfit)
{ for(i=0;i
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) continue;
if(Symbol()==OrderSymbol() && OrderMagicNumber()==0 && OrderProfit()!=0) //找到手动订单
{
if(Symbol()=="GBPUSD") TP=17; else TP=10; // GBPUSD止盈17点,其他货币对止盈10点
if(OrderType()==OP_BUY )
{
if (Bid-OrderOpenPrice()>=TP*Point)
{
if(OrderClose(OrderTicket(),OrderLots(),Bid,2,0)==true)
{Alert("交易成功!自动止盈@",Bid," ",OrderTicket()," ",OrderTakeProfit()," - ",OrderOpenPrice(),
" = ",OrderTakeProfit()-OrderOpenPrice()," X ",OrderLots()," = ",OrderProfit());
return(0);
}
else Alert(OrderTicket()," 平仓失败----",ErrorDescription(GetLastError()));
}
if (OrderTakeProfit()-OrderOpenPrice()<(TP-1)*Point || OrderTakeProfit()-OrderOpenPrice()>(TP+1)*Point)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice()+TP*Point,0,0)==true)
{Alert(OrderTicket()," ",Symbol()," 买入=",OrderOpenPrice()," 设置止盈@",OrderOpenPrice()+TP*Point);
Sleep(10000);
}
else Alert(OrderTicket()," ",Symbol()," 修改止盈失败----",ErrorDescription(GetLastError()));
}
}
if(OrderType()==OP_SELL)
{
if (OrderOpenPrice()-Ask>=TP*Point)
{
if(OrderClose(OrderTicket(),OrderLots(),Ask,2,0)==true)
{Alert("交易成功!自动止盈@",Ask," ",OrderTicket()," ",OrderOpenPrice()," - ",OrderTakeProfit(),
" = ",OrderOpenPrice()-OrderTakeProfit()," X ",OrderLots()," = ",OrderProfit());
return(0);
}
else Alert(OrderTicket()," ",Symbol()," 修改止盈失败----",ErrorDescription(GetLastError()));
}
if (OrderOpenPrice()-OrderTakeProfit()>(TP+1)*Point ||OrderOpenPrice()-OrderTakeProfit()<(TP-1)*Point)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderOpenPrice()-TP*Point,0,0)==true)
{Alert(OrderTicket()," ",Symbol()," 卖出=",OrderOpenPrice()," 设置止盈@",OrderOpenPrice()-TP*Point);
Sleep(10000);
}
else Alert(OrderTicket()," ",Symbol()," 修改止盈失败---- ",ErrorDescription(GetLastError()));
}
}
}
}
}
//-------------------------------------------------------------------------
if (USE_ATR) HedgingLevel=iATR(NULL,PERIOD_D1,14,0)*PercentATR/100;
else HedgingLevel=HedgingLevel*Point;
//检查所有手动订单,如果没有对应的对冲订单,则创建一个
for (i=0;i
{if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if(Symbol()==OrderSymbol() && OrderMagicNumber()==0 && OrderProfit()!=0/*已激活*/ ) //这是一个手动订单
{
Hedge=0;
Ticket=OrderTicket();
Type=OrderType();
double Lots=OrderLots(),OpenPrice=OrderOpenPrice();
for (in爱华官网t j=i;j
{if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break;
if (Ticket==OrderMagicNumber()) Hedge++;
}
if (Hedge==0) //没有对冲订单,则创建
{
if (Type==OP_BUY)
{
Tic=OrderSend(Symbol(),OP_SELLSTOP,Lots, NormalizeDouble(OpenPrice-HedgingLevel,Digits),0,0,0,"Hedging "+DoubleToStr(Ticket,0),Ticket,0,Green);
if( Tic<0) Alert(Ticket,"的对冲单生成失败,错误码:",GetLastError()); else Alert(Ticket,"的对冲单:",Tic," 生成 SELL STOP:",NormalizeDouble(OpenPrice-HedgingLevel,Digits)," ",Lots,"Lots");
}
if (Type==OP_SELL)
{
Tic=OrderSend(Symbol(),OP_BUYSTOP,Lots,NormalizeDouble(OpenPrice+HedgingLevel,Digits),0,0,0,"Hedging "+DoubleToStr(Ticket,0),Ticket,0,Red);
if( Tic<0) Alert(Ticket,"的对冲单生成失败,错误码:",GetLastError()); else Alert(Ticket,"的对冲单:",Tic," 生成 BUY STOP:",NormalizeDouble(OpenPrice+HedgingLevel,Digits)," ",Lots,"Lots");
}
}
}
}
//检查所有对冲订单,如果没有对应的手动订单,则删除对冲订单
for (i=0;i
{if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
if (Symbol()==OrderSymbol() && OrderMagicNumber() !=0) //这是一个对冲订单
{Hedge=0;
Ticket=OrderTicket();
int Magic=OrderMagicNumber();
for (j=0;j
{if (OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break;
if (Magic==OrderTicket()) Hedge++;//用对冲订单的魔术号与手动订单的票据号比较
}
if (Hedge==0 && OrderType()>1/*排除OP_BUY和OP_SELL*/ ) OrderDelete(Ticket);//无对应手动订单,删除对冲订单
}
}
//v2.2 对冲订单创建后,将手动订单的止盈设置为零
for (i=0;i
{
if(OrderSelect(i,SELECT_BY_POS)==false) continue;
if(Symbol()==OrderSymbol() && OrderMagicNumber()!=0 && OrderType()<2) //找到活跃对冲订单
{
Ticket=OrderMagicNumber();
if( OrderSelect(Ticket,SELECT_BY_TICKET)==false) break;
if( OrderTakeProfit()!=0)
if(OrderModify(Ticket,OrderOpenPrice(),0,0,0,0)) Alert(Ticket,"对冲单已生成,系统将止盈改为零,需要手动解锁!");
}
}
}
