文章 "MQL5 Cookbook: 交易历史和取得仓位信息的函数库"

 

新文章 MQL5 Cookbook: 交易历史和取得仓位信息的函数库已发布:

现在是时候简单总结一下之前关于仓位属性文章的内容了,在本文中,我们会额外创建几个函数来取得只能通过访问交易历史才能获得的属性,我们也会对数据结构更加熟悉,这使我们可以用更加方便的方法访问仓位和交易品种属性。

MQL5 Cookbook: The History of Deals And Function Library for Getting Position Properties

作者:Anatoli Kazharski

 
文章很好,我很喜欢。经常出现的情况是,当前位置 由几笔交易组成,除了第一笔和最后一笔,我还想知道第二笔、第三笔等交易的参数。这样的功能可以丰富文章的内容。
 
paladin800:
文章很好,我很喜欢。经常出现的情况是,当前位置 由几笔交易组成,除了第一笔和最后一笔,我还想知道第二笔、第三笔等交易的参数。这样的功能可以丰富文章的内容。
现在就让它成为一个家庭作业吧。不过,我以后会试着就这个主题再写点东西。
 

向文章作者提问。

如何获取开仓后立即参与交易的头寸的 ID



 
denkir:

向文章作者提问。

如何在开仓后立即 获取交易仓位的标识符

使用 PositionSelect() 函数选择仓位,然后使用PositionGetInteger() 函数和 mql5 标识 -POSITION_IDENTIFIER,获取其标识符。

帮助中的示例:

//+------------------------------------------------------------------+
//| 贸易功能|
//+------------------------------------------------------------------+
void OnTrade()
  {
//--- 检查位置是否可用,并打印位置变化的时间
   if(PositionSelect(_Symbol))
     {     
//--- 获取位置标识符,以便进一步操作
      ulong position_ID=PositionGetInteger(POSITION_IDENTIFIER);
      Print(_Symbol," postion #",position_ID);
//--- 以毫秒为单位获取自 1970 年 1 月 1 日以来位置形成的时间
      long create_time_msc=PositionGetInteger(POSITION_TIME_MSC);
      PrintFormat("Position #%d  POSITION_TIME_MSC = %i64 milliseconds => %s",position_ID,
                  create_time_msc,TimeToString(create_time_msc/1000));
//--- 以秒为单位获取自 1970 年 1 月 1 日以来最后一次位置变化的时间
      long update_time_sec=PositionGetInteger(POSITION_TIME_UPDATE);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE = %i64 seconds => %s",
                  position_ID,update_time_sec,TimeToString(update_time_sec));
//--- 以毫秒为单位获取自 1970 年 1 月 1 日以来最后一次位置变化的时间
      long update_time_msc=PositionGetInteger(POSITION_TIME_UPDATE_MSC);
      PrintFormat("Position #%d  POSITION_TIME_UPDATE_MSC = %i64 milliseconds => %s",
                  position_ID,update_time_msc,TimeToString(update_time_msc/1000));
     }
//---
  }
 
tol64:

使用 PositionSelect() 函数选择一个位置,然后使用PositionGetInteger() 函数和 mql5 标识符POSITION_IDENTIFIER 获取其标识符

示例来自帮助:

谢谢,tol64!原则上,你是对的。

尽管我提供了位置标识符 的参考,但第一个问题还是太简短了,对此我深表歉意

问题是这样的。在开仓后,有必要在CDealInfo 类的帮助下,使用方法 ::PositionId() 在交易历史中捕捉这次开仓。最好是在开仓时刻和 历史记录中出现 DEAL_ENTRY_IN 或DEAL_ENTRY_INOUT 类型交易的时刻 之间的时间间隔最小

可以这样做吗?不是通过活跃头寸列表,而是通过历史交易列表...
 
denkir:

谢谢你,tol64!原则上,真理是属于你的。

我对第一个问题的简短表示歉意......尽管我给出了立场 ID 的链接

问题是这样的。建仓后,有必要使用CDealInfo 类的 ::PositionId() 方法在交易历史中捕捉建仓。开仓时刻与 历史记录中出现 DEAL_ENTRY_IN 或DEAL_ENTRY_INOUT 类型的交易时刻 之间的时间差最好最小。

可以这样做吗?不是通过活跃仓位列表,而是通过历史交易列表...

在我看来,在OnTrade() 中跟踪事件(如上面的示例)非常适合。但我认为,突然无法通过交易事件选择仓位,而且下一个仓位也不会很快出现。那么就需要通过计时器来跟踪环境。现在甚至可以设置毫秒。

那么,或者不跟踪未结头寸,而是扫描历史交易(交易次数)。我们会记住之前的交易,并将其与当前的交易进行比较。您也可以在计时器中这样做。有很多变体。这完全取决于具体任务。

 

阿纳托利,我在这里遇到了一个问题。请分享您的经验。要么是使用函数时出现了错误,要么是我 "走错了路"。但我认为我做的一切都是正确的....。

我有一个关于函数变体的问题,其中第二个变体不 "工作"。

例如

1)

double  HistoryOrderGetDouble(
   ulong                       ticket_number,     // 机票
   ENUM_ORDER_PROPERTY_DOUBLE  property_id        // 属性标识符
   );

2)

bool  HistoryOrderGetDouble(
   ulong                       ticket_number,     // 机票
   ENUM_ORDER_PROPERTY_DOUBLE  property_id,       // 属性标识符
   double&                     double_var         // 在这里,我们获取属性的值
   );

我附上了源代码。

附加的文件:
 
denkir:

阿纳托利,我在这里遇到了一个问题。请分享您的经验。要么是使用函数时出现了错误,要么是我 "走错了路"。但我认为我做的一切都是正确的....。

问题是关于函数变体,其中第二个变体不 "工作"。

...

你在日志中看到了什么?运行脚本时没有问题。
 
tol64:
你在日志中看到了什么?我在运行脚本时没有看到任何问题。

我看到在脚本的默认设置下,有一个类似 "Failure to returnHistoryOrderGetDouble() function"(返回HistoryOrderGetDouble() 函数 失败)的条目。

也就是说,布尔版本的函数无法获取属性值。

 
denkir:

我发现在默认脚本设置下,会出现类似 "无法返回HistoryOrderGetDouble() 函数"的记录。

也就是说,布尔版本的函数无法获取属性值。

对我来说,一切都成功通过了。请详细查看所有内容(输出到日志)以找出原因。订单数、票据数、错误数等。