我编写了一个开多单的代码,市场到我预设价格后,先检查有没有持仓,如果有就不开多单,如果没有就按照预设价格开多单。但执行之后问题出现——市场波动到预设价格后,程序就会开两次单,之后才打印出已经有持仓的提示。两次开单先后差几秒钟,应该是市场价格先后两次到达预设价格导致短时间内开两单。为什么第二次开单没有检测出有持仓了呢?难道是第二次价格出现得太快,导致第一次程序还没有把positiontotal()函数写进去?
void OnTick()
{
MqlTradeRequest request={};
MqlTradeResult result={};
//int long_orderquantity=0;
//int short_orderquantity=0;
//开多单
if(SymbolInfoDouble(Symbol(),SYMBOL_ASK)==longprice)
{
//if(long_orderquantity==0)
if(PositionsTotal()==0)
{
ZeroMemory(request);
ZeroMemory(result);
request.action =TRADE_ACTION_PENDING; // 交易操作类型
request.position =0; // 关闭情况下的持仓单号
request.symbol =Symbol(); // 交易品种
request.volume =volume; // 交易量
request.type =ORDER_TYPE_BUY_STOP; // 订单类型
request.price =longprice; // 交易价格
request.stoplimit=longstoploss; //止损价格
request.deviation=10; // 可允许的价格偏差
request.magic =EXPERT_MAGIC; // 订单幻数
//--- 发送请求
if(!OrderSend(request,result))
{
//--- 显示数据失败
PrintFormat("OrderSend %s %s %.2f at %.5f error %d",
request.symbol,EnumToString(request.type),volume,request.price,GetLastError());
}
//--- 通知成功操作
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
printf("开多单成功");
// long_orderquantity++;
}
else
{
ENUM_POSITION_TYPE type1=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
PrintFormat("%s had been open.",EnumToString(type1));
}
}
}
MT4跟MT5是不一样的,T5要繁琐多了。你这个很明显不只是开两张的问题,你的持仓检测跟订单执行本身就不合理。我相信专业点的人一眼就看出来。
你这个是挂单不是市价单,有可能挂单会不会还没有成交,因此你positionsTotal()还是0,所以程序继续开挂单
我编写了一个开多单的代码,市场到我预设价格后,先检查有没有持仓,如果有就不开多单,如果没有就按照预设价格开多单。但执行之后问题出现——市场波动到预设价格后,程序就会开两次单,之后才打印出已经有持仓的提示。两次开单先后差几秒钟,应该是市场价格先后两次到达预设价格导致短时间内开两单。为什么第二次开单没有检测出有持仓了呢?难道是第二次价格出现得太快,导致第一次程序还没有把positiontotal()函数写进去?
void OnTick()
{
MqlTradeRequest request={};
MqlTradeResult result={};
//int long_orderquantity=0;
//int short_orderquantity=0;
//开多单
if(SymbolInfoDouble(Symbol(),SYMBOL_ASK)==longprice)
{
//if(long_orderquantity==0)
if(PositionsTotal()==0)
{
ZeroMemory(request);
ZeroMemory(result);
request.action =TRADE_ACTION_PENDING; // 交易操作类型
request.position =0; // 关闭情况下的持仓单号
request.symbol =Symbol(); // 交易品种
request.volume =volume; // 交易量
request.type =ORDER_TYPE_BUY_STOP; // 订单类型
request.price =longprice; // 交易价格
request.stoplimit=longstoploss; //止损价格
request.deviation=10; // 可允许的价格偏差
request.magic =EXPERT_MAGIC; // 订单幻数
//--- 发送请求
if(!OrderSend(request,result))
{
//--- 显示数据失败
PrintFormat("OrderSend %s %s %.2f at %.5f error %d",
request.symbol,EnumToString(request.type),volume,request.price,GetLastError());
}
//--- 通知成功操作
PrintFormat("retcode=%u deal=%I64u order=%I64u",result.retcode,result.deal,result.order);
printf("开多单成功");
// long_orderquantity++;
}
else
{
ENUM_POSITION_TYPE type1=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
PrintFormat("%s had been open.",EnumToString(type1));
}
}
}