文章 "轻松快捷开发 MetaTrader 程序的函数库(第 三十四部分):延后交易请求 - 在特定条件下删除和修改订单与持仓" - 页 2

 
Artyom Trishkin:
是的,他们会的。因为存储账户数据的方法已经改变。这一点作为警告写在文章末尾: ----- 供您参考: ,因为我们改变了账户对象的结构(改变了存储账户字符串属性的 uchar 数组的大小,并增加了一个整数属性),所有以前保存的账户对象文件将不再能正确加载。如果它们在 \Files\DoEasy\Accounts\ 目录下的终端公共文件夹中,那么在启动本测试顾问之前必须全部删除 - 当从一个账户切换到另一个账户时,它们将以新的对象结构大小重新创建。 -----



我删除了常用文件夹中的所有账户 BIN 文件,以确保完全加载您的代码。加载后,"CAccount::Load "没有出错(但主要问题是忽略了错误的事件,现在仍然存在)。

然后我手动打开了一些交易,并用脚本尽可能快地关闭了它们。我又遇到了这个错误:

CEventsCollection::CreateNewEvent, Line 768:该事件已在列表中

我们知道这些事件来自 MT4 中的不同平仓,但 "引擎 "代码无法理解。引擎是否能在短时间内理解多个交易平仓/事件?


以下是所有日志信息:

2020.08.21 21:23:50.604 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.21 21:23:50.600 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.21 19:51:47.000 -

澳元兑美元平仓 在价格 0.94405 时买入 #573142748,获利 -0.22 美元

2020.08.21 21:23:50.368 脚本 CloseTradesFast4Test AUDCAD,H1:已删除

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: 取消原因 0

2020.08.21 21:23:50.364 CloseTradesFast4Test AUDCAD,H1: close #573142747 buy 0.01 AUDCAD at 0.94404 at price 0.94375

2020.08.21 21:23:50.148 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.21 21:23:50.146 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.21 19:51:47.000 -

澳元兑美元平仓 在价格 0.94405 时买入 #573142748,获利 -0.22 美元

2020.08.21 21:23:49.942 CloseTradesFast4Test AUDCAD,H1: close #573142748 buy 0.01 AUDCAD at 0.94405 at price 0.94376

2020.08.21 21:23:49.725 mhdbzr-34 AUDCAD,H1: CEventsCollection::CreateNewEvent, 768行:此事件已在列表中

2020.08.21 21:23:49.520 CloseTradesFast4Test AUDCAD,H1: close #573142752 buy 0.01 AUDCAD at 0.94406 at price 0.94376

2020.08.21 21:23:49.257 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.21 21:23:49.255 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.21 19:51:52.000 - - AUDCAD Closed Sell.

澳元兑美元平仓 在价格 0.94366 时卖出 #573142755,获利 -0.37 美元

2020.08.21 21:23:49.086 CloseTradesFast4Test AUDCAD,H1: close #573142755 sell 0.01 AUDCAD at 0.94366 at price 0.94414

2020.08.21 21:23:48.815 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.21 21:23:48.812 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.21 19:51:53.000 -

澳元兑美元平仓 在价格 0.94366 时卖出 #573142757,获利 -0.37 美元

2020.08.21 21:23:48.661 CloseTradesFast4Test AUDCAD,H1: close #573142756 sell 0.01 AUDCAD at 0.94366 at price 0.94415

2020.08.21 21:23:48.352 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.21 21:23:48.350 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.21 19:51:53.000 -

澳元兑美元平仓 在价格 0.94366 时卖出 #573142757,获利 -0.37 美元

2020.08.21 21:23:48.237 CloseTradesFast4Test AUDCAD,H1: close #573142757 sell 0.01 AUDCAD at 0.94366 at price 0.94415

2020.08.21 21:23:47.537 CloseTradesFast4Test AUDCAD,H1: 初始化

2020.08.21 21:23:47.520 脚本 CloseTradesFast4Test AUDCAD,H1: 载入成功

2020.08.21 21:23:31.762 启用自动交易

 
Mohammad Bazrkar :

我删除了常用文件夹中的所有账户 BIN 文件,以确保完全加载您的代码。加载后,"CAccount::Load "没有出错(但主要问题是忽略了错误的事件,现在仍然存在)。

然后我手动打开了一些交易,并用脚本尽可能快地关闭了它们。我又遇到了这个错误:

CEventsCollection::CreateNewEvent, Line 768:该事件已在列表中

我们知道这些事件来自 MT4 中的不同平仓,但 "引擎 "代码无法理解。引擎是否能在短时间内理解多个交易平仓/事件?

请逐步描述您是如何处理此错误的。

 
Artyom Trishkin:

请逐步描述您是如何操作才会出现此错误的。

我修改了您的 EA 代码,使其只获取事件。(我在之前的信息中附上了修改后的版本,它被命名为 `mhdbzr-34`)

  1. 运行 EA 开始观察。
  2. 模拟账户 中以相同手数快速打开一些买入/卖出交易(快速点击图表上的一键买入/卖出按钮)
  3. 运行脚本,尽快关闭这些交易。(我的脚本名称是`CloseTradesFast4Test`)。
  4. 查看日志信息,你会发现引擎错过了一些平仓,可能是我在这里写的红色错误信息。
 
Mohammad Bazrkar :

我修改了您的 EA 代码,只获取事件。(我在之前的信息中附上了修改后的版本,它被命名为`mhdbzr-34`)。

  1. 运行 EA 开始观察。
  2. 模拟账户 中快速打开一些相同手数的买入/卖出交易(快速点击图表上的一键买入/卖出按钮)
  3. 运行脚本,以尽可能快的速度关闭这些交易。(我的脚本名为 "CloseTradesFast4Test")。
  4. 查看日志信息,你会发现引擎错过了一些平仓,可能是我在这里写的红色错误信息。

给你的脚本平仓。

 
Artyom Trishkin:

把脚本交给平仓。

以下是代码:

void OnStart()
{
   for(int i=OrdersTotal()-1; i>-1; i--)
   {
      if(!OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){ continue; }
      if(OrderSymbol()!= _Symbol){ continue;}
      //--
      RefreshRates();
      int res = OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 100);
   }
}
 

这里是另一个测试;这次它没有识别平仓头寸,在两种情况 下,它与之前的头寸错过了。

2020.08.27 20:30:18.880 Expert mhdbzr-34 AUDCAD,H1: 已移除

2020.08.27 20:30:18.869 mhdbzr-34 AUDCAD,H1: uninit reason 1

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:仓位关闭

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.27 20:28:35.617 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.27 18:58:03.000 - AUDCAD Closed Buy#573721560 at price 0.95218, Profit -2.29 USD

2020.08.27 20:28:35.614 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.27 18:58:04.000 - AUDCAD Closed Buy#573721562 at price 0.95218, Profit -2.29 USD

2020.08.27 20:28:35.582 脚本 CloseTradesFast4Test AUDCAD,H1: 已删除

2020.08.27 20:28:35.577 脚本 CloseTradesFast4Test AUDCAD,H1: 取消原因 0

2020.08.27 20:28:35.577 CloseTradesFast4Test AUDCAD,H1: close#573721560 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.177 CloseTradesFast4Test AUDCAD,H1: close#573721562 buy 0.10 AUDCAD at 0.95218 at price 0.95188

2020.08.27 20:28:35.161 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.27 20:28:35.158 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.27 18:58:06.000 - AUDCAD Closed Sell#573721573 at price 0.95190, Profit -2.06 USD

2020.08.27 20:28:34.739 CloseTradesFast4Test AUDCAD,H1: close#573721571 buy 0.10 AUDCAD at 0.95224 at price 0.95191

2020.08.27 20:28:34.695 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.27 20:28:34.691 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.27 18:58:06.000 - AUDCAD Closed Sell#573721573 at price 0.95190, Profit -2.06 USD

2020.08.27 20:28:34.306 CloseTradesFast4Test AUDCAD,H1: close#573721573 sell 0.10 AUDCAD at 0.95190 at price 0.95217

2020.08.27 20:28:34.180 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.27 20:28:34.177 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.27 18:58:09.000 - AUDCAD Closed Sell#573721582 at price 0.95190, Profit -2.14 USD

2020.08.27 20:28:33.883 CloseTradesFast4Test AUDCAD,H1: close#573721577 sell 0.10 AUDCAD at 0.95190 at price 0.95217

2020.08.27 20:28:33.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:平仓

2020.08.27 20:28:33.660 mhdbzr-34 AUDCAD,H1: - Position closed: 2020.08.27 18:58:09.000 - AUDCAD Closed Sell#573721582 at price 0.95190, Profit -2.14 USD

2020.08.27 20:28:33.440 CloseTradesFast4Test AUDCAD,H1: close#573721582 sell 0.10 AUDCAD at 0.95190 at price 0.95218

2020.08.27 20:28:32.946 CloseTradesFast4Test AUDCAD,H1: 初始化

2020.08.27 20:28:32.928 脚本 CloseTradesFast4Test AUDCAD,H1: 载入成功

2020.08.27 20:28:09.413 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:仓位已打开

2020.08.27 20:28:09.411 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:09.000 - AUDCAD Opened 0.10 Sell #573721582 [0.10 Market-order Sell #573721582] at price 0.95190

2020.08.27 20:28:07.664 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:开仓

2020.08.27 20:28:07.659 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:07.000 - AUDCAD Opened 0.10 Sell #573721577 [0.10 Market-order Sell #573721577] at price 0.95190

2020.08.27 20:28:06.755 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:开仓

2020.08.27 20:28:06.752 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:06.000 - AUDCAD Opened 0.10 Sell #573721573 [0.10 Market-order Sell #573721573] at price 0.95190

2020.08.27 20:28:05.911 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:开仓

2020.08.27 20:28:05.909 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:05.000 - AUDCAD Opened 0.10 Buy #573721571 [0.10 Market-order Buy #573721571] at price 0.95224

2020.08.27 20:28:04.587 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:开仓

2020.08.27 20:28:04.582 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:04.000 - AUDCAD Opened 0.10 Buy #573721562 [0.10 Market-order Buy #573721562] at price 0.95218

2020.08.27 20:28:04.101 mhdbzr-34 AUDCAD,H1: OnDoEasyEvent:开仓

2020.08.27 20:28:04.099 mhdbzr-34 AUDCAD,H1: - Position opened: 2020.08.27 18:58:03.000 - AUDCAD Opened 0.10 Buy #573721560 [0.10 Market-order Buy #573721560] at price 0.95218

2020.08.27 20:27:59.245 mhdbzr-34 AUDCAD,H1: 初始化

2020.08.27 20:27:59.244 mhdbzr-34 AUDCAD,H1: Account 13278180: mhdbzr test (Alpari) 5537.01 USD, 1:100, Hedge,模拟账户 MetaTrader 4

2020.08.27 20:27:49.794 Expert TestDoEasy\Part34\mhdbzr-34 AUDCAD,H1: 载入成功

我在模拟账户 的真实市场上手动开立了这些交易,没有使用测试环境。(然后像之前一样用脚本平仓)

(以下是截图,以确定是否发生了这种情况)

附加的文件:
 
Mohammad Bazrkar :

这里是另一个测试;这次它没有识别出平仓位置,在两种情况 下,它与之前的平仓位置错过了。

我是在模拟账户 的真实市场上手动开仓的,没有使用测试环境。(并像之前一样用脚本平仓)

(这里是截图,以确定发生了这种情况)

我正在寻找问题的原因。这不会很快。感谢您的测试。

 
Artyom Trishkin:

我正在寻找问题的原因。这不会很快。感谢您的测试。

(以下是我的看法)

这些关闭的仓位在同一秒钟内,其中一个仓位在前一个跳动时间内处理,因此在新的跳动时间内,它有`new_history_orders=1` 但在`list` 中有两个仓位,排序可能错误,因为两个项目在同一秒钟内有相同的关闭时间。

            //--- 获取平仓清单(EventsCollection.mqh 第 205-230 行)
            CArrayObj* list=this.GetListHistoryPositions(list_history);
            if(list!=NULL)
              {
               //--- 按照位置收盘时间对新列表排序
               list.Sort(SORT_BY_ORDER_TIME_CLOSE);
               //--- 在一个循环中,从列表末尾(最后 N 个事件)取出与新平仓数量相等的仓位数
               int total=list.Total(), n=new_history_orders;
               for(int i=total-1; i>WRONG_VALUE && n>0; i--,n--)
                 {
                  //--- 从列表中接收头寸。如果是头寸,则搜索开仓订单数据并设置交易事件
                  COrder* position=list.At(i);
                  if(position!=NULL && position.Status()==ORDER_STATUS_HISTORY_ORDER)
                    {
                     //--- 如果有一个关闭位置的控制命令
                     COrderControl* ctrl=this.GetOrderControlByTicket(list_control,position.Ticket());
                     if(ctrl!=NULL)
                       {
                        //--- 设置 (1) 开仓订单类型和 (2) 仓位 ID,并创建仓位关闭事件
                        this.m_type_first=(ENUM_ORDER_TYPE)ctrl.TypeOrder();
                        this.m_position_id=position.Ticket();
                        this.CreateNewEvent(position,list_history,list_market,list_control);
                       }
                    }
                 }
              }

如果订单已在列表中,并抛出错误信息,则会删除位置对象,并在此 for 循环中继续计数,但我认为当订单在CreateNewEvent 函数 中被删除时,不应该计数 n,以捕捉下一个有效位置。

此外,我们还需要了解最近处理过的位置,以跳过错误排序的订单,而不是倒数 `n`。

 
Mohammad Bazrkar :

(这是我的观点)

这些关闭的位置在同一秒钟内,其中一个在前一个 tick 时间内处理,因此在新的 tick 中,它有 `new_history_orders=1` 但在 `list` 中有两个位置,排序可能是错误的,因为两个项目在第二个秒钟内的关闭时间相同。

如果订单已在列表中,并抛出错误信息,则会删除位置对象,并在此 for 循环中继续计数,但我认为当订单已在CreateNewEvent 函数 中删除时,不应该计数 n,以捕捉下一个有效位置。

此外,我们还需要了解最近处理过的位置,以跳过错误排序的订单,而不是倒计时 `n`。

谢谢,我会解决的。

 

你好,Artyom, 我记得几周前我第一次读到这些文章时,你就提到了这个未来的图形外壳...您能提供更多关于您的愿景的细节吗?