我有一个EA,可以通过单击按钮关闭交易
//void CloseCurrentTrade(). It's called after successfull OrderSelect
int orderType = OrderType();
double price;
if (orderType == OP_BUY)
price = return MarketInfo(OrderSymbol(), MODE_BID);
else if (orderType == OP_SELL)
price = return MarketInfo(OrderSymbol(), MODE_ASK);
else
return;
int slippage = 20;
bool closed = OrderClose(OrderTicket(), OrderLots(), price, slippage);
if (closed)
return;
int lastError = GetLastError();
有时它会关闭交易,有时会返回错误#129(无效价格)。我不知道为什么。大多数情况下,人们只是滥用出价/要价或没有内漏。我尝试使用滑差最大200,仍然是相同的错误。某些EA只是尝试将其关闭几次(对我来说,这似乎是一个hack),但它也无济于事。有人提到您需要在买/卖之前调用RefreshRates(),但是documentaion表示您不需要为MarketInfo这样做。
我已经没有足够的想法了。为什么会发生以及如何避免呢?我正在FXCM演示版上进行测试(如果是这样)。
答案 0 :(得分:3)
首先请确保您已正确选择订单,然后尝试在可能的情况下使用OrderClosePrice
(这样就无需检查OP_SELL
/ OP_BUY
)
//+------------------------------------------------------------------+
//| Close the latest order for this current symbol |
//+------------------------------------------------------------------+
void CloseCurrentTrade()
{
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
if(OrderSymbol()!=Symbol()) continue;
if(OrderMagicNumber()!=MagicNum) continue; // if there is no magic number set, then no need for this(manual orders)
if(OrderType()>OP_SELL) continue;
if(!OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),Slippage))
Print("Error in Closing the Order, Error : ",ErrorDescription(GetLastError()));
break; // assuming you want to close the latest trade only, exit the order closing loop
}
}
还请注意,您的经纪人可能对收市价必须与开仓价和其他水平(sl / tp)之间的距离有限制,以便平仓。 Refer here
答案 1 :(得分:0)
在Ask/Bid
时打印并比较price
和&closed!=true
。请注意,MarketInfo
模式数据已经存储在Ask/Bid
个预定义变量中,因此如果您OrderSelect
使用当前符号,则可以消除这种情况。