我写了一个交易黄金辅助的平仓修改止损的小EA,在测试的时候功能都正常,但是挂到实盘运行的时候,修改止损能够运行,但是部分平仓的功能无法实现,不能平仓。希望指点。
具体思路如下:1:检测如果有开仓订单且没有设定止损价格,那么立刻设置一个止损 2:当盈利到一定点数之后,平仓掉部分仓位(这步骤不能平仓) 3:盈利到一定点数的时候把订单止损价格修改到开仓价格。4:再盈利到一定点数后再平仓一部分订单。
void OnTick()
{
/* if(jy.danshu(货币,POSITION_TYPE_BUY,0)==0)
{
jy.buyplus(货币,0.05,0,0,IntegerToString(0),0);
}
if(jy.danshu(货币,POSITION_TYPE_SELL,0)==0)
{
jy.sellplus(货币,0.05,0,0,IntegerToString(0),0);
}*/
kaimodifysltp(货币,POSITION_TYPE_BUY,检测手数1,入场止损点数,0,0);
kaimodifysltp(货币,POSITION_TYPE_SELL,检测手数1,入场止损点数,0,0);
closeallbuylot(货币,检测手数1,平仓手数1,盈利点数1,0);
closeallselllot(货币,检测手数1,平仓手数1,盈利点数1,0);
modifysltp(货币,POSITION_TYPE_BUY,检测手数2,盈利点数2,0,0);
modifysltp(货币,POSITION_TYPE_SELL,检测手数2,盈利点数2,0,0);
}
void closeallbuylot(string symbol,double lot,double pinglot,double mm,int magic=0)
{
int t=PositionsTotal();
for(int i=t-1;i>=0;i--)
{
if(PositionGetTicket(i)>0)
{
if(PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY && PositionGetDouble(POSITION_VOLUME)==lot
&& sj.getbid(symbol)-PositionGetDouble(POSITION_PRICE_OPEN)>=mm)
{
if(magic==0)
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action =TRADE_ACTION_DEAL; // 交易操作类型
request.symbol =symbol; // 交易品种
request.volume =pinglot; // 0.1手交易量
request.type =ORDER_TYPE_SELL; // 订单类型
request.price =SymbolInfoDouble(symbol,SYMBOL_BID); // 持仓价格
request.type_filling=ORDER_FILLING_IOC;
request.deviation=1000; // 允许价格偏差
request.position =PositionGetTicket(i);
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // 如果不能发送请求,输出错误
}
else
{
if(PositionGetInteger(POSITION_MAGIC)==magic)
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action =TRADE_ACTION_DEAL; // 交易操作类型
request.symbol =symbol; // 交易品种
request.volume =pinglot; // 0.1手交易量
request.type =ORDER_TYPE_SELL; // 订单类型
request.price =SymbolInfoDouble(symbol,SYMBOL_BID); // 持仓价格
request.deviation=100; // 允许价格偏差
request.type_filling=ORDER_FILLING_IOC;
request.position =PositionGetTicket(i);
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // 如果不能发送请求,输出错误
}
}
}
}
}
}
void closeallselllot(string symbol,double lot,double pinglot,double mm,int magic=0)
{
int t=PositionsTotal();
for(int i=t-1;i>=0;i--)
{
if(PositionGetTicket(i)>0)
{
if(PositionGetString(POSITION_SYMBOL)==symbol && PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL && PositionGetDouble(POSITION_VOLUME)==lot
&& PositionGetDouble(POSITION_PRICE_OPEN)-sj.getask(symbol)>=mm)
{
if(magic==0)
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action =TRADE_ACTION_DEAL; // 交易操作类型
request.symbol =symbol; // 交易品种
request.volume =pinglot; // 0.1手交易量
request.type =ORDER_TYPE_BUY; // 订单类型
request.price =SymbolInfoDouble(symbol,SYMBOL_ASK); // 持仓价格
request.deviation=1000; // 允许价格偏差
request.type_filling=ORDER_FILLING_IOC;
request.position =PositionGetTicket(i);
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // 如果不能发送请求,输出错误
}
else
{
if(PositionGetInteger(POSITION_MAGIC)==magic)
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action =TRADE_ACTION_DEAL; // 交易操作类型
request.symbol =symbol; // 交易品种
request.volume =pinglot; // 0.1手交易量
request.type =ORDER_TYPE_BUY; // 订单类型
request.price =SymbolInfoDouble(symbol,SYMBOL_ASK); // 持仓价格
request.deviation=100; // 允许价格偏差
request.type_filling=ORDER_FILLING_IOC;
request.position =PositionGetTicket(i);
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
}
}
}
}
void modifysltp(string symbol,ENUM_POSITION_TYPE type,double lot,double sl,double tp,int magic=0)
{
int t=PositionsTotal();
for(int i=t-1;i>=0;i--)
{
if(PositionGetTicket(i)>0)
{
if(PositionGetString(POSITION_SYMBOL)==symbol)
{
if(type==POSITION_TYPE_BUY && PositionGetDouble(POSITION_VOLUME)==lot && sj.getbid(symbol)-PositionGetDouble(POSITION_PRICE_OPEN)>=sl)
{
if(magic==0)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
else
{
if(PositionGetInteger(POSITION_MAGIC)==magic)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
}
}
if(type==POSITION_TYPE_SELL && PositionGetDouble(POSITION_VOLUME)==lot && PositionGetDouble(POSITION_PRICE_OPEN)-sj.getask(symbol)>=sl)
{
if(magic==0)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
else
{
if(PositionGetInteger(POSITION_MAGIC)==magic)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
}
}
}
}
}
}
void kaimodifysltp(string symbol,ENUM_POSITION_TYPE type,double lot ,double sl,double tp,int magic=0)
{
int t=PositionsTotal();
for(int i=t-1;i>=0;i--)
{
if(PositionGetTicket(i)>0)
{
if(PositionGetString(POSITION_SYMBOL)==symbol && PositionGetDouble(POSITION_VOLUME)==lot && PositionGetDouble(POSITION_SL)==0)
{
if(type==POSITION_TYPE_BUY)
{
if(magic==0)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)-sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)-sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
else
{
if(PositionGetInteger(POSITION_MAGIC)==magic)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)-sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)-sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
}
}
if(type==POSITION_TYPE_SELL)
{
if(magic==0)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)+sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)+sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
else
{
if(PositionGetInteger(POSITION_MAGIC)==magic)
{
if((NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)+sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))||NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))!=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS))))
{
MqlTradeRequest request={1};
MqlTradeResult result={0};
request.action=TRADE_ACTION_SLTP;
request.position=PositionGetTicket(i);
request.symbol=symbol;
request.sl=NormalizeDouble(PositionGetDouble(POSITION_PRICE_OPEN)+sl,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
request.tp=NormalizeDouble(tp,(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(sl<0) request.sl=NormalizeDouble(PositionGetDouble(POSITION_SL),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(tp<0) request.tp=NormalizeDouble(PositionGetDouble(POSITION_TP),(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS));
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError());
}
}
}
}
}
}
}
}