Новый синтаксис MQL4 - страница 6

 
SDC:

Компилятор выдает ошибку, когда я указываю путь к иконке в директории terminal_data_directory, ошибка говорит, что невозможно открыть файл в папке виртуального хранилища, хотя я не указал папку в виртуальном хранилище. Я указываю папку в каталоге_данных_терминала.

Единственный способ заставить его работать - поместить файл в ту же папку, что и исходный код, и не указывать путь вообще, просто #property icon "MyIcon.ico".


Привет, на всякий случай, если у кого-то возникла проблема с #property icon "\\\Images\\\MyIcon.ico", вы должны учитывать размер иконки 96x96 px или выше. Я тоже столкнулся с этой ошибкой, но теперь все работает.
 

Я заметил, что компилятор выполняет приведение, которого я не ожидал.

У меня есть следующий код:

где класс объекта key - MT4String, а функция getKey() возвращает более общий класс. То же самое происходит и с объектом button. Явное приведение опущено.

Оригинальный код выглядел следующим образом:

В JAVA было бы необходимо явное приведение, но компилятор MQL4 также корректно работает с этим синтаксисом.

Является ли это неявное приведение особенностью, которая действует и в C++? Или это ошибка?

 

Я не специалист по C++, но переход от базового класса к дочернему называется downcasting, и, согласно этой странице, похоже, что в C++ downcasting должен быть явным. (как в Java)?

Так как MQL4 позволяет неявный downcasting, это либо "фича", либо баг :)

Если это "особенность", то это, вероятно, означает, что компилятор не сможет предупредить кодера о потенциальной ошибке, так что это не очень хорошая особенность. И 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++, но переход от базового класса к дочернему называется downcasting, и, согласно этой странице, похоже, что в C++ downcasting должен быть явным. (как в Java)?

Так как MQL4 позволяет неявный downcasting, это либо "фича", либо баг :)

Если это "особенность", то это, вероятно, означает, что компилятор не сможет предупредить кодера о потенциальной ошибке, так что это не очень хорошая особенность. И C++, и Java требуют явного даунскастинга по какой-то причине?

Более того, в MQL4 нет встроенного способа проверки класса объекта (например, instanceOf и т.д.), поэтому избежать ошибки во время выполнения невозможно, если только не реализовать собственную проверку "типа"...




Да, я бы тоже оценил instanceof или ".class", но, насколько я заметил, их нет даже в C++. Даже отладчик MQL4 не знает тип наблюдаемого объекта. Меня это не сильно волнует, потому что функция ООП в MQL4 реализована на удивление очень хорошо, и если бы это был единственный баг, то я бы сказал "ура". Мне просто было интересно, следует ли это какому-то существующему шаблону, но, похоже, это скорее баг.

 

торговля в один клик

в старом MT4 я использовал dll файл для создания советника для торговли в один клик.

Я могу вводить параметры... LOT, TP SL прямо в белом текстовом поле.

Когда я нажимаю кнопку купить или продать... мой советник считывает введенный текст в поле.

В новом MT4 я вижу функцию кнопки... но я не могу найти функцию для создания и чтения текстового поля как это.

 
WDholic:

в старом MT4 я использовал dll файл для создания советника для торговли в один клик.

Я могу вводить параметры... LOT, TP SL прямо в белом текстовом поле.

Когда я нажимаю кнопку купить или продать... мой советник считывает введенный текст в поле.

В новом MT4 я вижу функцию кнопки... но я не могу найти функцию для создания и чтения текстового поля как это.

Для ввода с клавиатуры есть объект типа OBJ_EDIT. Он вызывает событие CHARTEVENT_OBJECT_ENDEDIT , если вы нажимаете клавишу Enter. Но похоже, что клавиша Enter - это единственный способ завершить редактирование, например, щелчок мышью вне границ объекта не завершает редактирование. Это мешает мне развернуть объект как недружественный пользователю.

Более того, если в качестве начального значения задана пустая строка, то вместо нее появляется автоматический текст "Edit" (и это слово даже можно редактировать), что очень смущает.

 
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);
}

Я создал эту кнопку для редактирования текста внутри нее, и я хотел бы прочитать и преобразовать текстовую строку в переменную double или int, но это не работает и не выводит сообщение "Текст в поле Edit объекта с именем" был изменен".

вы можете мне помочь?

Причина обращения: