文章 "轻松快捷开发 MetaTrader 程序的函数库(第 二十一部分):交易类 - 基准跨平台交易对象" - 页 2

 
Artyom Trishkin:


谢谢,这是一项重要而有用的工作....。

 
Vladimir Pastushak:

谢谢,这是一项重要而有用的工作....。

不客气

 
你好 Artyom - 有没有更简单的方法在下单或建仓后获取票据编号?这似乎过于复杂 :-(
long CMySetup::PlaceOrder()
{
   bool order_ok;
   if (m_direction == POSITION_TYPE_BUY) {
      order_ok = m_engine.PlaceBuyLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, m_magic, m_comment, m_expiry);
   }
   else {
      order_ok = m_engine.PlaceSellLimit(m_lot_size, m_symbol, m_entry, m_hard_stop, m_ratio_target, m_magic, m_comment, m_expiry);
   }

   if (order_ok) {
      CArrayObj* list = m_engine.GetListHistoryOrders();
      if (list != NULL) {
         list.Sort(SORT_BY_ORDER_TIME_OPEN);
         COrder* order = list.At(list.Total() - 1);
         if (order != NULL) {
            m_ticket = order.Ticket();
         }
      }
   }
   return m_ticket;
}
 
Dima Diall :
你好 Artyom - 有没有更简单的方法在下单或建仓后获取票据编号?这似乎过于复杂 :-(

测试顾问会显示上次下单或开仓的所有数据。这意味着库知道这些数据。它实现了事件功能,库会报告所有已设置的事件。因此,您需要控制这些事件,获取最后订单或头寸的对象,并从中获取票据(以及订单或头寸的所有其他参数)。目前还无法举例说明。但我很快就会回来,我可以提供帮助。
您可以自己查看测试顾问获取事件数据并打印到日志中的位置。因此,您可以从您的程序中访问相同的点,并从这些事件中获取数据。

В тестовых советниках же показываются все данные последнего выставленного ордера или открытой позиции.Это означает, что библиотека знает эти данные.В ней реализован событийный функционал, и о всех установленных событиях библиотека сообщает.Соответственно, вам нужно контролировать эти события и получать объект последнего ордера или позиции, а из него брать тикет (и все остальные параметры ордера или позиции).在此基础上,我们还将继续努力,以确保在全球范围内,在所有国家、所有地区、所有国家和所有地区,都能实现 "全球通 "的目标。在此基础上,我们还将继续努力,以确保在全球范围内,使我们的用户能够享受到我们的产品和服务。
Можете самостоятельно поглядеть откуда тестовые советники берут данные о событиях и распечатывают их в журнал.Соответственно, можете из своей программы получить доступ к той же точке и брать данные от этих событий.

 
Artyom Trishkin:

测试顾问会显示上次下单或开仓的所有数据。这意味着库知道这些数据。它实现了事件功能,库会报告所有已设置的事件。因此,您需要控制这些事件,获取最后订单或头寸的对象,并从中获取票据(以及订单或头寸的所有其他参数)。目前还无法举例说明。但我很快就会回来,我可以提供帮助。
您可以自己查看测试顾问获取事件数据并打印到日志中的位置。因此,您可以从您的程序中访问相同的点,并从这些事件中获取数据。

是的,我明白 -- 我正在仔细查看,并想知道我是否能保证我的事件处理程序立即被调用,如果有多个订单/头寸请求,我需要进行什么样的分析才能确保我正确匹配每个请求的事件......所有这一切只是为了找出票据编号,例如,对于挂单,库会在CTradeObj::SetOrder() 内的 "m_result "中接收到该票据编号。

#ifdef __MQL5__
   return(!this.m_async_mode ? ::OrderSend(this.m_request,this.m_result) : ::OrderSendAsync(this.m_request,this.m_result));
#else 
   ::ResetLastError();
   int ticket=::OrderSend(this.m_request.symbol,
                          this.m_request.type,
                          this.m_request.volume,
                          this.m_request.price,
                          (int)this.m_request.deviation,
                          this.m_request.sl,
                          this.m_request.tp,
                          this.m_request.comment,
                          (int)this.m_request.magic,
                          this.m_request.expiration,
                          clrNONE);
// ...
   if(ticket!=WRONG_VALUE)
     {
      this.m_result.order=ticket;
      this.m_result.price=(::OrderSelect(ticket,SELECT_BY_TICKET) ? ::OrderOpenPrice() : this.m_request.price);
      this.m_result.volume=(::OrderSelect(ticket,SELECT_BY_TICKET) ? ::OrderLots() : this.m_request.volume);
      return true;
     }
// ... 
#endif

这就是为什么我认为从CEngine::PlaceBuyLimit() 和所有这一系列 方法中 返回票据编号(如果不成功则返回-1 会更有用 ,因为 当您下单或开仓时,您通常会立即想要记录票据编号,以便日后参考......在我看来,强迫DoEasy 用户为此实现事件处理会让 感觉不必要的复杂

也许你的方法有很好的理由,所以不确定你是否同意;如果不同意,我很想了解你的设计决定背后的理由;-)

 
Dima Diall :

是的,我明白 -- 我正在仔细查看,并想知道我是否能保证我的事件处理程序立即被调用,如果有多个订单/头寸被请求,我需要进行什么样的分析,以确保我正确匹配每个请求的事件......所有这一切只是为了找出票据编号,例如,对于挂单,库在CTradeObj::SetOrder() 内的 "m_result "中接收到的票据编号。

这就是为什么我认为从CEngine::PlaceBuyLimit() 和所有这一系列 方法中 返回票据编号(如果不成功则返回-1 会更有用 ,因为 当您下单或开仓时,您通常会立即想要记录票据编号,以便日后参考......也许它甚至可以返回一个COrder* 指针 ,或者在不成功时 返回 NULL。 在我看来,强迫DoEasy 用户为此实现事件处理会让库感觉不必要的复杂。

也许你的方法有很好的理由,所以不确定你是否同意;如果不同意,我很想了解你的设计决定背后的理由;-)

一切都很简单。在 MQL5 中,向服务器发送交易指令 的成功并不保证其执行。发送成功是对交易订单参数正确性的小米检查。订单的执行由交易所负责。我们只能利用交易环境发生变化的事实,并在检测到其变化后继续前进。因此,我不使用服务器响应中收到的数据。

我们可以使用服务器响应中的数据。В MQL5 успешность отсылки торгового приказа на сервер не гарантирует его исполнения.Успешность отсылки - это просо проверка на корректность параметров в торговом приказе.Исполнение приказа лежит на стороне биржи.Мы можем лишь использовать факт изменения торгового окружения, и после обнаружения его изменения уже двигаться дальше.Именно по этой причине я не использую данные, полученные в ответе сервера.

 
Artyom Trishkin:

一切都很简单。在 MQL5 中,成功向服务器发送交易指令 并不保证其执行。发送成功是对交易订单参数正确性的小米检查。订单的执行由交易所负责。我们只能利用交易环境发生变化的事实,并在检测到其变化后继续前进。因此,我不使用服务器响应中收到的数据。

好的,我正试图在我的 EA 框架中实施这种方法,以便使用您的TestDoEasyPart39.mq5 作为指导,使其更易于管理,但在遗漏事件方面遇到了一些问题 - 仍在调查/调试中(目前一切都处于测试模式)...如果您能分享一些您自己在其他 EA 中如何做到这一点的代码示例,我将不胜感激。

我仍在使用第 39 部分的库版本;这是目前使用的最佳版本,还是您建议升级到更新的版本?

 
Dima Diall :

好的,我正在尝试在我的 EA 框架中实施这种方法,以便使用您的TestDoEasyPart39.mq5 作为指导,使其更易于管理,但遇到了一些遗漏事件的问题 - 仍在调查/调试中(目前一切都在测试模式下)...如果您能分享一些您自己在其他 EA 中如何做到这一点的代码示例,我将不胜感激。

我仍在使用第 39 部分的库版本;这是目前使用的最佳版本,还是您建议升级到更新的版本?

到目前为止,所有后续版本都致力于创建指标。

我很快就会回到顾问方面。在那里,我还会检查用户 关于某些交易事件(同时发生)丢失的信息。
然后,我将向您展示如何使用库的事件模型。

Пока все последующие версии посвящены созданию индикаторов.

Скоро опять вернусь к советникам.Там и проверю сообщения пользователей о том, что некоторые торговые события (происходящие одновременно) теряются.
Итам же смогу тогда показать как использовать событийную модель библиотеки.

 
Artyom Trishkin:

迄今为止,所有后续版本都致力于创建指标。

我很快就会回到顾问方面。在那里,我还将检查一些交易事件(同时发生)丢失的用户信息。
然后我就可以向大家展示如何使用库的事件模型了。

您预计何时开始重新开发专家顾问功能?根据您的回答,我可能需要选择编写自己的多平台类/方法,用于简化下单、开仓等操作......至少在我目前的项目中是这样。

在处理TRADE_EVENT_PENDING_ORDER_PLASEDTRADE_EVENT_POSITION_OPENED 等交易事件时,如何确保给定事件与我之前提交的特定交易请求相对应?目前,我每个符号只有一个订单/头寸,因此很容易检查事件的符号是否与我的请求相符...不过,以后我的 EA 应该可以在同一符号上开立多个订单/头寸(使用单个魔法数字),希望这样就不需要比较入市价格、止损价、止赢价等了......我在想,也许可以使用不同的神奇数字,或者将组 #1 和 #2 打包到神奇数字中的功能

我有点困惑,不太确定什么是将交易事件与请求相匹配的最佳方法--您能暂时帮我解决这个问题吗?如果我能可靠地将交易请求与票据编号联系起来,我相信我可以继续在这个项目中使用 DoEasy。

Library for easy and quick development of MetaTrader programs (part XXVI): Working with pending trading requests - first implementation (opening positions)
Library for easy and quick development of MetaTrader programs (part XXVI): Working with pending trading requests - first implementation (opening positions)
  • www.mql5.com
I have already mentioned the concept of a pending request in a number of previous articles. In this article, we are going to figure out what it is and why we need it, as well as start implementing pending requests. When receiving and handling a trade server error, we sometimes need to wait and repeat the request. In the simplest case, waiting...
 
Dima Diall :

您预计何时开始重新开发专家顾问功能?根据您的回答,我可能需要选择编写自己的多平台类/方法来简化下单、开仓等操作......至少对于我目前的项目来说是这样。

在处理TRADE_EVENT_PENDING_ORDER_PLASEDTRADE_EVENT_POSITION_OPENED 等交易事件时,如何确保给定事件与我之前提交的特定交易请求相对应?目前,我每个符号只有一个订单/头寸,因此很容易检查事件的符号是否与我的请求相符...不过,以后我的 EA 应该可以在同一符号上开立多个订单/头寸(使用单个魔法数字),希望这样就不需要比较入市价格、止损价、止赢价等了......我在想,也许可以使用不同的神奇数字,或者将组 #1 和 #2 打包到神奇数字中的功能......。

我有点困惑,不太确定什么是将交易事件与请求相匹配的最佳方法 - 您能暂时帮我解决这个问题吗?如果我能可靠地将交易请求与票据编号联系起来,我相信我可以继续在这个项目中使用 DoEasy。

如果你需要比较交易请求和头寸,那么最简单的方法就是设置头寸标识符(不是魔法)。每个请求都有自己的标识符。顾问的魔法可以对所有仓位保持一个。然后通过标识符(写入仓位或订单的魔法中,永远不会丢失),您可以随时准确匹配请求和仓位/订单。