MQL4/MQL5에서 열거형 및 항목의 길이를 얻는 방법은 무엇입니까? - 페이지 4

 
나는 그가 모든 지표 입력을 캡처하는 방법을 찾고 있다고 생각합니다
각 지표에 대한 입력 값의 필요성을 우회하는 EA에서.
백테스터 의 대안은 모든 지표를 수동으로 편집하는 것입니다.
신호 버퍼로 .
 

이것을 약간 간단하게 시도하지만 지금까지 가능한 유일한 방법입니다.

 enum XXX {x1 = - 10 , x2 = 0 , x3 = 11 };

template < typename E>
int EnumToArray(E dummy, int &values[], const int start = INT_MIN , const int stop = INT_MAX )
{
   string t = typename (E) + "::" ;
   int length = StringLen (t);
  
   ArrayResize (values, 0 );
   int count = 0 ;
  
   for ( int i = start; i < stop && ! IsStopped (); i++)
  {
    E e = (E)i;
     if ( StringCompare ( StringSubstr ( EnumToString (e), 0 , length), t) != 0 )
    {
       ArrayResize (values, count + 1 );
      values[count++] = i;
    }
  }
   return count;
}

int OnInit ()
{
   Print ( "ENUM elements:" );
  XXX a;
   int result[];
   int n = EnumToArray(a, result, - 100 , 100 );
   Print ( "Count=" , n);
   for ( int i = 0 ; i < n; i++)
  {
     Print (i, " " , EnumToString ((XXX)result[i]), "=" , result[i]);
  }
  
   return 0 ;
}

출력:

ENUM 요소:

개수=3

0 x1=-10

1 x2=0

2 x3=11

최소에서 최대 정수 값(매개변수를 건너뛸 때 기본적으로 사용됨)이 내부에서 사용되는 문자열 함수 를 고려할 때 너무 느리게 실행되기 때문에 매개변수 startstop 에 대해 합리적인 값을 지정하는 것이 중요합니다.

 
   template<typename ENUMTYPE>
   bool              AddEnum(ENUMTYPE enumIn) {
      enumIn = 0;
      
      //iterate through enum and add as combo box
      for(int i = 0; i<sizeof(enumIn); i++, enumIn++) {
         m_list.AddItem(EnumToString(enumIn),i);
         PrintFormat("adding %i = %s", i, EnumToString(enumIn));            
       }
      return(0);  
   }


이것을 CComboBox 클래스에 추가하여 모든 ENUM 유형을 전달할 수 있으며 콤보 상자로 추가됩니다.


그러나 필요한 작업을 수행하도록 변경할 수 있습니다.

문제는 ENUM을 전달하지 않고 double 또는 float와 같은 것을 전달하면 앱이 충돌할 수 있다는 것입니다.

전달된 데이터 유형을 확인할 방법이 없다고 생각합니다.

 
dazamate :
   template<typename ENUMTYPE>
   bool              AddEnum(ENUMTYPE enumIn) {
      enumIn = 0;
      
      //iterate through enum and add as combo box
      for(int i = 0; i<sizeof(enumIn); i++, enumIn++) {
         m_list.AddItem(EnumToString(enumIn),i);
         PrintFormat("adding %i = %s", i, EnumToString(enumIn));            
       }
      return(0);  
   }


이것을 CComboBox 클래스에 추가하여 모든 ENUM 유형을 전달할 수 있으며 콤보 상자로 추가됩니다.


그러나 필요한 작업을 수행하도록 변경할 수 있습니다.

문제는 ENUM을 전달하지 않고 double 또는 float와 같은 것을 전달하면 앱이 충돌할 수 있다는 것입니다.

전달된 데이터 유형을 확인할 방법이 없다고 생각합니다.

sizeof(enumIn)이 항상 4와 같을까봐 두렵습니다.
 

네 그렇습니다. 나는 그것을 눈치 챘다.

내가 이것을 만들 때 실제로 발생하는 ENUM에는 실제로 4 개의 속성 이 있습니다.

 

열거형 Combolist1{항목1, 항목2, 항목3, 항목4, 항목5};

for(int i = 0; GetLastError()==0; i++) {
ComboBox1.ItemAdd(EnumToString(Combolist1(i)),Combolist1(0));
}
 
Xiangdong Guo : MQL4/MQL5에서 열거형 및 항목의 길이를 얻는 방법은 무엇입니까?

예를 들어 열거형 정의가 있습니다.

 enum ENUM_FRUIT {APPLE, BANANA, GRAPE};

다음으로 루프에서 사용하고 싶습니다.

 for ( int i = 0 ; i < length_of_enum; i++) {
   Print ( EnumToString (get_enum_item(i)));
} 
방법이 없으니 코딩을 하셔야 합니다.
입력이 되지 않을 경우 이 패턴을 사용합니다.
enum ENUM_FRUIT {APPLE, BANANA, GRAPE,
                 FRUIT_FIRST=APPLE, FRUIT_LAST=GRAPE};
for (ENUM_FRUIT i = APPLE; i <= FRUIT_LAST; ++i) {
   Print ( EnumToString (i));
}
증분(++i)과 함께 사용하면 숫자적으로 인접해 있다고 가정합니다.
입력이 될 경우 이 패턴을 사용합니다.
enum ENUM_FRUIT {APPLE, BANANA, GRAPE}
#define FRUIT_FIRST APPLE
#define FRUIT_LAST  GRAPE
for (ENUM_FRUIT i = APPLE; i <= FRUIT_LAST; ++i) {
   Print ( EnumToString (i));
}
숫자적으로 인접하지 않은 경우
const ENUM_TIMEFRAMES   gcPeriods[]={   PERIOD_CURRENT ,
   PERIOD_M1 ,   PERIOD_M2 ,   PERIOD_M3 ,   PERIOD_M4 ,   PERIOD_M5 ,   PERIOD_M6 ,
   PERIOD_M10 , PERIOD_M12 , PERIOD_M15 , PERIOD_M20 , PERIOD_M30 , PERIOD_H1 ,
   PERIOD_H2 ,   PERIOD_H3 ,   PERIOD_H4 ,   PERIOD_H6 ,   PERIOD_H8 ,   PERIOD_H12 ,
   PERIOD_D1 ,   PERIOD_W1 ,   PERIOD_MN1 };
ENUM_TIMEFRAMES   next( ENUM_TIMEFRAMES curr){
   for ( int i= 0 ; gcPeriods[i] != curr; ++i){}
   return gcPeriods[i+ 1 ];
}
 
Lorentzos Roussos :
무엇의 나쁜 디자인

enum의 가맹점 수를 의미합니까?

 

나는 이 대화가 꽤 오래되었다는 것을 알고 있지만 여기에 모든 열거형 유형의 배열을 채우는 쉬운 방법이 있습니다.


 void OnStart ()
{
   ENUM_TIMEFRAMES array[];
   int total_elements = enumFillArray(array);
   printf ("There are %d elements in the ENUM_TIMEFRAMES array.",
      total_elements
   );
   
   for ( int i= 0 ;i<total_elements;i++)
       Print ( EnumToString (array[i]));
}
   
template < typename T>
int enumFillArray(T& res_array[])
{
   ArrayResize (res_array, 0 );
   int iter = 100000 ;
   for ( int i=-iter;i<iter;i++)
       if ( StringFind ( EnumToString ((T)i),"::")< 0 )
      {
         int index = ArrayResize (res_array, ArraySize (res_array)+ 1 )- 1 ;
         res_array[index] = (T)i;
      }
   return ArraySize (res_array);
}
 

이 문제를 해결한 방법에 대해 미래 세대를 위한 솔루션을 추가하기만 하면 됩니다.

따라서 문제는 열거형 값을 추가하거나 제거 하는 기능으로 열거형의 항목 수를 동적으로 아는 것입니다. 열거형 값을 배열 인덱스로 사용하여 고정 크기 배열을 생성하려면 이것을 알아야 합니다. 내가 하는 경향은 길이 값으로만 사용되는 예약된 값을 열거형 끝에 추가하는 것입니다. 여기 예가 있습니다.

 enum ENUM_ENTRIES
{
        SMALL_ENTRY = 0 ,
        MEDIUM_ENTRY,
        LARGE_ENTRY,
        VERY_LARGE_ENTRY,
        _ENUM_ENTRIES
};

ObjectType *entryArray[_ENUM_ENTRIES];

// Setting individual entries
entryArray[MEDIUM_ENTRY] = new ObjectType();
entryArray[LARGE_ENTRY] = new ObjectType();

// Looping through the array
for ( int i = 0 ; i < _ENUM_ENTRIES; i++) {

        entryArray[i] = new ObjectType();       
}
다음과 같이 마지막 항목에 고정할 필요가 없기 때문에 이것은 훌륭하고 쉽습니다.
 // Fixed to last entry +1
ObjectType *entryArray[VERY_LARGE_ENTRY + 1 ];

for ( int i = 0 ; i <= VERY_LARGE_ENTRY; i++) {

}

또는 열거형 끝에 더 많은 항목을 추가할 수 있으며 배열과 루프는 계속 작동합니다.

 /*
 *  Expanded enum entries
 */
enum ENUM_ENTRIES
{
        SMALL_ENTRY = 0 ,
        MEDIUM_ENTRY,
        LARGE_ENTRY,
        VERY_LARGE_ENTRY,
        EXTRA_LARGE_ENTRY,
        EXTREMELY_LARGE_ENTRY,
        _ENUM_ENTRIES
};

/* 
 * Previous code untouched and still works
 */

ObjectType *entryArray[_ENUM_ENTRIES];

// Setting individual entries
entryArray[MEDIUM_ENTRY] = new ObjectType();
entryArray[LARGE_ENTRY] = new ObjectType();

// Looping through the array
for ( int i = 0 ; i < _ENUM_ENTRIES; i++) {

        entryArray[i] = new ObjectType();       
}
Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Symbol Properties
Documentation on MQL5: Constants, Enumerations and Structures / Environment State / Symbol Properties
  • www.mql5.com
To obtain the current market information there are several functions: SymbolInfoInteger(), SymbolInfoDouble() and SymbolInfoString(). The first parameter is the symbol name, the values of the second function parameter can be one of the identifiers of ENUM_SYMBOL_INFO_INTEGER, ENUM_SYMBOL_INFO_DOUBLE and ENUM_SYMBOL_INFO_STRING. Some symbols...