Genel sınıflar kütüphanesi - hatalar, açıklamalar, sorular, kullanım özellikleri ve öneriler - sayfa 28

 
Alexey Volchanskiy :

Burada yine ne oluyor? LinkedList konusunda oldukça yeterli gönderileri silerler. Bu yüzden, Avrupa'da bir yerde oturmuş, isimsiz bir moderatör olduğunu ve nefret edilen Rusların gönderilerini öfkeyle kıkırdayarak sildiğini hayal ediyorum. Bir tür çöplük, yazma isteği yok oluyor.

Değirmenlerle savaşmak iyidir - bu konudan silinmiş mesaj yok.

 
Artyom Trishkin :

Değirmenlerle savaşmak iyidir - bu konudan silinmiş mesaj yok.

Artem, sarhoş değilim ve uyuşturucu kullanmıyorum. Yarım saat önce, MQL LinkedList'in uygulandığına, tam olarak halka arabelleğinin nasıl uygulandığına ve açıklanan davranışın gayet iyi olduğuna dair kısa bir cevap yazdım. Ve filtrelerimi normal bir dizide bir halka arabelleği yaptığımı. Sonra uygulamayı görmek için .NET kaynaklarına girdim ve yarım saat sonra mesajım silindi. Evet, ilk kez, değil mi?

Sadece Rus moderatörleri düşünmüyorum.

İşte FIR filtre sınıfı, çift FilterTick(double tick) işlevine bakın. Yalnızca iki halka arabelleği vardır - giriş keneleri ve çıkış filtrelenmiş değerler. Bağlantılı bir listenin farkı, daha az seçeneğin olması, ancak benim için önemli olan bir büyüklük sırası daha hızlı olmasıdır.

 #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 :

Artem, sarhoş değilim ve uyuşturucu kullanmıyorum. Yarım saat önce, MQL LinkedList'te halka arabelleğinin ve açıklanan davranışın tam olarak nasıl uygulandığına dair kısa bir cevap yazdım. Ve filtrelerimi normal bir dizide bir halka arabelleği yaptığımı. Sonra uygulamayı görmek için .NET kaynaklarına girdim ve yarım saat sonra mesajım silindi. Evet, ilk kez, değil mi?

Sadece Rus moderatörleri düşünmüyorum.

İşte FIR filtre sınıfı, çift FilterTick(double tick) işlevine bakın. Yalnızca iki halka arabelleği vardır - giriş keneleri ve çıkış filtrelenmiş değerler. Bağlantılı bir listenin farkı, daha az seçeneğin olması, ancak benim için önemli olan bir büyüklük sırası daha hızlı olmasıdır.

Bilmiyorum - silinen gönderilere baktım - bu konudan hiçbir şey yok. Şeytan...

"Bağlantılı liste"nin bağlantılı bir liste olması da bana mantıklı geliyor. Basit bir listede geri döngü yoktur ve Aleksey Navoikov'un dediği gibi çalışır: "Son düğümün sonraki, tıpkı ilk düğümün Önceki gibi sıfıra eşittir", ancak bağlantılı liste yapar ve bir halka arabelleği gibi çalışır. Hangisi benim için uygun.

 
Artyom Trishkin :

Bilmiyorum - silinen gönderilere baktım - bu konudan hiçbir şey yok. Şeytan...

"Bağlantılı liste"nin bağlantılı bir liste olması da bana mantıklı geliyor. Basit bir listenin geri dönüşü yoktur ve Aleksey Navoikov'un dediği gibi çalışır: "Son düğümün sonraki, tıpkı ilk düğümün Önceki gibi sıfıra eşittir", ancak bağlantılı liste yapar ve bir halka arabelleği gibi çalışır. Hangisi benim için uygun.

Ve böyle bir ihtimal var, bilmiyordum. Pekala, dikkatimin dağıldığını ve mesaj göndermeden o sayfadan bir yere gittiğimi varsayabilirim. Ancak bu tür şikayetler sadece benimle değil, düzenli olarak ortaya çıkıyor. Tamam, daha fazla konuşmayalım.

 
Alexey Volchanskiy :

Ve böyle bir ihtimal var, bilmiyordum. Pekala, dikkatimin dağıldığını ve bir mesaj göndermeden o sayfadan bir yere gittiğimi varsayabilirim . Ancak bu tür şikayetler sadece benimle değil, düzenli olarak ortaya çıkıyor. Tamam, daha fazla konuşmayalım.

Burada, burada daha dikkatli olmanız gerekiyor, tüm düğmelere hafifçe basın.

 
Artyom Trishkin :

Ayrıca "bağlı liste"nin bağlantılı bir liste olması da bana mantıklı geliyor. Basit bir listenin geri dönüşü yoktur ve Aleksey Navoikov'un dediği gibi çalışır: "Son düğümün sonraki, tıpkı ilk düğümün Önceki gibi sıfıra eşittir", ancak bağlantılı liste yapar ve bir halka arabelleği gibi çalışır. Hangisi benim için uygun.

Bağlantılı liste, sonraki ve önceki öğelere işaretçiler içeren bir listedir. "Çalmanın" bununla hiçbir ilgisi yok. Ve genel olarak yeni bir şey. Bu nerede görülüyor?

Alexey Volchanskiy :
İşte FIR filtre sınıfı, çift FilterTick(double tick) işlevine bakın. Yalnızca iki halka arabelleği vardır - giriş keneleri ve çıkış filtrelenmiş değerler. Bağlantılı bir listenin farkı, daha az seçeneğin olması, ancak benim için önemli olan bir büyüklük sırası daha hızlı olmasıdır.

Evet, filtre sınıfının bununla ne ilgisi var ... Özellikle bağlantılı listeden bahsediyoruz. Bu, belirli özelliklere sahip standart bir kapsayıcıdır. Liste bir yönde yinelenir. Zil sesi olamaz. Ne C# (aynı LinkedList sınıfı) ne de C++ (std::list sınıfı) bir taneye sahip değildir.

Ek olarak, bu kitaplık C# ile uyumlu olduğu varsayılarak .Net'ten alınmıştır, aksi halde neden başka bir ev yapımı bisiklete ihtiyacınız var? MQ'dan daha beceriksiz bisikletler yemediniz mi? Gerekli olan tek şey, bitmiş kütüphaneyi taşımaktı (dile özgü sınırlamalara rağmen, ancak en azından çalışma mantığının korunması için). Ama hayır ... Oynak küçük eller burada da müdahale etti)

Büyük olasılıkla, bu sınıfları taşıyan kişi, kodu basitleştirerek hayatı kendisi için kolaylaştırmaya karar verdi. İki işaretçi m_first ve m_last yerine, bir işaretçi m_head yaptım ...

Tabii ki, kendim için doğru buldum. Ama yine de...

 
Alexey Navoykov :

Bağlantılı liste, sonraki ve önceki öğelere işaretçiler içeren bir listedir. "Çalmanın" bununla hiçbir ilgisi yok. Ve genel olarak yeni bir şey. Bu nerede görülüyor?

Evet, filtre sınıfının bununla ne ilgisi var ... Özellikle bağlantılı listeden bahsediyoruz. Bu, belirli özelliklere sahip standart bir kapsayıcıdır. Liste bir yönde yinelenir. Zil sesi olamaz. Ne C# (aynı LinkedList sınıfı) ne de C++ (std::list sınıfı) bir taneye sahip değildir.

Ek olarak, bu kitaplık C# ile uyumlu olduğu varsayılarak .Net'ten alınmıştır, aksi halde neden başka bir ev yapımı bisiklete ihtiyacınız var? MQ'dan daha beceriksiz bisikletler yemediniz mi? Gerekli olan tek şey, bitmiş kütüphaneyi taşımaktı (dile özgü sınırlamalara rağmen, ancak en azından çalışma mantığının korunması için). Ama hayır ... Oynak küçük eller burada da müdahale etti)

Büyük olasılıkla, bu sınıfları taşıyan kişi, kodu basitleştirerek hayatı kendisi için kolaylaştırmaya karar verdi. İki işaretçi m_first ve m_last yerine, bir işaretçi m_head yaptım ...

Tabii ki, her şeyi gerektiği gibi düzelttim . Ama yine de...

MSDN'de buna ring buffer deniyor ama ben bir isim bulamadım.

En önemlisi, Include klasöründe düzenleme yapmayın, aksi takdirde yeni bir MT5 yapısına yükseltme yaparken her şeyin üzerine yazılacaktır.

 
Vladimir Karputov :

Burada, burada daha dikkatli olmanız gerekiyor, tüm düğmelere hafifçe basın.

Böyle bir olasılığın olasılığı sıfıra meyillidir. Ancak İngilizce şubemdeki şubem isimsiz olarak arandı, bu bir gerçek. ***

 
Alexey Volchanskiy :

Böyle bir olasılığın olasılığı sıfıra meyillidir. Ancak İngilizce şubemdeki şubem isimsiz olarak arandı, bu bir gerçek. ***

Bu konu hakkında zaten yeterli. Bir kez daha hatırlayın ve bir huş süpürgesi verin. Yorgun.

 
Alexey Volchanskiy :

En önemlisi, Include klasöründe düzenleme yapmayın, aksi takdirde yeni bir MT5 yapısına yükseltme yaparken her şeyin üzerine yazılacaktır.

Ayrı bir Generic_ klasöründe var. Aslında daha yapılacak çok şey vardı. Yöntemler için const koymaktan başlayarak (geliştiriciler bunu gerekli görmedi) ve argümanlar için yalnızca değere göre değil, referansa göre yeniden çalışmakla sona erdi.