文章 "从 MQL4 迁移到 MQL5" - 页 11

 

大家好、

您知道如何在 MQL5 中使用 ObjectSet(objname,OBJPROP_FIRSTLEVEL+level,value) 吗?我尝试搜索 OBJPROP_FIRSTLEVEL,但在 MQL5 中没有找到它。

mql4:

void _SetFibLevel(string objname, int level, double value, string description)

//+------------------------------------------------------------------+

{

ObjectSet(objname,OBJPROP_FIRSTLEVEL+level,value);

ObjectSetFiboDescription(objname,level,description);

}

-----------------------------------

 
vietlh216:

您知道如何在 MQL5 中使用 ObjectSet(objname,OBJPROP_FIRSTLEVEL+level,value) 吗?我尝试搜索 OBJPROP_FIRSTLEVEL,但在 MQL5 中没有找到它。

mql4:

void _SetFibLevel(string objname, int level, double value, string description)

//+------------------------------------------------------------------+

{

ObjectSet(objname,OBJPROP_FIRSTLEVEL+level,value);

ObjectSetFiboDescription(objname,level,description);

}

-----------------------------------


您可以阅读我的博文,了解现成的解决方案。

 
Stanislav Korotky:

您可以阅读我的博文,了解现成的解决方案。


非常有用,谢谢 :)

 
Stanislav Korotky:

您可以阅读我的博文,了解现成的解决方案。


感谢 Stanislav Korotky 提供的解决方案,但我不太擅长 MQL5,我仍然不知道如何将 OBJPROP_FIRSTLEVEL 转换为在 MQL5 中使用。

在 MQL4 中:

OBJPROP_FIRSTLEVEL+n

210+n

整数

整数值,用于设置/获取具有索引 n 的斐波纳契对象级别值。索引 n 可以从 0(级别数-1)开始,但不能大于 31。

但我在 MQL5 中没有找到它

ex: MQL4 : ObjectSetFiboDescription(objname,level,description);->MQL5: ObjectSetString(0,objname,OBJPROP_LEVELTEXT,level,description);

MQL4:ObjectSet(objname,OBJPROP_FIRSTLEVEL+level,value);->MQL5:?

 
vietlh216:

感谢 Stanislav Korotky 提供的解决方案,但我对 MQL5 不太熟悉,仍然不知道如何在 MQL5 中转换 OBJPROP_FIRSTLEVEL。

在 MQL4 中:

OBJPROP_FIRSTLEVEL+n

210+n

整数

整数值,用于设置/获取具有索引 n 的斐波纳契对象级别值。索引 n 可以从 0(级别数-1)开始,但不能大于 31。

但我在 MQL5 中没有找到它

ex: MQL4 : ObjectSetFiboDescription(objname,level,description);->MQL5: ObjectSetString(0,objname,OBJPROP_LEVELTEXT,level,description);

MQL4:ObjectSet(objname,OBJPROP_FIRSTLEVEL+level,value);->MQL5:?


啊,我找到了

ObjectSetDouble(0,objname,OBJPROP_LEVELVALUE,level,value);

^^

 
vietlh216:

啊,我找到了

ObjectSetDouble(0,objname,OBJPROP_LEVELVALUE,level,value);

^^


您可以试试我的 include 的以下附录:

class OBJPROP_DOUBLE_BROKER_EXTENDED: public OBJPROP_DOUBLE_BROKER
{
  public:
    OBJPROP_DOUBLE_BROKER_EXTENDED(const ENUM_OBJECT_PROPERTY_DOUBLE property, const int modifier): OBJPROP_DOUBLE_BROKER(property, modifier)
    {
    }
    
    OBJPROP_DOUBLE_BROKER_EXTENDED *operator+(const int add)
    {
      i = add;
      return &this;
    }
};

OBJPROP_DOUBLE_BROKER_EXTENDED OBJPROP_FIRSTLEVEL(OBJPROP_LEVELVALUE, 0);

之后,您的初始 MQL4 代码就可以正常工作了。

 
Stanislav Korotky:

您可以尝试对我的 include 进行以下增补:

之后,您的初始 MQL4 代码就可以正常工作了。


现在我明白它是如何工作的了,非常感谢 Stanislav Korotky。

 

我建议更换

string StringConcatenate(..);

string StringFormat("",..);

这两个函数 都会返回一个字符串,这样在某些情况下就更容易替换了!

 
Stanislav Korotky:

您可以尝试对我的 include 进行以下增补:

之后,您的初始 MQL4 代码应能正常工作。

我在您的 ind4to5 include 中添加了 OBJPROP_DOUBLE_BROKER_EXTENDED 类,但它似乎不起作用,因为在最新的 Metaeditor 版本中,1958 年调用 ObjectSetDouble(chart_ID,name,OBJPROP_PRICE1,price1)返回编译错误 "ObjectSetDouble" - 没有任何重载可应用于函数调用。有什么好办法吗?

 

我自己发现,ind4to5 中没有包含 ObjectSetDouble。我在 mqh 中添加了以下代码,结果问题迎刃而解。

bool ObjectSetDouble(long chart_id, const string name, const OBJPROP_DOUBLE_BROKER &property, const double value)
{
  return ObjectSetDouble(chart_id, name, property.p, property.i, value);
}