文章 "DoEasy 库中的其他类(第七十部分):扩展功能并自动更新图表对象集合"

 

新文章 DoEasy 库中的其他类(第七十部分):扩展功能并自动更新图表对象集合已发布:

在本文中,我将扩展图表对象的功能,并编排图表导航、创建屏幕截图、以及为图表保存和应用模板。 此外,我还将实现图表对象集合、其窗口和其内指标的自动更新。

现在是时候来测试创建当前图表的屏幕截图了。 每次点击按钮都会创建一个特定大小的图表屏幕截图。 首次点击 — 800x600,第二次 — 750x562,第三次 — 当前图表尺寸:


创建三个不同分辨率的屏幕截图后(附有相应的日志条目),

CChartObj::ScreenShot800x600: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.25.png (800 x 600)
CChartObj::ScreenShot750x562: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.28.png (750 x 562)
CChartObj::ScreenShotWndSize: Screenshot created: DoEasy\ScreenShots\TestDoEasyPart70_EURUSD_H1_2021.04.13_14.02.29.png (726 x 321)

我们还查看了保存这些屏幕截图的文件夹内容。
在创建屏幕截图之前,我将光标悬停在当前图表两个窗口的不同区域上,图表注释会显示时间、价格和子窗口的索引,以及以像素为单位的光标 X/Y 坐标。 光标 Y 坐标有两个值。 第一个值显示品种主窗口初始坐标的 Y 坐标。 第二个所示数值(括号中)显示相对于光标所在窗口上边框的 Y 坐标。

作者:Artyom Trishkin

 

使用 DeletePending 按钮删除限价订单,会产生许多相同的OnChartEvent 事件,但应该有不同的事件,对吗?

或者通过批量操作删除限价订单也会产生许多相同的事件

如果手动平仓,事件是有顺序的。


2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.055 -
2023.03.07 14:58:31.385 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090285  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 4718715 (123), G1: 8, G2: 4
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:58.395 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090282  at price 1.19640, sl 1.19490, tp 1.19790, Magic number 10223739 (123), G1: 12, G2: 9
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:58:00.613 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090287  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 6357115 (123), G1: 1, G2: 6
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     - Pending order removed: 2023.03.07 14:57:59.669 -
2023.03.07 14:58:31.386 TestDoEasy131 (GBPUSD.c,H1)     GBPUSD.c Deleted 0.10 Pending order Buy Limit #89090286  at price 1.19636, sl 1.19486, tp 1.19786, Magic number 393339 (123), G1: 6
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.392 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.394 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.395 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     MAGIC = %d10223739
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     2023.03.07 14:58:30
2023.03.07 14:58:31.397 TestDoEasy131 (GBPUSD.c,H1)     OnChartEvent: Pending order removed
 
BillionerClub OnChartEvent 事件,但应该有不同的事件。

或通过批量操作删除限价订单,会出现许多相同的事件

如果手动关闭,事件是连续的。

我不明白您的意思...
 
Artyom Trishkin OnChartEvent 中才会出现不同的事件。
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {


//--- 如果在测试仪中工作,则退出
//if(MQLInfoInteger(MQL_TESTER))
// return;
   int idx=id-CHARTEVENT_CUSTOM;
//--- 从 lparam 中提取:(1) 事件时间的毫秒数;(2) 原因;(3) 事件源;(4) 设置事件的准确时间。
   ushort msc=engine.EventMSC(lparam);
   ushort reason=engine.EventReason(lparam);   ushort source=engine.EventSource(lparam);
   long time=::TimeCurrent()*1000+msc;
//--- 处理贸易活动
   if(idx>TRADE_EVENT_NO_EVENT && idx<TRADE_EVENTS_NEXT_CODE)
     {
      //--- 获取所有交易事件列表
      CArrayObj *list=engine.GetListAllOrdersEvents();
      if(list==NULL)
         return;
      //--- 获取事件索引相对于列表末尾的偏移量
      //--- 在测试程序中,偏移量通过 lparam 参数传递给事件处理程序
      //--- not in the tester - each event is sent one at a time and handled in OnChartEvent()
      int shift=(engine.IsTester() ? (int)lparam : 0);
      CEvent *event=list.At(list.Total()-1-shift);

我是这样改正的,似乎有效。


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
 
BillionerClub OnChartEvent 中才会出现不同的事件

我是这样解决的,似乎有效。


你的意思是库向事件处理程序发送了错误的事件吗?
 
Artyom Trishkin #:
你是说程序库向事件处理程序发送了错误的事件?

是的,我就是这个意思,我想我已经解决了这个问题,但我不确定这个解决方案,因为我不太明白它的缺点在哪里。


      int shift=(engine.IsTester() ? (int)lparam : 0);
      static int NEvents =list.Total()-1-shift;
      CEvent *event=list.At(NEvents);
      NEvents++;
      if(event==NULL)
      {
      event=list.At(list.Total()-1-shift);
      if(event==NULL)return;
      }
 
BillionerClub #:

是的,我就是这个意思,我更正了一下,但我不确定解决办法,因为我不太明白这样做的弊端在哪里。


谢谢,我会看看的