文章 "交易事务. 请求和响应结构、描述和记录" - 页 8

 
MrBrooklin #:

那么,这个事件处理程序是如何在一个交易日后找到未结头寸的呢?

敬上,弗拉基米尔。

奇迹不会发生。你的逻辑是这样的。你应该知道为什么...触发处理程序时,你在处理程序中查找了什么?你是如何搜索的?到底是什么触发了它。

有一个事件--处理程序信号。你需要在其中过滤这些事件...

但总的来说,我并不依赖这些处理程序。我控制着过去和当前状态之间的差异。在此基础上我决定做什么。

 
Artyom Trishkin #:
阿列克谢回答。这取决于经纪人。

这是陈述还是假设?我问这个问题不是因为我没事干。我想弄明白。

弗拉基米尔

 
Artyom Trishkin #:
没有奇迹

我的第一位电子学导师在地区计算机服务中心工作时(苏联时期)也说过同样的话。我完全同意他和你的看法。因此,问题一定有合理的解释。在 8 个月的时间里,我在真实账户上使用了一次 Expert Advisor。这就是为什么我想弄清楚它,以消除出现这种情况的任何可能性。

弗拉基米尔

 

我将尝试在实际生活中使用 OnTradeTransaction() 函数的这一变体,以便 Expert Advisor 始终能找到未结头寸。我用黄色标出了代码中应排除 "未结头寸 "事实的部分:

//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void  OnTradeTransaction(
   const MqlTradeTransaction&    trans,   // 贸易交易结构
   const MqlTradeRequest&        request, // 请求结构
   const MqlTradeResult&         result   // 响应结构
)
  {
   if(trans.type==TRADE_TRANSACTION_DEAL_ADD)
     {
      if(HistoryDealSelect(trans.deal) && HistoryDealGetInteger(trans.deal,DEAL_ENTRY)==DEAL_ENTRY_IN)
        {
         pos_ticket=trans.position;
         pos_open=trans.price;
        }
     }
  }
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
void Open_Add_Position()
  {
//--- if a position with a medjik and ticket of the last open position is selected by the current symbol
   if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&
      PositionGetString(POSITION_SYMBOL)==_Symbol &&
      PositionGetInteger(POSITION_MAGIC)==Magic_Number)
     {
      ....... тогда выполняем определённые действия с целью открытия дополнительной позиции
     }
  }

在测试器中运行正常,我将看看在实际交易中的表现如何。

再见,弗拉基米尔。

 
MrBrooklin 未结头寸。我用黄色标出了代码中应排除未结头寸 "消失 "事实的部分:

在测试器中运行正常,我想看看在实际交易中会发生什么。

再见,弗拉基米尔。

弗拉基米尔,这些函数之间没有联系。移除 OpTradeTransaction() 函数,代码将以完全相同的方式运行。

如果策略涉及开设多个仓位和账户,这部分代码

if((PositionSelectByTicket(pos_ticket) || PositionSelect(_Symbol)) &&

会造成很大损失。

 
Alexey Viktorov #:

弗拉基米尔,这些函数之间没有任何联系。移除 OpTradeTransaction() 函数,代码就会以完全相同的方式运行。

如果策略规定开立多个头寸和账户,那么这部分代码

会造成很大损失。

阿列克谢,感谢你不断提示和帮助我改进 EA 代码。现在说重点。是的,我有一个对冲账户,可以开设多个仓位。OpTradeTransaction() 和您建议删除的那部分代码 之间有直接 联系。在OpTradeTransaction(),我获得了头寸票据及其开仓价,用于开立额外头寸。在此之前,一切都运行得很好。问题出现在 Expert Advisor一次 都没有 "看到 "未结头寸。我之前没有注意到,以为问题只发生了一次,但在通过历史记录运行并详细查看打印输出后,我意识到问题不止发生了一次,而不是两次。我只是以前没有注意到,但现在我意识到,这个问题有时会在仓位从一个交易时段转移到另一个交易时段时出现。我强调--有时。为什么会这样?我自己也想不明白。我的外汇交易商在交易时段之间有滚动功能。也许是因为它,也许不是因为它。我也不知道。我现在也有类似的情况,但我还缺少一个开立额外头寸的条件。我想测试一下新代码,看看它到底有没有坏处。我不怕做实验,因为不会更糟,尤其是我已经学会了用手 "解决 "糟糕的情况。我只需停止两个机器人的工作,然后以我需要的价格建仓即可。

弗拉基米尔

 
MrBrooklin #:

阿列克谢,感谢你不断提示和帮助我改进 EA 代码。现在说重点。是的,我有一个对冲账户,可以开设多个仓位。OpTradeTransaction() 和您建议删除的那部分代码 之间有直接 联系。在OpTradeTransaction(),我获得了头寸票据及其开仓价,用于开立额外头寸。在此之前,一切都运行得很好。问题出现在 Expert Advisor一次 都没有 "看到 "未结头寸。我之前没有注意到,以为问题只发生了一次,但通过历史记录运行并更详细地查看打印输出后,我意识到问题发生了不止一次,而不是两次。我只是以前没有注意到,但现在我意识到,这个问题有时会在头寸从一个交易时段转移到另一个交易时段时出现。我强调--有时。为什么会这样?我自己也想不明白。我的外汇交易商在交易时段之间有滚动功能。也许是因为它,也许不是因为它。我也不知道。我现在也有类似的情况,但我还缺少一个开立额外头寸的条件。我想测试一下新代码,看看它到底有没有坏处。我不怕做实验,因为不会更糟,尤其是我已经学会了用手 "解决 "糟糕的情况。我只需停止两个机器人的工作,然后按我需要的价格手动建仓。

弗拉基米尔

问题在于,PositionSelect(_Symbol) 不一定会选择最后一个仓位。因此,如果您在 OnTradeTransaction() 中没有收到仓单,您就有可能根据错误的数据做出决定。

 
Alexey Viktorov #:

问题在于 PositionSelect(_Symbol) 不一定会选择最后一个仓位。因此,如果在 OnTradeTransaction() 中没有获得仓位票据,就有可能根据错误的数据做出决策。

谢谢你的提示。我会考虑一下,看看在实际交易中会有什么影响。 还不同意放弃 OnTradeTransaction() 函数。我们需要彻底了解这个问题,然后再 做最终决定。

再见,弗拉基米尔

 
MrBrooklin #:

谢谢你的建议。我会考虑一下,看看在实际交易中会有什么影响。 还不能同意放弃 OnTradeTransaction() 函数。我需要彻底了解这个问题,然后再 做最终决定。

再见,弗拉基米尔

我没有说要拒绝。但这样使用的好处是零。

 
Alexey Viktorov #:
删除 OpTradeTransaction() 函数,代码将以完全相同的方式运行

根据我的理解,删除一个函数就等于拒绝使用它。由谁来说、怎么说并不重要,最重要的是搞清楚。: )

再见,弗拉基米尔