mql4 - OrderClosePrice 返回与历史池不同的价格
问题描述
当使用 api 关闭(选定的)现有订单时,在那一刻我试图获得收盘价,有时(也许十分之一)返回的价格与我在历史池中看到的价格不同。
代码是这样的:
RefreshRates();
if(type == OP_BUY)
{
currentPrice = NormalizeDouble(MarketInfo(symbol, MODE_ASK), vdigits);
}
else if(type == OP_SELL)
{
currentPrice = NormalizeDouble(MarketInfo(symbol, MODE_BID), vdigits);
}
if (meetsRequirementsToClose(currentPrice))
{
desiredPrice = currentPrice;
// And then....
bool retVal = OrderClose(OrderTicket(), numLots, desiredPrice, currSlippage);
if (retVal)
{
this.reportClosePrice (myOrderId, OrderClosePrice(), desiredPrice, numLots, "closing");
return true;
}
}
该订单先前是使用池 MODE_TRADES 中的 SELECT_BY_POS 选择的。
有人知道如何解决吗?
编辑:
我们的经纪人有时会尊重要求的价格……有时不会。
不管我们必须更换经纪人以获得更可靠的经纪人这一事实,我们不能依赖所要求的价格。
我们看到的偏差大于一百个点,无论是比真实价格更好还是更差的价格。
解决方案
正如@TheLastStark 所建议的那样,在关闭之前通过其票证选择订单的问题已得到解决。
最终代码类似于:
RefreshRates();
if(type == OP_BUY)
{
currentPrice = NormalizeDouble(MarketInfo(symbol, MODE_ASK), vdigits);
}
else if(type == OP_SELL)
{
currentPrice = NormalizeDouble(MarketInfo(symbol, MODE_BID), vdigits);
}
if (meetsRequirementsToClose(currentPrice))
{
desiredPrice = currentPrice;
// And then....
int tickNum = OrderTicket();
bool retVal = OrderClose(OrderTicket(), numLots, desiredPrice, currSlippage);
if (retVal)
{
if (OrderSelect(tickNum,SELECT_BY_TICKET,MODE_HISTORY)== false)
{
//this.logger.error ("Error selecting the order");
this.reportClosePrice (myOrderId, -1, desiredPrice, numLots, "closing");
}
else
{
this.reportClosePrice (myOrderId, OrderClosePrice(), desiredPrice, numLots, "closing");
}
return true;
}
}
推荐阅读
- mysql - 如何在 MySQL 中按字母顺序排列行?
- reactjs - 更新服务器上的反应应用程序的过程
- ethereum - 将 methods.myMethod.call() 与 web3js 一起使用时出错
- image - GCP / 将磁盘映像导出到存储桶失败
- python - 您如何替换为 sympy 中的解决方案?
- generics - 如何使用迭代器项类型作为结构类型参数
- ios - 替换多维数组中的值
- sql - 如何在 postgreSQL 中使用时间间隔
- ruby-on-rails - 如何从 Rails 应用程序中的一系列电子邮件中过滤掉不活动的电子邮件?
- javascript - 选中 Javascript 中的所有“是”复选框