오류, 버그, 질문 - 페이지 2460

 
ME의 개발자는 CTRL+SHIFT+F를 누르고 "MQL5Info"를 입력해야 합니다. 수신된 SB 파일에서 발견된 기초를 수정합니다.
 
프로젝트 코드의 문제를 강조하기 위해 2시간을 죽였습니다.
 #define PRINT(x) Print ( #x, ":" , string (x))

template < typename DATA_TYPE>
struct Wrapper{
   uchar type;
   DATA_TYPE data;
   
   template < typename T>
   void operator =(T value){                   // при замене данной строки на "void operator=(T &value){" происходит перезапись оператора присвоения в классе наследнике B (код не компилируется).
       this .data = value;   
   };
   
   void operator =(DATA_TYPE &_data){
       this .data = _data;   
   };
};

struct A{
   string data;
   
   void operator =( string value){
      data = value;
   };
};

struct B : Wrapper<A>{};


void OnStart (){  
  B b;
  
   string str_value;
  b = str_value;
  
  A a;
  b = a;
  
  B b1;
  b = b1;
}


아래 코드를 사용하면 모든 것이 예상대로 작동합니다.
그러나 기능을 확장하고 클래스 A의 (문자열)과 같은 단순 유형뿐만 아니라 구조에 대한 지원을 추가하려고 하면
기본 클래스의 템플릿 할당 연산자가 상속인 클래스의 기본 할당 연산자를 재정의하기 시작하여 모든 기능을 완전히 죽이는 것으로 나타났습니다.
"operator*="와 같은 다른 연산자를 해결 방법으로 사용할 수 있지만 그게 요점이 아닙니다.


개발자:
기본적으로 할당 연산자(복사 생성자)에 대한 강제 코드 생성을 지정하는 기능을 추가하세요.
class_name & class_name :: operator = ( const class_name & ) = default ;  
class_name & class_name :: operator = ( const class_name & ) = delete ;   
 

내가 조언자에서 표준 지표(예: iMA)를 사용하는 경우,

시각화 창에 올바르게 표시되도록 드로잉 스타일 을 설정하는 방법은 무엇입니까?

 
Игорь Евдокимов :

내가 조언자에서 표준 지표(예: iMA)를 사용하는 경우,

시각화 창에 올바르게 표시되도록 드로잉 스타일 을 설정하는 방법은 무엇입니까?

다음과 같이: 사용자 정의 이동 평균 입력 색상

 
지식이 풍부한 사람들, 말해! 실제 기호를 기반으로 한 사용자 지정 기호 가 있습니다. 이 기호의 차트에서 거래를 가능하게 하는 방법은 무엇입니까? 아니면 MT5에는 그런 기능이 없나요?
 
Vladimir Karputov :

다음과 같이: 사용자 정의 이동 평균 입력 색상

즉, 실제로 자신의 지표를 작성해야 합니다. 표준 지표를 다시 작성하는 것은 선택 사항이 아닙니다.

문제는 정확히 표준 지표의 스타일을 지정하는 방법이었습니다.

다른 방법이 있습니까?

 
최신 버전의 MT에서는 문자열 작업에 대한 패러다임 전환의 일환으로 NULL 종료 문자열 사용을 거부했습니다.
그러나 StringSetLength 함수의 작업은 여러 가지 질문을 제기합니다.

StringSetLength의 도움으로 문자열의 길이를 트리밍할 수만 있고 늘리는 방법은 알 수 없습니다.
의도된 동작입니까?

 #define PRINT(x) Print ( #x, ":" , string (x))

void OnStart (){  
   string str = "123456789" ;
  PRINT(str);
  PRINT( StringLen (str));
  
  
  PRINT( StringSetLength (str, StringLen (str)- 1 ));
  PRINT(str);
  PRINT( StringLen (str));
  
  PRINT( StringSetLength (str, StringLen (str)+ 2 ));
  PRINT(str);
  PRINT( StringLen (str));
}

결과:
 2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)      str: 123456789
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringLen (str): 9
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringSetLength (str, StringLen (str)- 1 ): true
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)      str: 12345678
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringLen (str): 8
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringSetLength (str, StringLen (str)+ 2 ): false
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)      str: 12345678
2019.05 . 15 01 : 22 : 08.208 StringFormat_1 (EURUSD,H1)       StringLen (str): 8
 
"새" 문자가 0x0000으로 초기화된 "전체" StringSetLength 를 구현하는 것보다 사용자가 스스로 총을 쏘는 것이 더 쉽습니다.

 #define PRINT(x) Print ( #x, ":" , string (x))

void OnStart (){  
   string str = "123\x0000\x0000\x0000\x0000456789" ;
  PRINT(str);
  PRINT( StringLen (str));                                                  // StringLen(str):13      StringLen поддерживает работу с 0х0000 short value
  
  PRINT(StringSetLength_using_StringInit(str, 100 ));                      // false                  StringInit           не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_ShortArrayToString(str, 100 ));              // false                  ShortArrayToString   не поддерживает работу с 0х0000 short value
  PRINT(StringSetLength_using_StringInit_with_StringFill(str, 100 ));      // false                  StringFill           не поддерживает работу с 0х0000 short value
}


bool StringSetLength_using_StringInit( string &string_var, int new_length){
   bool result = false ;

   int prev_length = StringLen (string_var);
   if (new_length == prev_length){
      result = true ;
       return result;
   }
   
   string data = string_var;   
   if (new_length < prev_length){
       StringSetLength (data, new_length);
   } else {
       string string_tail;
       StringInit (string_tail, new_length - prev_length, 0x0000 );
      data += string_tail;
   }
   
   if ( StringLen (data) == new_length){
      string_var = data;
      result = true ;
   }
   return result;
}

bool StringSetLength_using_ShortArrayToString( string &string_var, int new_length){
   bool result = false ;

   int prev_length = StringLen (string_var);
   if (new_length == prev_length){
      result = true ;
       return result;
   }
   
   string data = string_var;   
   if (new_length < prev_length){
       StringSetLength (data, new_length);
   } else {    
       short data_array[];
       StringToShortArray (data, data_array);
       ArrayResize (data_array, new_length);
       ArrayFill (data_array, prev_length, new_length - prev_length, 0x0000 );
      data = ShortArrayToString (data_array, 0 , new_length);
   }
   
   if ( StringLen (data) == new_length){
      string_var = data;
      result = true ;
   }
   return result;
}

bool StringSetLength_using_StringInit_with_StringFill( string &string_var, int new_length){
   bool result = false ;

   int prev_length = StringLen (string_var);
   if (new_length == prev_length){
      result = true ;
       return result;
   }
   
   string data = string_var;   
   if (new_length < prev_length){
       StringSetLength (data, new_length);
   } else {    
       string string_tail;
       StringInit (string_tail, new_length - prev_length, 0x1111 );
       StringFill (string_tail, 0x0000 );
      data += string_tail;
   }
   
   if ( StringLen (data) == new_length){
      string_var = data;
      result = true ;
   }
   return result;
}
 
Sergey Dzyublik :
최근 버전의 MT에서는 문자열 작업에 대한 패러다임 전환의 일환으로 NULL 종료 문자열 사용을 거부했습니다.

이 아이디어에 대해 자세히 설명해 주시겠습니까?

 
rsrozhkov :
지식이 풍부한 사람들, 말해! 실제 기호를 기반으로 한 사용자 지정 기호가 있습니다. 이 기호의 차트에서 거래를 가능하게 하는 방법은 무엇입니까? 아니면 MT5에는 그런 기능이 없나요?

답은 자명합니다. 사용자 지정 기호 는 실제 기호에서 일부 변환을 통해 얻습니다. 누군가(EA, 스크립트 또는 수동) 역변환을 수행하고 실제 기호에 대한 주문을 제출해야 합니다.