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

 
Mihail Matkovskij # :

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

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

실험적으로 최소 및 최대 열거 값을 얻을 수도 있습니다. 가장 최적의 속도를 위해 이를 기록하고 StringToEnum에 지정합니다.

 int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template < typename T>
bool enumFindMinMax( const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
   int min, max;
  min = INT_MAX ; max = INT_MIN ;
  nEnum = 0 ;
   for ( int i = _minEnum; i <= _maxEnum && ! IsStopped (); i++) {
    enum_ = (T)i;
     if ( StringFind ( EnumToString (enum_), "::" , 0 ) >= 0 )
       continue ;
     if (i < min)
      min = i;
     if (i > max)
      max = i;
    nEnum++;
  }
   if (min != INT_MAX && max != INT_MIN ) {
    __min = min;
    __max = max;
     return true ;
  }
   return false ;
}

template < typename T>
bool enumFindMinMax( const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN , INT_MAX ); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart () {
   int min, max;
   if (enumFindMinMax(( ENUM_ACCOUNT_INFO_DOUBLE ) 0 , min, max, - 500 , 500 ))
     printf ( "enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d" , min, max, nEnum);
   else
     Print ( "enumFindMinMax Error!" );
}

스크립트 결과:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37 , max: 52 , Count: 14

ENUM_ACCOUNT_INFO_DOUBLE 을 열고 살펴보세요. 상수의 수는 Count(14)입니다. 따라서 응용 프로그램이 시작되면 필요한 모든 열거형을 처리하고 최소값과 최대값을 기록 하고 StringToEnum에서 해당하는 최소값과 최대값을 최적의 속도로 사용할 수 있습니다.

PS INT_MIN 및 INT_MAX가 있는 두 번째 옵션 enumFindMinMax는 실제로 매우 느립니다. 나는 그것을 먼저 시도했다. 그런 다음 enumFindMinMax 가 완료되기를 기다리는 데 지쳤습니다.   그리고 나는 -500에서 500 사이의 값을 넣습니다.

 if (enumFindMinMax(( ENUM_ACCOUNT_INFO_DOUBLE ) 0 , min, max, - 500 , 500 ))

따라서 전체 범위를 사용할 필요는 없다는 결론에 도달했습니다.

파일:
 

터미널의 이상한 동작에 직면했습니다.

상황은 다음과 같습니다. Expert Advisor는 특정 시점에 다른 차트를 열고 새 차트에 특정 템플릿을 설정하는 한 차트에서 작업합니다. 이 템플릿에는 새 차트에 대한 두 번째 Expert Advisor의 시작이 포함되어 있습니다.

주중에는 모든 것이 잘 작동하지만 닫힌 시장에서 주말에는 새 템플릿이 새 차트에서 시작되고(이는 차트 모양의 변화에서 알 수 있음) 두 번째 Expert Advisor는 시작하지 마십시오. 두 번째 Expert Advisor를 "푸시"하는 유일한 방법은 차트가 완전히 비어 있더라도 모든 스크립트를 수동으로 실행하는 것입니다. 그런 다음 새 차트의 두 번째 Expert Advisor가 작동하기 시작합니다.

나는 첫 번째 Expert Advisor와 ChartOpen 및 ChartApplyTemplate 함수 의 도움으로 그리고 CChart 클래스의 도움으로 이 코드를 작성했습니다. 폐쇄된 시장에서 새 차트의 두 번째 Expert Advisor는 시작되지 않습니다. 어떻게 든 터미널을 수동으로 "푸시"할 때까지.

누가 비슷한 얼굴을 할 수 있습니까? 이것을 처리하는 방법, "파기"할 방향은 무엇입니까?

 
akskarabey ChartApplyTemplate 함수 의 도움으로 그리고 CChart 클래스의 도움으로 이 코드를 작성했습니다. 폐쇄된 시장에서 새 차트의 두 번째 Expert Advisor는 시작되지 않습니다. 어떻게 든 터미널을 수동으로 "푸시"할 때까지.

누가 비슷한 얼굴을 할 수 있습니까? 이것을 처리하는 방법, "파기"할 방향은 무엇입니까?

시작되지 않는다는 것을 어떻게 결정했습니까? 이것은 어떻게 볼 수 있습니까?

추신

이렇게 시도

 int OnInit ()
{
....
....

 ChartRedraw ();
   return ( INIT_SUCCEEDED );
}
 
Mihail Matkovskij # :

열거형 함수( 18697 과 동일)를 사용하여 열거형에서 상수를 찾고, EnumToString을 사용하여 번역하고 찾고 있는 것과 비교할 수 있습니다. 결과를 반환하는 것만 남아 있습니다.

그러나 여전히 예(또는 최소한 핵심 라인)를 가질 수 있습니까? 그렇지 않으면 마음에 떠오르지 않는 것이 있습니까? 또한 왼쪽 값 중에서 필요한 값을 선별하여 방대한 값 목록을 반복할 것입니까, 아니면 유용한 값의 열거만 있는 것입니까? 현재로서는 걸러낼 것도 없고 목록에 좌파도 없는 것 같지만 ... 다만 그 생각에 집착할 수는 없습니다.

 
x572intraday # :

그러나 여전히 예(또는 최소한 핵심 라인)를 가질 수 있습니까? 그렇지 않으면 마음에 떠오르지 않는 것이 있습니까? 또한 왼쪽 값 중에서 필요한 값을 선별하여 방대한 값 목록을 반복할 것입니까, 아니면 유용한 값의 열거만 있는 것입니까? 현재로서는 걸러낼 것도 없고 목록에 좌파도 없는 것 같지만 ... 다만 그 생각에 집착할 수는 없습니다.

가능한 모든 enum 값을 반복하지 않으려면(정말 길기 때문에) 다음과 같은 준비를 해야 합니다. (캐싱 같은 것). 또한 이 함수 을 사용하면 필요한 모든 열거형의 범위를 알고 있는 문자열/문자열을 열거형으로 쉽게 변환할 수 있습니다. 또는 비교적 좁은 범위에서 열거형을 찾으십시오. .

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


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

시작되지 않는다는 것을 어떻게 결정했습니까? 이것은 어떻게 볼 수 있습니까?

추신

이렇게 시도

OnInit 섹션의 두 번째 Expert Advisor는 로그에 대한 결론을 도출하지만 로그에는 없습니다. 로그에 Expert Advisor의 시작에 대한 터미널의 짝수 메시지가 없습니다. 그리고 오른쪽 상단의 차트에는 전문가의 이름이 표시되지 않습니다.

 
12345678902003 # :
이를 위해 어떤 기능이 사용됩니까? mqlrates? 그리고 ObjectGet을 통해 거기에서 개체의 속성을 지정해야 합니다. OBJPROP_PRICE를 사용하는 경우 현재 막대까지 가격을 가져오는 방법을 지정해야 합니다.

얻을 그것을 얻을. 그리고 객체의 이름이나 객체의 종류와 이름으로 바의 가격이나 시간을 얻어서 객체의 특정 속성을 얻는 기능이 있습니다. 막대 번호는 아니지만 0에서 오프셋이 사용됩니다.

 
Valeriy Yastremskiy # :

얻을 그것을 얻을. 그리고 객체의 이름이나 객체의 종류와 이름으로 바의 가격이나 시간을 얻어서 객체의 특정 속성을 얻는 기능이 있습니다. 막대 번호는 아니지만 0에서 오프셋이 사용됩니다.

ObjectGetValueByTime() 함수를 사용하여 이 작업을 수행할 수 있습니다.

예시

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
내 문제는 다음과 같습니다. Terminal\MQL4\Indicators 폴더의 표시기 목록에 표시기가 있지만 이러한 표시기를 차트로 끌어온 목록의 MQL4 터미널 자체에는 이러한 동일한 표시기가 없습니다. 이러한 지표가 터미널 자체의 목록에 나타나도록 하여 터미널 차트에서 사용할 수 있도록 하는 방법   MQL4? 화면 오른쪽 에는 터미널 에서 사용할 수 있는 표시등이 있습니다.     MQL4, 그리고 그 왼쪽에는 폴더에 있는 동일한 터미널의 표시기가 있습니다.   MQL4 4\Indicators(예시)
파일:
 
Halina Okopna-Pecuch # :
내 문제는 다음과 같습니다. Terminal\MQL4\Indicators 폴더의 표시기 목록에 표시기가 있지만 MQL4 터미널 자체에 직접 이러한 표시기를 차트로 끌어온 목록에는 그러한 표시기가 없습니다. 이러한 지표가 터미널 자체의 목록에 나타나도록 하여 터미널 차트에서 사용할 수 있도록 하는 방법   MQL4? 화면 오른쪽 에는 터미널 에서 사용할 수 있는 표시등이 있습니다.     MQL4, 그리고 그 왼쪽에는 폴더에 있는 동일한 터미널의 표시기가 있습니다.   MQL4 4\Indicators(예시)

이는 지표가 아닐 가능성이 높습니다.