MT4 专家交易小组 - "OBJ_RECTANGLE_LABEL"

MT4 expert trade panel - "OBJ_RECTANGLE_LABEL"

MetaTrader4 交易面板专家顾问。
我怎样才能 link 一些 OBJ_RECTANGLE_LABEL 与另一个单个对象一起移动?

Link 他们是间接的

不直接支持链接几个 GUI-对象与另一个对象一起移动。

这并不意味着,它不可能像这样工作。

在一个 Augmented Trader UI-工具中,我需要让所有 GUI-组件和一些计算值在某种类似逻辑下运行(保留所有线条、矩形、文本标签和热图颜色,在一些常见的 UI-control-logic 下)。所有 live-interactive-GUI 编排都被锁定在一些允许的用户-机器交互上,用户可以使用一组 UI-control-objects 移动,其中一些是自由的可以修改,而有些被限制(使用增强现实控制器)只能垂直或水平移动,或者只是被锁定为从布林带边缘切线开始,在这样的地方,垂直线UI-control-object 被用户移动等

Live-interactive-GUI解决方案很简单:

除了 [ Expert Advisor ] 创建和 运行 另一个进程,[ 负责 GUI-对象自动化的脚本 ]。在此脚本中,使用来自对象的一些只读值,比方说一条蓝色垂直线,作为 SENSOR_x1,GUI 组合的输入.

如果某人或某物移动了这条蓝色垂直线,脚本内的事件监视循环将检测 SENSOR_x1
的新值并且
重新处理所有UI-布局方案,通过添加刚刚观察/检测到的SENSOR_x1_delta = SENSOR_x1 - SENSOR_x1_previous;
这个运动方式,可以在 [ 脚本 ] 中更新运动检测器循环,追踪所有 SENSOR_* 实际值并将检测到的 SENSOR_*_delta-s 提升到 GUI-布局组合中使用的所有对象上。

最后,值得在 Live-交互式-GUI.

来自 PoC 演示程序的代码

人们可能会注意到,代码采用了 New-MQL4.56789 之前的语法,使用了一些允许的变量命名约定,现在不再被允许。事件监视器功能的范围(一个独立的功能,针对处理 MVC 框架所有三个角落的最大速度/最小延迟进行了优化(Model-is Live-G UI 项目特定,Visual-是 Live-GUI 增强特定,Controller-灵活且作为一种有限状态机组成,由主要构建块组成,并通过 "object.method"switch(){} 中调用实现。循环采样率在低到很少的情况下都能很好地工作数十毫秒,因此 Live-GUI 稳健且平稳地漂浮在交易员的桌面上。

这不是最好的方法,但示意性地显示了该怎么做。

string      mainObjectNAME,
       dependantObjectNAME;                     // dependant - your obj label

void OnChartEvent( const int     id,
                   const long   &lparam,
                   const double &dparam,
                   const string &sparam
                   ){
   if (  id == CHARTEVENT_OBJECT_DRAG
      || id == CHARTEVENT_OBJECT_ENDEDIT
         ){
      if (  StringCompare( sparam, mainObjectNAME ) == 0 ){
            datetime time1  = (datetime) ObjectGetInteger( 0,      mainObjectNAME, OBJPROP_TIME1 );
            double   price1 =            ObjectGetDouble(  0, dependantObjectNAME, OBJPROP_PRICE1 );
            if ( !ObjectMove( 0, dependantObjectNAME, 0, time1, price1 ) )
                  Print( __LINE__,
                         "failed to move object ",
                         dependantObjectNAME
                         );
      }
      ChartRedraw();
   }
}

如果您通过任何公认的方式(通过拖动或传递其他参数)修改 mainObject - 然后从属对象(OBJ_RECT_LABEL 在您的case ) 使用 ObjectMove()ObjectSet() 函数移动。