Warm tip: This article is reproduced from serverfault.com, please click

mql4-OrderClosePrice返回与历史记录池不同的价格

(mql4 - OrderClosePrice returns a price different from the history pool)

发布于 2020-11-12 09:20:59

当使用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选择了订单。

有谁知道如何解决?

编辑

我们有一个经纪人,有时会尊重所要求的价格,有时却不尊重。

不管我们必须更换经纪人以获得更可靠的经纪人这一事实,我们都不能依靠所要求的价格。

我们看到的价格大于或等于实际价格的偏差都大于一百点。

Questioner
Hiperion
Viewed
0
Hiperion 2020-12-01 20:52:53

就像@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;
    }
}