初学者的问题 MQL5 MT5 MetaTrader 5 - 页 854

 
我在摆弄CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX),并意识到它内部并不完全有序。这都是关于2个返回代码 - bool和ResultRetcode()。RetCode在返回false之前并不总是内部清零,所以如果PositionClose给出false,RetCode很可能返回TRADE_RETCODE_DONE。如果开发者能将这两个返回值同步化,那就更好了。
 
. ... Rick D. ... .:
我在摆弄 CTrade::PositionClose(const ulong ticket,const ulong deviation=ULONG_MAX),并意识到它内部并不完全有序。这都是关于2个返回代码 - bool和ResultRetcode()。RetCode在返回false之前并不总是内部清零,所以如果PositionClose给出false,RetCode很可能返回TRADE_RETCODE_DONE。如果开发者能将这两个返回值同步化,那就更好了。

代码+例子+日志。

 
我发现了一个奇怪的错误。也许这只适合我。

COrderInfo::OrderType() 总是返回0。

为了检查它,你可以手动放置任何挂单(BuyStop, SellStop, ...)。
然后把它输入到脚本中。
#include <Trade\Trade.mqh>

COrderInfo m_order;

void OnStart()
{
  ulong ticket = 250262937; //здесь ваш тикет
  
  if (!m_order.Select(ticket))
  {
    PrintFormat("COrderInfo::Select(#%I64u) failed", ticket);
    return;
  }
  
  PrintFormat("OrderType= %d", m_order.Type());
}

也许是虚拟函数表的问题?在调试中,我只得到了虚拟int CObject::Type()

PS。我自己已经想清楚了。COrderInfo有2个类似的方法:Type()和OrderType()。

 
Vladimir Karputov:

代码+例子+日志。

看看我说的是什么情况。

#include <Trade\Trade.mqh>

CTrade m_trade;

void OnStart()
{ 
  int LErr;
  bool bRC;
  double price;

  ResetLastError();
  
  price = 0.0;
  bRC = m_trade.Buy(0.1, "EURUSD", price, 0.0, 0.0);

  LErr = GetLastError();

  PrintFormat("! Buy:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() теперь TRADE_RETCODE_DONE
  
  //---

  ulong ticket = 1; //Позиции с таким тикетом нет
  
  ResetLastError();

  bRC = m_trade.PositionClose(ticket);  

  LErr = GetLastError();
  
  PrintFormat("! Close #%I64u:  (bRC= %s)(RetCode= %u: %s)(LErr= %d)",
    ticket,
    (string)bRC, 
    m_trade.ResultRetcode(), 
    m_trade.ResultComment(), 
    LErr
  );
  
  //В m_trade.ResultRetcode() все еще TRADE_RETCODE_DONE
}

我在CTrade 中没有看到任何SetResultRetcode和SetResultComment方法,以便在每次新操作之前重置它们。

我必须继承我的类,在那里我添加一个单一的方法


class CTradeEx : public CTrade
{
public:
  void SetResult(MqlTradeResult& result)
  {
    m_result = result;
  }  
};
 
. ... Rick D. ... .:

看看我说的是什么情况。

我在CTrade中没有看到任何SetResultRetcode和SetResultComment方法,以便在每次新操作之前重置它们。

为了什么?完全没有必要的功能。

第一:你在空中开枪--你在没有首先检查的情况下发送交易指令--没有检查操作的结果是什么。看一下参考文献:PositionClose 是bool类型的。

其次,让我们看一下位置关闭链:当位置没有找到时(它不能被指定的票选择),返回 "false"。

//+------------------------------------------------------------------+
//| Close specified opened position                                  |
//+------------------------------------------------------------------+
bool CTrade::PositionClose(const ulong ticket,const ulong deviation)
  {
//--- check stopped
   if(IsStopped(__FUNCTION__))
      return(false);
//--- check position existence
   if(!PositionSelectByTicket(ticket))
      return(false);
   string symbol=PositionGetString(POSITION_SYMBOL);
//--- clean

在这一点上,结构没有被清除到任何地方--因为这没有意义--毕竟之前不能选择位置,因此结构中没有信息。

 
Vladimir Karputov:

这有什么意义?完全没有必要的功能。

第一:你在空中开枪--你在没有首先检查的情况下发送交易指令--没有检查操作的结果是什么。让我们看一下参考资料:PositionClose 是bool类型的。

第二,让我们看一下位置关闭链:当位置没有找到时(它不能被指定的票选择),返回 "false"。

同时,这些结构在任何地方都没有被清除,因为这没有意义--毕竟之前无法选择位置,因此结构中没有信息。

1) 我们不妨说,ResetLastError()是一个绝对不必要的函数。

2)对返回的结果有一个检查。想象一下,通过类比,你调用一些WinAPI函数,它返回一个错误,而GetLastError()(ResultRetcode的类似物)返回任何最后的代码。

如果我在调用PositionClose之前添加一些检查(我会这样做),它不会在任何其他调用之前覆盖任何其他检查,此时RetCode不会改变。

我的专家顾问在日志中写了信息。我所需要的是在某些调用返回错误时,在日志中写下合理的ResultRetcode和ResultComment。

 
. ... Rick D. ... .:

1) 我们不妨说ResetLastError()是完全不必要的。

2)对返回结果有一个检查。想象一下,通过类比,你调用一些WinAPI函数,它返回一个错误,而GetLastError()(ResultRetcode的类似物)返回任何最后的代码。

如果我在调用PositionClose之前添加一些检查(我会这样做),当RetCode没有改变时,它不会覆盖任何其他调用之前的检查。

我的专家顾问在日志中写了信息。我需要做的就是在某些调用返回错误时,在日志中写下合理的ResultRetcode和ResultComment。

当你需要通过调用ResultRetcode()方法来检查交易请求的执行结果(交易服务器的返回代码) 时,请阅读CTrade类的帮助

 
Vladimir Karputov:

在CTrade类的帮助下 阅读何时通过调用ResultRetcode()方法检查交易请求的执行结果(交易服务器返回代码)

你可以这样断言。

1)如果PositionClose返回false,那么Retcode就永远不会被填满?

2) 如果PositionClose返回true,那么Retcode总是被填充?

 
Vladimir Karputov:

订单->交易->头寸。从头寸中提取开盘价

你能展示一下这个订单->交易->头寸的图片吗,它在写交易的地方下面,所以它不允许复制那里。


 
Seric29:

你能否展示一张图片,说明这个订单->交易->仓位,它在底部写着交易,所以它不让你复制。


请重写你的问题或加上标点符号,或者最好在图片上加上什么、哪里和谁。否则,我就会发现,我看到了熟悉的字母,但却无法理解其含义和你的观点。