新的MQL4语法 - 页 6

 
SDC:

当我把图标的路径放在terminal_data_directory中时,编译器出错了,错误说不能打开虚拟商店文件夹中的文件,尽管我没有在虚拟商店中指定一个文件夹。我在 terminal_data_directory 中指定了一个文件夹。

我唯一能让它工作的方法是把文件放在与源代码相同的文件夹中,并且完全不指定路径,只是#property icon"MyIcon.ico"


嗨,万一有人对# 属性图标"\\Images\MyIcon.ico "有问题,你应该考虑图标的尺寸为96x96 px或更大。我也遇到过这个错误,但现在可以了。
 

我注意到,编译器执行了我不希望发生的铸造。

我有以下代码。

其中按键 对象的类是MT4String, 函数 getKey() 返回更通用的类。同样的情况也发生在按钮 对象上。明确的铸造被省略了。

原始代码是这样的。

在JAVA中,有必要进行显式铸造,但MQL4编译器也能正常使用这种语法。

这种隐式铸造是一个特点,在C++中也是有效的吗?还是说这是一个错误?

 

我不是C++专家,但从基类到子类的转换被称为下转换,根据这个页面,在C++中下转换似乎也必须是显式的。(像Java)?

由于MQL4允许隐式下转换,这要么是一个 "特征",要么是一个错误:)

如果它是一个 "特性",那可能意味着编译器将无法警告编码者潜在的错误,所以它不是一个很好的特性。C++和Java都需要明确的下转换,这是有原因的?

此外,在MQL4中,没有内置的方法来检查对象的类别(例如instanceOf等),所以这意味着除非你实现自己的 "类型 "检查,否则运行时的错误是无法避免的。


Animal a;

Dog d;

...

if (a  instanceOf Dog) { // no built in check like this - we all have to roll our own??

 d = a;

}
 
ydrol:

我不是C++专家,但从基类到子类的转换被称为下转换,根据这个页面,在C++中下转换似乎也必须是显式的。(像Java)?

由于MQL4允许隐式下转换,这要么是一个 "特征",要么是一个错误:)

如果它是一个 "特性",可能意味着编译器将无法警告编码者潜在的错误,所以它不是一个好的特性。C++和Java都需要明确的下转换,这是有原因的?

此外,在MQL4中,没有内置的方法来检查对象的类别(例如instanceOf等),所以这意味着除非你实现自己的 "类型 "检查,否则运行时的错误是无法避免的。




是的,我也希望能有instanceof ".class",但据我所知,即使在C++中也没有这个功能。甚至MQL4的调试器也不知道被监视对象的类型。我不太在意,因为MQL4的OOP功能实现得出奇的好,如果这是唯一的错误,那么我会说万岁。我只是好奇,它是否遵循了一些现有的模式,但似乎它是一个错误。

 

一键交易

在旧的MT4中,我使用一个dll文件来创建EA一键式交易。

我可以在这些白色文本框中直接输入 参数...LOT, TP SL 直接在这些白色的文本框中输入。

当我点击买入或卖出时......我的EA会读取输入框中的文本。

在新MT4中,我看到了按钮功能......但我找不到创建和读取这样一个文本框的功能。

 
WDholic:

在旧的MT4中,我使用一个dll文件来创建EA一键式交易。

我可以在这些白色文本框中直接输入 参数...LOT, TP SL 直接在这些白色的文本框中输入。

当我点击买入或卖出时......我的EA会读取输入框中的文本。

在新MT4中,我看到了按钮功能......但我找不到创建和读取这样一个文本框的功能。

对于键盘输入,有一个对象类型OBJ_EDIT。如果你按下回车键,它就会触发CHARTEVENT_OBJECT_ENDEDIT 事件。但似乎回车键是完成编辑的唯一方法,例如,在对象边界外点击鼠标并不能完成编辑。这使我无法将该对象部署为对用户不友好的对象。

此外,如果提供空字符串作为初始值,则自动显示文本 "编辑"(这个词甚至可以被编辑),这真的令人困惑。

 
void OnChartEvent(const int id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam){

   if(id==CHARTEVENT_OBJECT_ENDEDIT ){
   
      if(sparam=="pulsanteEdit") Print("The text in the Edit field of the object with name ",sparam," has been changed");
     } 
}
void creaPulsanteEdit(const string objNameIns,const string objText,int xDistance,int yDistance,int xSize,int ySize,color clrIns,color clrTextIns){
   
   if(!ObjectCreate(0,objNameIns,OBJ_EDIT,0,0,0)){ 
      stampaErrore("Errore creazione pulsante edit");
      return;
   }
   
   ObjectSetInteger(0,objNameIns,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_XDISTANCE,xDistance); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YDISTANCE,yDistance); 

   ObjectSetInteger(0,objNameIns,OBJPROP_XSIZE,xSize); 
   ObjectSetInteger(0,objNameIns,OBJPROP_YSIZE,ySize);
   
//--- set the text 
   ObjectSetString(0,objNameIns,OBJPROP_TEXT,objText);
   ObjectSetString(0,objNameIns,OBJPROP_FONT,"Arial");
   ObjectSetInteger(0,objNameIns,OBJPROP_FONTSIZE,10);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_READONLY,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BGCOLOR,clrIns);
   ObjectSetInteger(0,objNameIns,OBJPROP_COLOR,clrTextIns);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_BORDER_COLOR,LightSeaGreen);
   
//--- display in the foreground (false) or background (true) 
   ObjectSetInteger(0,objNameIns,OBJPROP_BACK,false);
   
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTABLE,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_SELECTED,false);
   ObjectSetInteger(0,objNameIns,OBJPROP_HIDDEN,false);
}

void OnTick(){

  creaPulsanteEdit("pulsanteEdit", string1, 10, 275,60,30,Black,LightSeaGreen);

  Print("string1: "+string1);
}

我创建了这个按钮来编辑里面的文本,我想读取文本字符串并将其转换为一个双数或整数变量,但它不工作,也不打印 "名称为 "的对象的编辑栏中的文本 已被改变"

你能帮助我吗?