일반 클래스 라이브러리 - 버그, 설명, 질문, 사용 기능 및 제안 사항 - 페이지 28

 
Alexey Volchanskiy :

도대체 여기서 또 무슨 일이? LinkedList 주제에 대한 적절한 게시물을 삭제합니다. 그래서 나는 유럽 어딘가에 익명의 중재자가 앉아 증오하는 러시아인의 게시물을 삭제하고 화가 나서 킥킥대는 모습을 상상합니다. 일종의 쓰레기 덤프, 쓰고 싶은 욕구가 사라집니다.

공장과 싸우는 것이 좋습니다. 이 스레드에는 삭제된 게시물이 없습니다.

 
Artyom Trishkin :

공장과 싸우는 것이 좋습니다. 이 스레드에는 삭제된 게시물이 없습니다.

아르템, 난 취한 것도 아니고 마약에 취한 것도 아니야. 30분 전에 나는 MQL LinkedList가 구현되었다는 짧은 답변을 썼습니다. 정확히 어떻게 링 버퍼 가 구현되었고 설명된 동작은 괜찮습니다. 그리고 필터를 일반 배열에서 링 버퍼로 만듭니다. 그런 다음 구현을 보기 위해 .NET 소스에 들어갔고 30분 후에 내 메시지가 삭제되었습니다. 네, 처음이죠?

나는 러시아 중재자에 대해 생각하지 않습니다.

다음은 FIR 필터 클래스입니다. double FilterTick(double tick) 함수를 참조하십시오. 링 버퍼는 입력 틱과 출력 필터링된 값의 두 가지뿐입니다. 연결 목록과의 차이점은 옵션이 더 적지만 나에게 중요한 것은 훨씬 더 빠르다는 것입니다.

 #ifndef Filter
#define Filter

//+------------------------------------------------------------------+
//|                                                       Filter.mqh |
//|                                               Alexey Volchanskiy |
//|                                      https://mql4.wordpress.com/ |
//+------------------------------------------------------------------+
#property copyright "Alexey Volchanskiy"
#property link        "https://mql4.wordpress.com/"
#property version    "1.04"
#property strict
#include <Object.mqh>
#include <AvLib- 4 - 5 \coeff.mqh>
#include <AvLib- 4 - 5 \Errors.mqh>

/*
Формат массива или файла коэффициентов фильтра
double coeff[] = {FiltersCount, FilterAddr, FilterLen, FilterAddr, FilterLen..., coeff1, coeff2, coeff3...};
*/
enum EErrors {EOk, ENumFilterOutOfRange};

class CFilter : CObject
{
#define TICK_BUF_SIZE       0x1000                // 4096
#define TICK_BUF_MAX_IDX    (TICK_BUF_SIZE - 1 ) // 0xFFF
#define OUT_BUF_SIZE         0x10000              // 65536
#define OUT_BUF_MAX_IDX     (OUT_BUF_SIZE - 1 )   // 0xFFFF   

private :
     double   TickBuf[TICK_BUF_SIZE]; // промежуточный кольцевой буфер для хранения тиков
     double   OutBuf[OUT_BUF_SIZE];   // выходной кольцевой буфер
     double   Coeff[];                 // массив коэффициентов
     int      TickBufIdx;             // индекс для нового входящего тика в TickBuf
     int      OutBufIdx;               // индекс для выходного буфера 
public :
     enum Errors {OK, NUM_FILTER_OUT_OF_RANGE };  
public :
    CFilter() {}
    ~CFilter() 
    {
         ArrayFree (Coeff);
    }
    
     double   GetOutBuf( const int idx)
    {
         int tmp = OutBufIdx-idx- 1 ;
         double out = tmp >= 0 ? OutBuf[tmp] : OutBuf[OUT_BUF_SIZE+(tmp)]; 
         return out;
    }

     void     Init()
    {
        TickBufIdx = TICK_BUF_MAX_IDX;
        OutBufIdx = 0 ;
         for ( int n = 0 ; n < TICK_BUF_SIZE; n++)
            TickBuf[n] = 0 ;
         for ( int n = 0 ; n < OUT_BUF_SIZE; n++)
            OutBuf[n] = 0 ;
    }        

    EErrors  LoadCoeffFromArray( int numFilter, double &coeffArray[])
    {
         if (numFilter >= coeffArray[ 0 ])   // количество фильтров в массиве
             return ENumFilterOutOfRange;
         uint addr = ( uint )coeffArray[ 1 + numFilter * 2 ];
         uint len = ( uint )coeffArray[ 2 + numFilter * 2 ];   
         ArrayResize (Coeff, len);
         for ( uint n = 0 ; n < len; n++)
            Coeff[n] = coeffArray[addr++];
        Init();    
         return EOk;
    }

     void     LoadCoeffFromArray( double &coeffArray[])
    {
         int len = ArraySize (coeffArray); 
         ArrayResize (Coeff, len);
         for ( int n = 0 ; n < len; n++)
            Coeff[n] = coeffArray[n];
        Init();    
    }
    
     bool     LoadCoeffFromFile( int numFilter, string fileName)
    {
         // не реализовано
         return true ;
    }
    
     // фильтрация одного тика
     double   FilterTick( double tick)
    {
        TickBuf[TickBufIdx] = tick;
         if (TickBufIdx == 0 )
            TickBufIdx = TICK_BUF_MAX_IDX;
         else
            TickBufIdx--;
         int asize = ArraySize (Coeff); // вынести из функции!!!
         double acc = 0 ;
         int tbIdx = TickBufIdx;
         // делаем фильтрацию в цикле for
         for ( int n = 0 ; n < asize; n++)
        {
            tbIdx++;
             /* вместо
            if(tbIdx > TICK_BUF_MAX_IDX)
            tbIdx = 0;
            */
            tbIdx &= TICK_BUF_MAX_IDX; // небольшая оптимизация вместо if
            acc += TickBuf[tbIdx] * Coeff[n];
        }
        OutBuf[OutBufIdx] = acc;
        OutBufIdx++;
        OutBufIdx &= OUT_BUF_MAX_IDX;
         return acc;
    }
    
     // фильтрация массива
     void     FilterTickSeries( double &ticks[], int count)
    {
         for ( int n = 0 ; n < count; n++)
            ticks[n] = FilterTick(ticks[n]);
    }
};
#endif
 
Alexey Volchanskiy :

아르템, 난 취한 것도 아니고 마약에 취한 것도 아니야. 30분 전에 나는 MQL LinkedList가 구현되었다는 짧은 답변을 썼습니다. 정확히 어떻게 링 버퍼가 구현되었고 설명된 동작은 괜찮습니다. 그리고 필터를 일반 배열에서 링 버퍼로 만듭니다. 그런 다음 구현을 보기 위해 .NET 소스에 들어갔고 30분 후에 내 메시지가 삭제되었습니다. 네, 처음이죠?

나는 러시아 중재자에 대해 생각하지 않습니다.

다음은 FIR 필터 클래스입니다. double FilterTick(double tick) 함수를 참조하십시오. 링 버퍼는 입력 틱과 출력 필터링된 값의 두 가지뿐입니다. 연결 목록과의 차이점은 옵션이 더 적지만 나에게 중요한 것은 훨씬 더 빠르다는 것입니다.

글쎄, 나는 모른다 - 나는 삭제 된 게시물을 살펴 보았습니다 - 이 스레드에는 아무것도 없습니다. 사탄...

"연결 목록"이 연결 목록이라는 것도 논리적으로 보입니다. 단순 목록에는 루프백이 없으며 Aleksey Navoikov가 말한 대로 작동합니다. "마지막 노드의 다음 은 초기 노드의 이전 과 마찬가지로 0과 같습니다." 그러나 연결 목록은 링 버퍼처럼 작동하며 작동합니다. 어느 것이 나에게 편리합니다.

 
Artyom Trishkin :

글쎄, 나는 모른다 - 나는 삭제 된 게시물을 살펴 보았습니다 - 이 스레드에는 아무것도 없습니다. 사탄...

"연결 목록"이 연결 목록이라는 것도 논리적으로 보입니다. 단순 목록에는 루프백이 없으며 Aleksey Navoikov가 말한 대로 작동합니다. "마지막 노드의 다음 은 초기 노드의 이전 과 마찬가지로 0과 같습니다." 그러나 연결 목록은 링 버퍼처럼 작동하며 작동합니다. 어느 것이 나에게 편리합니다.

그리고 그런 가능성이 있는 줄은 몰랐습니다. 글쎄, 나는 내가 산만 해져서 메시지를 보내지 않고 그 페이지에서 바로 어딘가로 갔다고 가정 할 수 있습니다. 그러나 그러한 불만은 저뿐만 아니라 정기적으로 발생합니다. 좋아, 더 이상 이야기하지 맙시다.

 
Alexey Volchanskiy :

그리고 그런 가능성이 있는 줄은 몰랐습니다. 글쎄, 나는 내가 산만 해져서 메시지를 보내지 않고 그 페이지에서 바로 어딘가로 갔다고 가정 할 수 있습니다 . 그러나 그러한 불만은 저뿐만 아니라 정기적으로 발생합니다. 좋아, 더 이상 이야기하지 맙시다.

여기, 여기에서 더 조심해야합니다. 모든 버튼이 부드럽게 눌러집니다.

 
Artyom Trishkin :

"연결 목록"이 연결 목록이라는 것도 논리적으로 보입니다. 단순 목록에는 루프백이 없으며 Aleksey Navoikov가 말한 대로 작동합니다. "마지막 노드의 다음 은 초기 노드의 이전 과 마찬가지로 0과 같습니다." 그러나 연결 목록은 링 버퍼처럼 작동하며 작동합니다. 어느 것이 나에게 편리합니다.

연결 목록은 다음 요소와 이전 요소에 대한 포인터를 포함하는 목록입니다. "링잉"은 그것과 아무 관련이 없습니다. 그리고 일반적으로 새로운 것입니다. 이거 어디서 보나요?

알렉세이 볼찬스키 :
다음은 FIR 필터 클래스입니다. double FilterTick(double tick) 함수를 참조하십시오. 링 버퍼는 입력 틱과 출력 필터링된 값의 두 가지뿐입니다. 연결 목록과의 차이점은 옵션이 더 적지만 나에게 중요한 것은 훨씬 더 빠르다는 것입니다.

예, 필터 클래스가 그것과 무슨 관련이 있습니까? 우리는 연결 목록에 대해 구체적으로 이야기하고 있습니다. 이것은 특정 속성을 가진 표준 컨테이너입니다. 목록은 한 방향으로 반복됩니다. 울림이 있을 수 없습니다. C#(동일한 LinkedList 클래스)도 C++(std::list 클래스)도 없습니다.

또한 이 라이브러리는 C#과의 호환성을 가정하여 .Net에서 이식되었습니다. 그렇지 않으면 왜 다른 집에서 만든 자전거가 필요합니까? MQ에서 더 서투른 자전거를 먹지 않았습니까? 필요한 것은 완성된 라이브러리를 이식하는 것뿐이었습니다(언어 고유의 제한 사항이 있지만 최소한 작업 논리가 유지되도록). 하지만 아니... 장난꾸러기 작은 손도 여기에 끼어들었다)

아마도 이러한 클래스를 이식한 사람은 코드를 단순화하여 자신의 삶을 더 쉽게 만들기로 결정했을 것입니다. 두 개의 포인터 m_first와 m_last 대신, 하나의 포인터 m_head를 만들었습니다.

물론 제 스스로에게 맞았습니다. 하지만 그럼에도 불구하고...

 
Alexey Navoykov :

연결 목록은 다음 요소와 이전 요소에 대한 포인터를 포함하는 목록입니다. "링잉"은 그것과 아무 관련이 없습니다. 그리고 일반적으로 새로운 것입니다. 이거 어디서 보나요?

예, 필터 클래스가 그것과 무슨 관련이 있습니까? 우리는 연결 목록에 대해 구체적으로 이야기하고 있습니다. 이것은 특정 속성을 가진 표준 컨테이너입니다. 목록은 한 방향으로 반복됩니다. 울림이 있을 수 없습니다. C#(동일한 LinkedList 클래스)도 C++(std::list 클래스)도 없습니다.

또한 이 라이브러리는 C#과의 호환성을 가정하여 .Net에서 이식되었습니다. 그렇지 않으면 왜 다른 집에서 만든 자전거가 필요합니까? MQ에서 더 서투른 자전거를 먹지 않았습니까? 필요한 것은 완성된 라이브러리를 이식하는 것뿐이었습니다(언어 고유의 제한 사항이 있지만 최소한 작업 논리가 유지되도록). 하지만 아니... 장난꾸러기 작은 손도 여기에 끼어들었다)

아마도 이러한 클래스를 이식한 사람은 코드를 단순화하여 자신의 삶을 더 쉽게 만들기로 결정했을 것입니다. 두 개의 포인터 m_first와 m_last 대신, 하나의 포인터 m_head를 만들었습니다.

물론, 나는 해야 할 모든 것을 스스로 고쳤다 . 하지만 그럼에도 불구하고...

MSDN에서는 링 버퍼 라고 하는데 이름이 떠오르지 않네요.

가장 중요한 것은 Include 폴더에서 편집하지 마십시오. 그렇지 않으면 새 MT5 빌드로 업그레이드할 때 모든 항목을 덮어씁니다.

 
Vladimir Karputov :

여기, 여기에서 더 조심해야합니다. 모든 버튼이 부드럽게 눌러집니다.

그러한 가능성의 확률은 0에 가깝습니다. 그러나 영어 지점에 있는 내 지점이 익명으로 두들겨 맞았다는 것은 사실입니다. ***

 
Alexey Volchanskiy :

그러한 가능성의 확률은 0에 가깝습니다. 그러나 영어 지점에 있는 내 지점이 익명으로 두들겨 맞았다는 것은 사실입니다. ***

이 스레드에 대해서는 이미 충분합니다. 다시 한 번, 자작 나무 빗자루를 기억하고 제공하십시오. 피곤한.

 
Alexey Volchanskiy :

가장 중요한 것은 Include 폴더에서 편집하지 마십시오. 그렇지 않으면 새 MT5 빌드로 업그레이드할 때 모든 항목을 덮어씁니다.

나는 별도의 Generic_ 폴더에 있습니다. 실제로 해야 할 일이 더 많았다. 메서드에 대해 const를 적용하는 것에서 시작하여(개발자는 필요하다고 생각하지 않음), 값이 아니라 참조에 의한 인수 재작업으로 끝납니다.