mql5 언어의 특징, 미묘함 및 작업 방법 - 페이지 165

 
fxsaber :

예, 역사 읽기가 있습니다.

당신은 내 지표가 느려진다고 썼습니다.
그 이유를 찾았습니다. 30,000건의 거래가 있는 계정에 업로드할 때.
브레이크를 낮추는데 성공했습니다. Times in 4. 히스토리 읽기를 약간 변경하고 코드를 최적화했습니다. 하지만 그들은 여전히 거기에 있습니다. 필터가 있고 하나의 필터를 클릭하면 모든 것이 다시 계산되기 때문입니다.
모든 것이 배열에서 읽혀지지만.
5000건의 거래가 있는 계정에서는 모든 것이 정상입니다. 그러나 큰 것이 문제입니다.
이는 해당 지표에만 적용되는 것은 아닙니다.

나는 깨끗한 역사 읽기 프로젝트 를 했다.
아마도 인터넷일 것입니다. 결국, 역사는 많은 데이터입니다.

 

거래, 자동 거래 시스템 및 거래 전략 테스트에 관한 포럼

라이브러리: Easy Canvas

니콜라이 셈코 , 2020.02.17 05:15

나는 캔버스가 테스터 모드에서 어떻게 작동하는지에 대한 중요한 점을 관심 있는 프로그래머에게 명확히 하고 싶습니다.
이 커뮤니티에서 잘 알려진 프로그래머가 다음과 같은 질문으로 저에게 접근했습니다.

- 테스터 모드에서 객체에 생성된 패널이 캔버스에 구현된 패널보다 10배 더 빠르게 다시 그려지는 반면 일반 모드에서는 모든 것이 캔버스의 속도로 순서대로 그려지는 이유는 무엇입니까?

이해하면서 이 문제의 원인과 해결 방법을 이해했습니다.

사실 개체의 경우 전체 화면의 다시 그리기와 함께 다시 그리기가 발생하며 테스터의 화면은 초당 30프레임 이하로 다시 그려집니다.

객체는 궁극적으로 동일한 캔버스(내부)이지만 객체의 속성을 변경하면 객체 캔버스가 형성되지 않고(재계산되지 않음) 테스터에서 발생하는 화면 새로 고침(ChartRedraw) 순간에만 형성됩니다. (그리고 일반 모드에서도) 우리의 눈이 변화를 구별할 수 있는 것보다 더 자주, 즉, 초당 ~32프레임 이하.

패널이 틱마다 변경된다고 가정해 보겠습니다. 그런 다음 기본 테스터에서 캔버스는 틱마다 다시 계산되지만 테스터에서 다시 그리기는 여전히 ~30밀리초(초당 ~30프레임)를 넘지 않습니다.

즉, 캔버스는 실제로 화면에 표시되는 것보다 훨씬 더 자주 다시 계산되므로 리소스가 불균형적으로 과도하게 지출됩니다.

이 문제에 대한 해결책은 컴퓨터 시간의 15-30밀리초마다 한 번 이상 캔버스의 재계산 및 다시 그리기를 제어하는 것입니다. 그러면 빈 재계산의 불필요한 주기가 없습니다.

예를 들면 다음과 같습니다.

 void OnTick ()
  {
   static uint lastCalc= 0 ;
   uint cur= GetTickCount ();
   if (cur-lastCalc> 15 ) {
    ReDrawMyCanvas();
    lastCalc=cur;
   }
  }

 
예를 들어, "EURUSD.txt"(큰 문자) 파일을 생성해야 하고 디스크에 이미 "eurusd.txt"(작은 문자)가 있는 경우 파일 이름은 이전과 동일합니다.
 
fxsaber :
예를 들어, "EURUSD.txt"(큰 문자) 파일을 생성해야 하고 디스크에 이미 "eurusd.txt"(작은 문자)가 있는 경우 파일 이름은 이전과 동일합니다.

또한 EURUSD TicksLongOpt.set을 저장하면 eurusd tickslongopt.set이 저장됩니다. 나중에 이름을 바꿔야 합니다. 그리고 그런 짜증나는 작은 것들이 많이 있습니다.

 
Edgar Akhmadeev :

또한 EURUSD TicksLongOpt.set을 저장하면 eurusd tickslongopt.set이 저장됩니다. 나중에 이름을 바꿔야 합니다. 그리고 그런 짜증나는 작은 것들이 많이 있습니다.

먼저 삭제하고 생성하면 모든 것이 잘 될 것이라고 생각합니다.

 
fxsaber :

먼저 삭제하고 생성하면 모든 것이 잘 될 것이라고 생각합니다.

아니요, 터미널 대화 상자에서 저장할 때만 새 파일을 만드는 것에 대해 이야기하고 있습니다. 모든 사람이 그것을 가지고 있지 않다면 그것은 다른 것에 달려 있습니다. 참고로 저는 Win7을 가지고 있습니다.

 
Edgar Akhmadeev :

아니요, 터미널 대화 상자에서 저장할 때만 새 파일을 만드는 것에 대해 이야기하고 있습니다. 모든 사람이 가지고 있지 않다면 다른 것에 달려 있습니다. 참고로 저는 Win7을 가지고 있습니다.

FileOpen 및 FileSave 기능을 의미합니다.

 
fxsaber :

FileOpen 및 FileSave 기능을 의미합니다.

예, 이제야 그것이 적절하지 않다는 것을 깨달았습니다. 주제는 언어에 관한 것입니다 ...

 
fxsaber :
구조 배열의 편리한 정렬


애플리케이션


결과

작동하지 않습니다. 업데이트할 수 있습니까? 쓰기 템플릿 선언은 로컬 클래스 TestarrSort.mq5 에서 허용되지 않습니다. 81

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                            \
{                                                                                \
   class SORT                                                                     \
  {                                                                              \
   private :                                                                       \
     template < typename T>                                                        \
     static void Swap( T &Array[], const int i, const int j )                     \
    {                                                                            \
       const T Temp = Array[i];                                                   \
                                                                                 \
      Array[i] = Array[j];                                                       \
      Array[j] = Temp;                                                           \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
     template < typename T>                                                        \
     static int Partition( T &Array[], const int Start, const int End )           \
    {                                                                            \
       int Marker = Start;                                                        \
                                                                                 \          
       for ( int i = Start; i <= End; i++)                                         \
         if (Array[i]. ##FIELD <= Array[End]. ##FIELD)                               \
        {                                                                        \
          SORT::Swap(Array, i, Marker);                                          \
                                                                                 \
          Marker++;                                                              \
        }                                                                        \
                                                                                 \
       return (Marker - 1 );                                                       \
    }                                                                            \
                                                                                 \
     template < typename T>                                                        \
     static void QuickSort( T &Array[], const int Start, const int End )          \
    {                                                                            \
       if (Start < End)                                                           \
      {                                                                          \
         const int Pivot = Partition(Array, Start, End);                          \
                                                                                 \
        SORT::QuickSort(Array, Start, Pivot - 1 );                                \
        SORT::QuickSort(Array, Pivot + 1 , End);                                  \
      }                                                                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
                                                                                 \
   public :                                                                        \
     template < typename T>                                                        \ 
     static void Sort( T &Array[], int Count = WHOLE_ARRAY , const int Start = 0 ) \
    {                                                                            \
       if (Count == WHOLE_ARRAY )                                                  \
        Count = :: ArraySize (Array)- Start; ;                                     \
                                                                                 \
      SORT::QuickSort(Array, Start, Start + Count - 1 );                          \
                                                                                 \
       return ;                                                                    \
    }                                                                            \
  };                                                                             \
                                                                                 \
  SORT::Sort(ARRAY);                                                             \
}                                                                                \


void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
  ArraySortStruct(Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
  ArraySortStruct(Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
  ArraySortStruct(Rates, time);
   ArrayPrint (Rates);
}

 
Vladimir Pastushak :

작동하지 않습니다. 업데이트할 수 있습니까? 쓰기 템플릿 선언은 로컬 클래스 TestarrSort.mq5 에서 허용되지 않습니다. 81

불행히도 언어의 가능성 은 차단되었습니다. 이 코드는 작동하지 않습니다.

 void OnStart ()
{
   class A
  {
     template < typename T> // template declarations are not allowed in local classes
     void f() {}
  };
}


그러나 대안을 시도할 수 있습니다.

 template < typename T>                                       
void ArrayReindex( T &Array[], const double &TmpSort[][ 2 ] )
{                         
  T TmpArray[];
  
   for ( int i = :: ArrayResize (TmpArray, :: ArrayRange (TmpSort, 0 )) - 1 ; i >= 0 ; i--)
    TmpArray[i] = Array[( int )(TmpSort[i][ 1 ] + 0.1 )];
    
  :: ArraySwap (Array, TmpArray);
              
   return ;     
}             

// Сортировка массива структур и указателей на объекты по (под-) полю/методу.
#define ArraySortStruct(ARRAY, FIELD)                                      \
{                                                                          \
   double TmpSort[][ 2 ];                                                     \
                                                                           \
   for ( int i =:: ArrayResize (TmpSort, :: ArraySize (ARRAY)) - 1 ; i >= 0 ; i--) \
  {                                                                        \
    TmpSort[i][ 0 ] = ( double )ARRAY[i].FIELD;                                \
    TmpSort[i][ 1 ] = i;                                                     \
  }                                                                        \
                                                                           \
  :: ArraySort (TmpSort);                                                    \
  ::ArrayReindex(ARRAY, TmpSort);                                          \
}                                         

void OnStart ()
{
   MqlRates Rates[];
  
   CopyRates ( _Symbol , PERIOD_CURRENT , 0 , 5 , Rates); // Взяли бары
  
   Print ( "\nБары без сортировки - как получили." );
   ArrayPrint (Rates);
  
   Print ( "\nСортируем по open-цене." );
  ArraySortStruct(Rates, open);
   ArrayPrint (Rates);

   Print ( "\nСортируем по high-цене." );
  ArraySortStruct(Rates, high);
   ArrayPrint (Rates);

   Print ( "\nСортируем по времени." );
  ArraySortStruct(Rates, time);
   ArrayPrint (Rates);
}


ZY 여기는 또 다른 사용 예입니다.