【问题标题】:How can I programmatically get the upper and lower values of a manually drawn rectangle如何以编程方式获取手动绘制的矩形的上限值和下限值
【发布时间】:2025-11-26 11:50:02
【问题描述】:

如果在图表上手动绘制蓝色或红色矩形,我将使用下面的代码编写消息。我尝试使用OBJPROP_PRICE1 获取其中一个矩形值,但没有成功。如何获取手动绘制的矩形的上限值和下限值?此外,我设置 2 个布尔值(每个矩形打印条件一个)的方式使得只能识别每种颜色的一个矩形。无论蓝色或红色矩形的数量如何,对我来说,让打印条件正常工作的合适方法是什么?

bool hasFoundDemandRect = false;
bool hasFoundSupplyRect = false;

void OnTick()   {
for (int i=ObjectsTotal(); i>=0; i--)  {
         string name = ObjectName(i);

         if (ObjectType(name) == OBJ_RECTANGLE) {
            color rectColor = color(ObjectGetInteger(0,name,OBJPROP_COLOR));
            double price1 = ObjectGetDouble(0,name,OBJPROP_PRICE1);
            if (hasFoundDemandRect == false) {
               if (rectColor == clrBlue)  {
                  Print("a BUY rect has to be created");

                  hasFoundDemandRect = true;
               }
            }
            if (hasFoundSupplyRect == false) {
               if (rectColor == clrRed)  {
                  Print("a SELL rect has to be created");
                  hasFoundSupplyRect = true;
               }
            }
         }
}

【问题讨论】:

  • 看来你做的一切都是正确的。如果您使用 mql4,ObjectGetDouble(0,name,OBJPROP_PRICE1) 是正确的调用,它不会在 mql5 中编译。所以请提供MCVE和一套,或者自己调试
  • @DanielKniaz 我在测试时忘记了市场已经关闭。我已经更新了代码。我仍在试图弄清楚如何让蓝色和红色矩形的内部条件打印多个矩形。我知道我必须更改我的布尔条件,因为它们仅限于识别每个条件之一,但不知道如何。

标签: mql4 algorithmic-trading metatrader4 mt4


【解决方案1】:

Q如何获取手动绘制矩形的上下值?

#define MainWINDOW 0

for ( int i = ObjectsTotal(); i >= 0; i-- )  {

      string name = ObjectName( i );

      if ( ObjectType( name ) == OBJ_RECTANGLE ) {
           double price1 =        ObjectGetDouble(  MainWINDOW, name, OBJPROP_PRICE1 );
           double price2 =        ObjectGetDouble(  MainWINDOW, name, OBJPROP_PRICE2 );
           color  rColor = color( ObjectGetInteger( MainWINDOW, name, OBJPROP_COLOR ) );

           if ( rColor == clrBlue )  {
                Print( "BUY rect was found -----------------------------------" );
                Print( "Obj( ", name, " ): Lower edge is: ", MathMin( price1, price2 ) );
                Print( "Obj( ", name, " ): Upper edge is: ", MathMax( price1, price2 ) );
                continue;
           }

           if ( rColor == clrRed )  {
                Print( "SELL rect was found ----------------------------------" );
                Print( "Obj( ", name, " ): Lower edge is: ", MathMin( price1, price2 ) );
                Print( "Obj( ", name, " ): Upper edge is: ", MathMax( price1, price2 ) );
                continue;
           }
      }
}

无论蓝色或红色矩形的数量如何,对于我来说,让打印条件正常工作的合适方法是什么?

解决方案需要您实现某种对象清单。您当前的代码只是在所有 ObjectsTotal() 数量的 GUI 对象上盲目地重复每个滴答声。

在使用类似 DMA 的对象存储库后,我有信心确认,这对于数十万个 GUI 对象可能会非常有效,因此该解决方案是可行的。

MQL4 语言可以使用原生的基于数组的类似 DMA 的对象存储库,也可以使用外部节点从 模型中获得支持(s) 通过 ZeroMQ 消息传递自定义 API,其中远程 DB 引擎可以管理 GUI 对象存储库和类似 DMA 的调用,该问题的规模远超过百万个 GUI 对象,并且规模超出 MQL4-node 的数组/内存限制。

【讨论】:

    最近更新 更多