应对交易环境时的典型错误和如何处理这些错误 - 页 9

 
Algotrader18:

下午好!

我有一个类似的问题要问大家,特别是对fxsaber。
这似乎是一个最原始的问题,但我找不到它的答案。
在这里https://www.mql5.com/ru/forum/6343/page939,我被告知 "试着搜索一下。 fxsaber已经在这个问题上工作了一段时间了。什么工作了,我不知道,我不感兴趣。"所以我决定问你。

问题是这样的。我开了仓,想打印MqlTradeResult 的内容。

retcode、order和volume被打印出来,但deal和price总是零。
请告诉我,我做错了什么,如何获得(至少先打印)结果结构的内容?

这个怎么样?

//+------------------------------------------------------------------+
   MqlTradeRequest request={0};
   MqlTradeResult  result={0};
//---
   request.action   = TRADE_ACTION_DEAL;    // type of trade operation
   request.symbol   = Pair1;                // symbol
   request.volume   = lots;                 // volume of lot
   request.type     = oper;                 // order type
   request.price    = priceOpen;            // price for opening
   request.deviation= Slippage;             // allowed deviation from the price
   request.magic    = magic;   
//---
   if(OrderSend(request,result))
     {
      Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
      Print ("deal = " +IntegerToString (result.deal) + "; ");
      Print ("order = " +IntegerToString (result.order) + "; "); 
      Print ("volume = " +DoubleToString (result.volume) + "; ");  
      Print ("price = " +DoubleToString (result.price) + "; ");
     }
   else
     {
      // Здесь действия при ошибке открытия
     }
//+------------------------------------------------------------------+
 
Algotrader18:

我开了一个头寸,想打印MqlTradeResult 的内容,像这样。

转码、订单和数量被打印出来,但交易和价格总是零
请告知我做错了什么,如何获得(至少先打印)结果结构的内容

结果中写入零。

 
Artyom Trishkin:

这个怎么样?

谢谢,但结果是一样的......。
 
fxsaber:

结果中规定了零和。

那么就完全不清楚了--我以为我做错了什么,如果那里有零,结果是什么呢?
我看到一个开放的订单,我得到result.retcode 10009和result.price = 0 ?
如果不包含一个结果,你能解释一下结果的含义吗?
 
Algotrader18:
请解释一下,如果不包含结果,那么结果的意义何在?

这是MT5的一个特点,其结果只是一个订单(票据和没有价格),但不是交易。你有几个选择

  1. 自己搞清楚事情是如何运作的。
  2. 使用已经准备好的高层次(低层次是隐藏的)发展,几乎所有的陷阱都被绕过了。
 
fxsaber:

这是MT5的一个特点,其结果只是一个订单(票据和没有价格),但不是交易。你有几个选择

  1. 自己搞清楚事情是如何运作的。
  2. 使用已经准备好的高层次(低层次是隐藏的)发展,几乎所有的陷阱都被绕过了。
谢谢你。

在MQL4中,没有结果结构,我们收到一张票,并选择适当的订单,要求提供必要的数据。MQL5有包含许多必要数据的结果结构,不使用它是不合逻辑的。

1.在论坛上提问之前,我试图 "自己弄清楚一切是如何运作的",以及我所看到的--在结果结构中。

struct MqlTradeResult
  {
   uint     retcode;          // Operation return code
   ulong    deal;             // Deal ticket, if it is performed
   ulong    order;            // Order ticket, if it is placed
   double   volume;           // Deal volume, confirmed by broker
   double   price;            // Deal price, confirmed by broker
   double   bid;              // Current Bid price
   double   ask;              // Current Ask price
   string   comment;          // Broker comment to operation (by default it is filled by description of trade server return code)
   uint     request_id;       // Request ID set by the terminal during the dispatch
   uint     retcode_external; // Return code of an external trading system
  };


目前双倍价格; // 交易价格,由经纪人确认。

在开发者的示例代码中

//--- send the request
   if(!OrderSend(request,result))
      PrintFormat("OrderSend error %d",GetLastError());     // if unable to send the request, output the error code
//--- information about the operation
   PrintFormat("retcode=%u  deal=%I64u  order=%I64u",result.retcode,result.deal,result.order);
输出result.deal,即假定它是有意义的,它在结果结构中不一定用0表示。可以给出其他的例子,说明result.price以及result.deal可以从MqlTradeResul获得,这就是我试图做的。


我在任何地方都没有看到这样的信息:"这是MT5的一个特点,当结果只是一个订单(票据和没有价格),但不是交易"。请你告诉我,你是根据什么资料得出这个结论的。

2.如果你知道有什么 "已经准备好的更高级别的(低级别的是隐藏的)发展",允许你在仓位打开后(代码10009出现)立即获得仓位的参数,而不需要事先通过票据选择,请给我一个例子或给我一个链接。

 
Algotrader18:
谢谢你。

在MQL4中,没有结果结构,我们收到一张票,并选择适当的顺序,要求提供必要的数据。MQL5具有许多必要数据的结果结构,不使用它是不合逻辑的。

1.在论坛上提问之前,我试图 "自己弄清楚一切是如何运作的",我所看到的是,结构结果。


有一个双倍价格;//交易价格,由经纪人确认。

在开发者的示例代码中

输出result.deal,即假定它是有意义的,它在结果结构中不一定用0表示。还有一些例子显示,可以从MqlTradeResul获得result.price以及result.deal,这就是我试图做的。


我在任何地方都没有看到 "这是MT5的一个功能,其结果只是一个订单(票据和没有价格),而不是交易 "的信息。请你告诉我,你是根据什么资料得出这个结论的。

2.如果你知道有什么 "已经准备好的更高层次(低层次是隐藏的)的发展",允许你在仓位打开后(代码10009出现)立即获得仓位的参数,而不需要事先通过票据选择,请给我一个例子或给我一个链接。

一个交易请求的结果 是拒绝或市场订单。这不是交易,也不是交易产生的头寸。

  1. 一个开仓的交易指令被发送到服务器上(指令=订单)。
  2. 如果订单被接受,就会返回接受订单并将其放入队列的结果。
  3. 如果订单已被执行,交易--订单执行的结果--会出现。
  4. 该交易将导致一个新的头寸,或增加/减少现有头寸的规模,或关闭头寸,或翻转。或一个新的头寸(在对冲账户中)。
 
Artyom Trishkin:

一个交易请求的结果 是拒绝或市场订单。这不是交易,也不是交易产生的头寸。

  1. 一个开仓的交易指令被发送到服务器上(指令=订单)。
  2. 如果订单被接受,就会返回接受订单并将其放入队列的结果。
  3. 如果订单已被执行,交易将作为订单执行的结果出现。
  4. 交易的结果将是一个新的头寸,或增加/减少现有头寸的规模,或关闭一个头寸,或翻转。或一个新的头寸(如果是对冲账户)。
谢谢你--请告诉我。
- 在你列出的那些步骤中,你认为贸易请求结果结构(MqlTradeResult)出现在哪一步之后?

- 根据MQL5的描述。
"交易请求结果的结构(MqlTradeResult)
作为对交易请求的响应,交易服务器返回包含交易请求处理结果的数据,作为一个特殊的预定义结构MqlTradeResult"。和 "10009 TRADE_RETCODE_DONE订单已执行"。

也就是说,如果我从MqlTradeResult请求数据,在收到代码10009后,我如何解释result.price = 0?
 
Algotrader18:
谢谢你。
- 在你列出的那些步骤中,哪一步会出现交易请求结果(MqlTradeResult)的结构?

- 根据MQL5的描述。
"交易请求结果的结构(MqlTradeResult)
作为对交易请求的响应,交易服务器返回包含交易请求处理结果的数据,作为一个特殊的预定义结构MqlTradeResult"。和 "10009 TRADE_RETCODE_DONE订单已执行"。

因此,贸易服务器的返回代码10009意味着OrderSend请求被成功执行,即如果我从MqlTradeResult请求数据,在收到代码10009后,我如何解释result.price = 0?

10009 TRADE_RETCODE_DONE - 你自己描述过了 - 订单被执行。这只是一个事实,即该订单已成功排到服务器上执行。

进一步说,如果这个订单被执行(毕竟它可以被服务器拒绝),那么就有一笔交易--这是以开盘价进行交易 的结果。

阅读关于

贸易交易时

当TradeTransaction事件发生时,专家顾问系统会调用它。该函数用于处理交易请求的执行结果。

空白OnTradeTransaction()。
const MqlTradeTransaction&trans,// 贸易交易的结构
const MqlTradeRequest&request,// 请求结构
const MqlTradeResult& result// 响应的结构
);

Документация по MQL5: Обработка событий / OnTradeTransaction
Документация по MQL5: Обработка событий / OnTradeTransaction
  • www.mql5.com
При обрабокте транзакций типа TRADE_TRANSACTION_REQUEST для получения дополнительной информации необходимо анализировать второй и третий параметры функции OnTradeTransaction() – Отправка торгового запроса на покупку приводит к цепи торговых транзакций, которые совершаются на торговом счете: 1) запрос  принимается на обработку, 2) далее для...
 
Algotrader18:

我在任何地方都没有看到这样的信息:"这是MT5的一个功能,其结果只是一个订单(票据和没有价格),但不是交易"。请你告诉我,你是根据什么资料得出这个结论的。

自己的经验。

2.如果你知道有什么 "已经准备好的更高层次(低层次是隐藏的)的发展",允许你在一个职位开放后(代码10009出现)立即获得该职位的参数,而不需要事先通过门票选择,请举例说明或提供链接。

#include <MT4Orders.mqh> // https://www.mql5.com/ru/code/16006

#define Bid SymbolInfoDouble(_Symbol, SYMBOL_BID)
#define Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void Variant1()
{
  if (OrderSelect(OrderSend(_Symbol, OP_BUY, 0.1, Ask, 100, 0, 0), SELECT_BY_TICKET))
    OrderPrint();
}

void Variant2()
{
  OrderSend(_Symbol, OP_SELL, 0.1, Bid, 100, 0, 0);
  MqlTradeResult result = MT4ORDERS::LastTradeResult;
  
  Print ("retcode = " +IntegerToString (result.retcode) + "; ");        
  Print ("deal = " +IntegerToString (result.deal) + "; ");
  Print ("order = " +IntegerToString (result.order) + "; "); 
  Print ("volume = " +DoubleToString (result.volume) + "; ");  
  Print ("price = " +DoubleToString (result.price) + "; ");
}

void OnStart()
{
  Variant1();
  Variant2();
}
#2212868739 2018.11.02 21:09:33 buy 0.10 EURUSD 1.13895 0.00000 0.00000 1.13892 -0.18 0.00 -0.26 0
retcode = 10009; 
deal = 2210317244; 
order = 2212868740; 
volume = 0.10000000; 
price = 1.13892000; 


还有一个选项,但它是 "高级 "的。