새로운 MQL4 구문 - 페이지 6

 
SDC :

Terminal_data_directory에 아이콘 경로를 넣으면 컴파일러 오류가 발생하며 가상 저장소에 폴더를 지정하지 않았는데도 가상 저장소 폴더에 있는 파일을 열 수 없다는 오류가 표시됩니다. 나는 terminal_data_directory에 폴더를 지정한다.

작동하게 할 수 있는 유일한 방법은 파일을 소스 코드와 동일한 폴더에 넣고 경로를 전혀 지정하지 않고 #property 아이콘 "MyIcon.ico"만 지정하는 것입니다.


#property icon "\\Images\\MyIcon.ico"에 문제가 있는 경우를 대비하여 아이콘 크기를 96x96픽셀 이상으로 고려해야 합니다. 나는 또한 오류를 경험했지만 지금은 작동합니다.
 

컴파일러가 내가 예상하지 못한 캐스팅을 수행한다는 사실을 알게 되었습니다.

다음 코드가 있습니다.

여기서 객체의 클래스는 MT4String이고 getKey() 함수 는 보다 일반적인 클래스를 반환합니다. 버튼 개체의 경우도 마찬가지입니다. 명시적 캐스팅은 생략됩니다.

원래 코드는 다음과 같았습니다.

JAVA에서는 명시적 캐스팅이 필요하지만 MQL4 컴파일러는 이 구문으로도 제대로 작동합니다.

이것은 C++에서도 유효한 암시적 캐스팅 기능입니까? 아니면 버그입니까?

 

저는 C++ 전문가는 아니지만 기본 클래스에서 자식 클래스로 이동하는 것을 다운캐스팅이라고 하며 이 페이지 에 따르면 다운캐스팅은 C++에서도 명시적이어야 하는 것처럼 보입니다. (자바처럼) ?

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++에서도 명시적이어야 하는 것처럼 보입니다. (자바처럼) ?

MQL4는 암시적 다운캐스팅을 허용하므로 "기능" 또는 버그입니다. :)

"기능"이라면 컴파일러가 잠재적인 오류에 대해 코더에게 경고하는 데 실패할 가능성이 있으므로 훌륭한 기능이 아닙니다. C++와 Java 모두 명시적 다운캐스팅이 필요한 이유가 무엇입니까?

또한 MQL4에는 객체의 클래스(예: instanceOf 등)를 검사하는 방법이 내장되어 있지 않으므로 자체 '유형' 검사를 구현하지 않는 한 런타임 오류를 피할 수 없습니다...




예, instanceof 또는 ".class" 도 감사하게 생각하지만 내가 아는 한 C++에서도 사용할 수 없습니다. MQL4 디버거도 감시 대상의 유형을 알지 못합니다. MQL4의 OOP 기능이 놀라울 정도로 잘 구현되어 있고 이것이 유일한 버그라면 만세를 부르기 때문에 별로 신경 쓰지 않습니다. 기존 패턴을 따르고 있는지 궁금했는데 오히려 버그인 것 같습니다.

 

원 클릭 거래

이전 MT4에서는 EA 원 클릭 거래를 생성하기 위해 dll 파일을 사용합니다.

매개변수를 입력 할 수 있습니다. LOT, TP SL은 흰색 텍스트 상자에 직접 입력할 수 있습니다.

구매 또는 판매를 클릭하면 .. 내 EA가 상자의 입력 텍스트를 읽습니다.

새로운 MT4에는 버튼 기능 이 있습니다 .. 하지만 그런 텍스트 상자를 읽는 기능을 찾을 수 없습니다

 
WDholic :

이전 MT4에서는 EA 원 클릭 거래를 생성하기 위해 dll 파일을 사용합니다.

매개변수를 입력 할 수 있습니다. LOT, TP SL은 흰색 텍스트 상자에 직접 입력할 수 있습니다.

구매 또는 판매를 클릭하면 .. 내 EA가 상자의 입력 텍스트를 읽습니다.

새로운 MT4에서 나는 버튼 기능을 봅니다. 그러나 나는 그런 읽기 텍스트 상자를 생성하는 기능을 찾을 수 없습니다

키보드 입력의 경우 OBJ_EDIT 개체 유형이 있습니다. Enter 키를 누르면 CHARTEVENT_OBJECT_ENDEDIT 이벤트가 발생합니다. 그러나 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);
}

내부의 텍스트를 편집하기 위해 이 버튼을 생성했으며 텍스트 문자열을 읽고 이중 또는 int 변수로 변환하고 싶지만 작동하지 않고 "이름이 있는 개체의 편집 필드에 있는 텍스트"가 인쇄되지 않습니다 . "로 변경되었습니다.

도와주세요?