汎用クラスライブラリ - バグ、説明、質問、使用上の特徴、提案 - ページ 28

 
Alexey Volchanskiy:

また何やってんだ?LinkedListの投稿を完全に削除している。ヨーロッパのどこかで匿名のモデレーターが、憎きロシア人の書き込みを削除して、悪戯に笑っている姿が目に浮かぶようです。書きたくなくなるような、そんなゴミです。

風車と戦うのはやめてください - このスレッドから削除された投稿はありません。

 
Artyom Trishkin:

風車と戦うのはやめてください - このスレッドから削除された投稿はありません。

アルテム、私は酔っているわけでも、飲酒運転をしているわけでもない。MQLではLinkedListはリングバッファとして 実装されており、記載されている動作はごく普通のものであることを30分前に短く回答しました。そして、私のフィルターには、配列を使ってリングバッファを実装しています。その後、.NETのソースにアクセスして実装を見たのですが、30分後には私のメッセージは削除されていました。初めてやったんですよ。

ロシアのモデレーターについて、私はちょうど考えていません。

ここでは、FIRを使ったフィルタクラス、ウォッチダブルFilterTick(double tick)関数を紹介します。リングバッファは、入力刻みと出力フィルタリングされた値の2つがあります。リンクリストとの違いは、可能性は低くなりますが、一桁速くなることで、これは私にとって重要なことです。

#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を使ったフィルタクラス、ウォッチダブルFilterTick(double tick)関数を紹介します。リングバッファは、入力刻みと出力フィルタリングされた値の2つがあります。リンクリストとの違いは可能性が少ないことですが、私にとっては重要なことで、より高速になりました。

削除された投稿を調べても、このスレッドからは何も出てこないので、わからない。シャイターン ...

私も、「リンクリスト」は論理的に考えて、「リンクリスト」だと思います。単純なリストにはループがなく、Alexey Navoikovが言ったように「最後のノードのNextは0であり、最初のノードのPreviousと 同じ」であるが、リンクリストにはそれがあり、リングバッファのように動作する。私にとっては便利なものです。

 
Artyom Trishkin:

わからない -削除された投稿に目を 通したが、このスレッドからは何もなかった。シャイターン...

また、「リンクド・リスト」はリンクド・リストであることが論理的であるように思います。単純なリストにはループがなく、Alexey Navoikovが言ったように「最後のノードの次は0に等しく、最初のノードの前も 同じ」であるのに対し、リンクリストはリングバッファのように動作する。私にとっては便利なものです。

ああ、その可能性もありますね、知りませんでした。まあ、気が散って、メッセージを送らずに、そのページからそのままどこかに行ってしまったのだろうと推測できます。しかし、そのような苦情は定期的に発生しています。よし、もうこの話はやめよう。

 
Alexey Volchanskiy:

ああ、その可能性があるんですね、知りませんでした。まあ、気が散って、メッセージを送らずにそのページから直行したのだろうと推測 できる。しかし、そのような苦情は定期的に発生しています。よし、もうこの話はやめよう。

ここに、ここに、もっと気を配って、すべてのボタンをきちんと押す必要があります。

 
Artyom Trishkin:

また、「リンクド・リスト」はリンクド・リストであることが論理的であるように思います。単純なリストにはループがなく、Alexey Navoikovが言ったように「次の最後のノードは0、前の最初のノード も0」ですが、リンクリストにはリングバッファがあり、そのように動作しています。私にとっては便利なものです。

リンクリストは、次の項目と前の 項目へのポインタを格納するリストです。"指輪 "は関係ない。とにかく、これは新しいことなんです。どこで見られたのでしょうか?

Alexey Volchanskiy:
FIRを使ったフィルタクラスはこちら、watch double FilterTick(double tick)関数です。リングバッファは2つだけで、入力の刻みと出力のフィルタリングされた値です。リンクリストとの違いは可能性が少ないことですが、私にとっては重要なことで、より高速になりました。

フィルタクラスとは関係ありません...具体的にはリンクリストの話をしています。一定の特性を持った標準的な容器である。リストの反復は一方向である。鳴るはずがない。 C#(同一のLinkedListクラス)やC++(std::listクラス)では鳴らない。

それに、このライブラリは.Netから移植されたもので、C#との互換性を意味している。そうでなければ、なぜまた自作自転車が必要なのか? 粗悪なMQ自転車はもうたくさんではないか? 必要だったのは、既製のライブラリ(言語固有の制約があっても、少なくとも仕事の論理を維持する)を移植するだけだった。 しかし、そうではなかった...。ここでもいたずらっ子が邪魔をした )

おそらく、これらのクラスを移植した人は、コードを単純化して、自分の生活を簡素化することにしました。 2つのm_firstとm_lastポインタの代わりに、1つのm_headポインタを作成しました...。

もちろん、すべて元通りに直したのですが、それにしても......。

 
Alexey Navoykov:

リンクリストは、次の項目と前の 項目へのポインタを格納するリストです。"指輪 "は関係ない。とにかく、これは新しいことなんです。どこで見られたのでしょうか?

フィルタクラスとは関係ありません...具体的にはリンクリストの話をしています。一定の特性を持った標準的な容器である。リストの反復は一方向である。鳴るはずがない。 C#(同一のLinkedListクラス)やC++(std::listクラス)では鳴らない。

それに、このライブラリは.Netから移植されたもので、C#との互換性を意味している。そうでなければ、なぜまた自作自転車が必要なのか? 粗悪なMQ自転車はもうたくさんではないか? 必要だったのは、既製のライブラリ(言語固有の制約があっても、少なくとも仕事の論理を維持する)を移植するだけだった。 しかし、そうではなかった......。ここでもいたずらっ子が邪魔をした )

おそらく、これらのクラスを移植した人は、コードを単純化して、自分の生活を簡素化することにしました。 2つのm_firstとm_lastポインタの代わりに、1つのm_headポインタを作成しました...。

もちろん、ちゃんと直した のですが...。

MSDNではリングバッファと 呼んでいますが、私はこの名前を発明したわけではありません。

Includeフォルダに固定しないと、MT5の新しいビルドにアップグレードしたときに消去されてしまうのが主な原因です。

 
Vladimir Karputov:

あそこ、あそこ、もっと慎重に、すべてのボタンを慎重に押さなければならない。

その確率は限りなくゼロに近い。でも、英語スレの俺の枝が匿名で殺されたのは事実なんだよな。***

 
Alexey Volchanskiy:

その可能性は非常に低い。でも、英語スレの俺の枝が匿名で殺されたのは事実なんだよな。***

その枝の話はもういい。今度持ち出したら、樺太のほうきをやるぞ。もう、うんざりです。

 
Alexey Volchanskiy:

最も重要なことは、Includeフォルダで編集しないことです。さもないと、MT5の新しいビルドにアップグレードしたときに上書きされます。

実際、メソッドのconstに始まり(開発者は必要ないと考えていた)、値だけでなく参照による引数の再設計まで、多くの変更をそこで行う必要がありました。