MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 1877

 
Maksim Emeliashin 정적 배열 및 이 배열에서 문자열 검색과 같은 자전거가 필요합니다.

MQL의 경우 기능이 올바르게 작동하지 않습니다.

 template < typename T>
bool StringToEnum( const string i_str, T &o_val)
{
   for ( int i = 0 ; i < 256 ; i++)
      {
         o_val = (T)i;
         if ( StringCompare ( EnumToString (o_val), i_str, false ) == 0 )
             return ( true );
      }
   o_val = WRONG_VALUE ;
   return ( false );
}

https://www.mql5.com/ru/docs/strings/stringcompare

옵션

문자열1

【인】 첫 번째 줄.

문자열2

【인】 두 번째 줄.

case_sensitive=참

【인】 대소문자를 구분하는 모드입니다. 값이 true이면 "A">"a"입니다. 값이 false 이면 "A"="a" 입니다. 매개변수의 기본값은 true입니다.

enum에 두 개의 상수(예: ENUM1 및 enum1)가 있는 경우 i_str: " enum1 "을 사용하여 함수는 상수 ENUM1의 값을 반환할 수 있습니다. 그리고 왜 StringCompare 입니까? 다음과 같이 할 수 있다면:

 template < typename T>
bool StringToEnum( const string i_str, T &o_val)
{
   for ( int i = INT_MIN ; i <= INT_MAX && ! IsStopped (); i++) // перебор всех возможных значений int
      {
         o_val = (T)i;
         if (i_str == EnumToString (o_val))
             return ( true );
      }
   o_val = WRONG_VALUE ;
   return ( false );
}
 
Amon1953 로 포지션을 청산하는 이유를 이해하지 못합니다.

이것은 다음에 무엇을 할 것인지 결정하기 위해 필요합니다.

MT5 단말기의 히스토리 창에서 거래, 주문 또는 포지션을 선택할 수 있습니다.

DEAL_REASON이 DEAL_REASON_SL과 동일한 DEAL의 거래 내역을 확인해야 합니다.


추가됨: 모든 것을 단순화할 수 있습니다. OnTradeTransaction에서 거래 TRADE_TRANSACTION_DEAL_ADD를 포착하고 거래 내역을 참조하여 이 거래를 생성한 DEAL 을 확인하는 것으로 충분합니다. 그런 다음 동일한 제조법: ... DEAL_REASON은 DEAL_REASON_SL과 같습니다.

 
Mihail Matkovskij # :

MQL의 경우 기능이 올바르게 작동하지 않습니다.

https://www.mql5.com/ru/docs/strings/stringcompare

enum에 두 개의 상수(예: ENUM1 및 enum1)가 있는 경우 i_str: " enum1 "을 사용하여 함수는 상수 ENUM1의 값을 반환할 수 있습니다. 그리고 왜 StringCompare 입니까? 다음과 같이 할 수 있다면:

그리고 더 빠른 버전:

 template < typename T>
bool StringToEnum( const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for ( int i = i_min_enum; i <= i_max_enum && ! IsStopped (); i++) 
      {
         o_val = (T)i;
         if (i_str == EnumToString (o_val))
             return ( true );
      }
   o_val = WRONG_VALUE ;
   return ( false );
}

bool StringToEnum( const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN , INT_MAX ); } // медленный вариант
 
Alexey Viktorov # :

그리고 이 모든 것이 왜 필요한가? ENUM_TIMEFRAMES의 숫자 값을 자신의 숫자 값으로 바꾸시겠습니까? 또는 무엇을?

글쎄, 지금은 지표와 EA 매개변수의 설정을 데이터베이스에 기록해야 합니다. 동시에 다음을 원합니다.

1. 사람이 읽을 수 있는 기록

2. 기계 판독 가능한 기록

3. 사용자 지정 열거형에 새 값을 추가하는 것에 대한 저항(반드시 끝은 아님).

EnumToString 작성에는 문제가 없지만 개발자들은 다른 모든 유형과 달리 역기능을 수행하지 않았습니다.

 
Mihail Matkovskij # :

그리고 더 빠른 버전:

나는 대소문자를 무시하는 비교에 동의합니다. 소문자를 사용하지 않는 내 자신의 열거형을 위해 더 일반화된 자전거를 작성했습니다.

그러나 ENUM_TIMEFRAMES에 대해 이 옵션을 실행하는 경우:

 bool StringToEnum( const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN , INT_MAX ); } // медленный вариант
예를 들어 PERIOD_MN1의 경우 그가 데리러 오는 동안 커피를 마실 수 있습니다. :)
 
Valeriy Yastremskiy # :

각 막대의 직선에서 가격을 구하고 차이의 교차점의 표시가 바뀌는 곳에서 비교하거나 차이를 찾으십시오) 그런데 막대에 평등이 없을 수 있습니다.

이를 위해 어떤 기능이 사용됩니까? mqlrates? 그리고 ObjectGet을 통해 거기에서 개체의 속성을 지정해야 합니다. OBJPROP_PRICE를 사용하는 경우 현재 막대까지 가격을 가져오는 방법을 지정해야 합니다.
 
12345678902003 # :
도와주세요. 저는 두 개의 Gann 선을 그리고 있으며 특정 지점에서 교차합니다. 이 선이 교차하는 지점의 좌표를 찾아야 합니다.
Gann 라인의 두 번째 점의 가격을 결정할 수 있다면 KimIV 가 더 많은 도움을 줄 것입니다.
 
Maksim Emeliashin # :

나는 대소문자를 무시하는 비교에 동의합니다. 소문자를 사용하지 않는 내 자신의 열거형을 위해 더 일반화된 자전거를 작성했습니다.

그러나 ENUM_TIMEFRAMES에 대해 이 옵션을 실행하는 경우:

예를 들어 PERIOD_MN1의 경우 그가 데리러 오는 동안 커피를 마실 수 있습니다. :)

글쎄, ENUM_TIMEFRAMES에서 최소값과 최대값이 알려져 있습니다. 따라서 명시적으로 지정할 수 있습니다.

나머지 열거형을 사용하면 대략적인 값 범위를 아는 것으로 충분합니다. 열거형 선언에 상수가 지정되지 않은 경우 값은 일반적으로 0부터 시작합니다. i_max_enum은 50, 100, 255와 같이 두 자리 또는 세 자리 숫자로 설정할 수 있습니다.

 
Maksim Emeliashin # :

글쎄, 지금은 지표와 EA 매개변수의 설정을 데이터베이스에 기록해야 합니다. 동시에 다음을 원합니다.

1. 사람이 읽을 수 있는 기록

2. 기계 판독 가능한 기록

3. 사용자 지정 열거형에 새 값을 추가하는 것에 대한 저항(반드시 끝은 아님).

EnumToString 작성에는 문제가 없지만 개발자들은 다른 모든 유형과 달리 역기능을 수행하지 않았습니다.

열거형을 인쇄해 본 적이 있습니까?

 Print ( PERIOD_M5 );

무엇을 인쇄할 것 같습니까?


하지만 프로그래밍 방식으로 열거형을 만들려면 ... 예, 그렇습니다. 흥미로울 것입니다.

 
x572intraday # :
음, 입력 매개변수가 루프에서 정렬될 수 없는 이유는 무엇입니까? 왜 우리를 이렇게 벌하시는 겁니까?
이것은 물론 목발이지만 나는 그것을 사용합니다. 주어진 구분 기호를 통해 필요한 모든 데이터를 문자열 입력 변수에 입력한 다음 StringSplit을 사용하여 배열로 추월합니다.