無料でロボットをダウンロードする方法を見る
Telegram上で私たちを見つけてください。
私たちのファンページに参加してください
興味深いスクリプト?
それではリンクにそれを投稿してください。-
他の人にそれを評価してもらいます
記事を気に入りましたか?MetaTrader 5ターミナルの中でそれを試してみてください。
ライブラリ

TickCompressor - 1ティックを平均2-3バイトに圧縮します。 - MetaTrader 5のためのライブラリ

ビュー:
61
評価:
(4)
パブリッシュ済み:
アップデート済み:
\MQL5\Include\Forester\
MQL5フリーランス このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動

ティックデータを圧縮し、.tcs MQファイルより最大3.5倍コンパクトに保存。また、MqlTick構造体の60バイトよりも3バイトの方が読み取りにかかる時間が短いため、高速な作業が可能です。

データブロックのZIP圧縮を追加した2023のAsk、Bid、Timeのファイルサイズはスクリーンショットで見ることができます:

2023年の.tcs形式のファイルサイズ:

3.56倍圧縮。

ティックを保存するには、アスク価格とビッド価格の前回価格からの差が使用されます。多くの場合(全ティックの50~70%)、この差は(-8~7)ポイントを超えず、4ビットで記録できます。AskとBidは1バイトにまとめられます。
さらに、0~255ミリ秒の時間差を格納するために1バイト(229までのコードでは、-8...7ポイントを超えるティックを符号化するために229以上の値が使用されます)。

価格や時間がより大きな値で異なる場合、それらはより大きなバイト数にパックされます。

さらに圧縮するために、ZIPアーカイブを適用することができます。データサイズは最大2倍まで縮小されます。

また、AskとBidの-129から128までをそれぞれ8ビットまたは1バイトに圧縮し、3バイトに圧縮することもできます。これに1バイトの時間を加え、合計3バイトでほとんどのティックに対応する。
2バイトに圧縮されるティックが4バイトに圧縮されるティックより多い場合、3バイトに圧縮する方が効率的な場合があります(https://www.mql5.com/ru/forum/499639/page6#comment_58544810)。計測器の統計を見てください。
コマンドで最大圧縮を3バイトに切り替えることができます:

#define  compressTo3Bytes // 目盛りを2バイトから3バイトに圧縮する。


圧縮して保存する目盛り要素

3種類のティックエレメントがプログラムされています:

  1. アスク、ビッド、time_msc
  2. アスク、ビッド、time_msc、volume_real
  3. すべての要素 Ask, Bid, Last, time_msc, volume_real, flags (int volume は volume_real から計算されます)。

これらはさらにZIPで圧縮することもできる。全部で6種類

method=1;//1...6 BidAsk_=1, BidAskVolume_=2, All_=3, BidAsk_Zipped=4, BidAskVolume_Zipped=5, All_Zipped=6

圧縮を開始する前に、ティック保存のバリアントと、価格の計算と正規化に使用されるいくつかの標準パラメータをクラスに渡す必要があります。

    TickCompressor Compressor2;
    double VolumeStep_=SymbolInfoDouble(Symbol(), SYMBOL_VOLUME_STEP);
    Compressor2.Start(method,_Point,VolumeStep_,_Digits);

Expert Advisor がフラグを使用している場合、コマンドによって価格の変化からフラグを復元することができます。

#define  RestoreFlags // アスク、ビッド、ボリュームの変更からティックフラグを復元する。

圧縮テスト用のExpert Advisorが添付されており、速度と圧縮率の統計が表示されます。ティックの圧縮と解凍の例を見ることができます。

取引用Expert Advisorの例はこちらhttps://www.mql5.com/ja/code/65821。

2バイト圧縮と3バイト圧縮の統計:

2バイトへの圧縮 3バイト圧縮
Ticks: 47707712
Compressed size: 135718404
Compressed 2862666420 bytes into 135718404 bytes ==> 4.74%
Compress performance: 764 MB/s
Compress performance: 13.4 Ticks (millions)/sec.
Compress performance criterion: 281.7
Decompress performance: 3550 MB/s
Decompress performance: 62.0 Ticks (millions)/sec.
Decompress performance criterion: 1308.8


Statistics from experthttps://www.mql5.com/ja/code/65821
for BTCUSDT

-------------------- Statistics: --------------------
2 bytes: 70.1%, 50705359 ticks
4 bytes: 17.1%, 12350966 ticks
5 bytes: 12.7%, 9185484 ticks
6 bytes: 0.0%、15274ティック
11バイト: 0.1%、46214ティック
12バイト: 0.0%、1ティック
24バイト: 0.0%、1ティック
合計: 72303299ティック、197342036バイト
平均: 1ティックあたり2.729バイト
ZIPなしサイズ: 197342036。ZIPサイズ:108302550。ZIP 圧縮: 54.9%
平均: 1.498 バイト/ティック

EURUSD の場合

-------------------- 統計: --------------------
2 バイト: 66.2%, 29694779 ティック
4 バイト: 2.3%, 1022937 ティック
5 バイト: 31.5%, 14106637 ティック
6 バイト: 0.0%、25ティック
7バイト: 0.0%、8ティック
11バイト: 0.0%、800ティック
12バイト: 0.0%、3ティック
13バイト: 0.0%、4ティック
24バイト: 0.0%、1ティック
合計: 44825194ティック、134023609バイト
平均: 1ティックあたり2.99バイト
ZIPなしサイズ: 134023609.ZIPサイズ:95495454。ZIP圧縮: 71.3 %
平均: 2.13バイト/ティック
Ticks: 47707712
Compressed size: 169378137
2862462720 バイトを 169378137 バイトに圧縮 ==> 5.92%
Compress performance: 623 MB/s
Compress performance: 10.9 Ticks (millions)/sec.
Compress performance criterion: 183.9
伸長パフォーマンス:3225 MB/s
伸長パフォーマンス:56.4 Ticks (millions)/sec.
伸長パフォーマンス基準:952.6
Correct = true

Expertからの統計https://www.mql5.com/ja/code/65821
for BTCUSDT

-------------------- Statistics: --------------------
3 bytes: 86.6%, 62644158 ticks
4 bytes: 0.6%, 412167 ticks
5 bytes: 12.7%, 9185484 ticks
6 bytes: 0.0%、15274ティック
11バイト: 0.1%、46214ティック
12バイト: 0.0%、1ティック
24バイト: 0.0%、1ティック
合計: 72303299ティック、236108596バイト
平均: 1ティックあたり3.266バイト
ZIPなしサイズ: 236108596。ZIPサイズ:105802525。ZIP圧縮: 44.8%
平均: 1ティックあたり1.463バイト

EURUSDの場合

3バイト: 66.5%, 29801633ティック
4バイト: 2.0%, 916083ティック
5バイト: 31.5%, 14106637ティック
6バイト: 0.0%, 25ティック
7バイト: 0.0%、8ティック
11バイト: 0.0%、800ティック
12バイト: 0.0%、3ティック
13バイト: 0.0%、4ティック
24バイト: 0.0%、1ティック
合計: 44825194ティック、163611534バイト
平均: 1ティックあたり3.65バイト
ZIPなしサイズ: 163611534.ZIPサイズ:96541155。ZIP圧縮: 59.0%
平均: 1ティックあたり2.154バイト

コード例

ティック圧縮

ブロック単位:

    int ZIPpos=0;// 圧縮バイト・カウンター
    if(Amount>ticks_per_block){// > 1ブロック - tmpからTicks2へのブロックの接着
       for(int start=0; start<Amount; start+=ticks_per_block){
          Compressor2.Compress(Ticks, tmp, start, (Amount > start + ticks_per_block ? ticks_per_block : Amount - start));
          ZIPpos+=ArrayCopy(Ticks2,tmp,ZIPpos); //Ticks2の末尾にコピーする。
       }
    }else{//1 ブロック - Ticks2 に直接アンパックする。
       Compressor2.Compress(Ticks, Ticks2, 0, Amount);
    } 

1ブロック内のティック数を配列内のティック総数より多く設定すると、1ブロックに圧縮されます。

常に1ブロックに圧縮する必要がある場合は

Compressor2.Compress(Ticks,Ticks2); 

しかし、このような大きなブロックや非常に大きなブロックの解凍速度は2倍遅くなる可能性がある。また、大きなブロックの場合、メモリの消費量も大きくなります。


ティックの解凍

解凍する際には、パックされた目盛りの数を知っておくことが望ましい。受信配列はこのサイズを持っていなければならない。

ArrayResize(Ticks3,Amount);

このサイズは、例えばファイルに保存しておくことができる。そして解凍時にそれを使用する。

サイズが不明な場合は、ループ内でブロック内の目盛りの数だけサイズを変更することができる。

       //速度を落とす 
ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000); //小さなブロックを上書きするよりも遅い。


このコードはブロックごとに目盛りを取得する。大きなブロックが1つしかない場合は、それも正しくカウントされます。ティックは大きな配列に集められず、Strategy(Ticks3[j])ストラテジーですぐに処理できます;

    while (ZIPpos<ArraySize(Ticks2)){
       nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//次のブロックのサイズを決め、ZIPposを4増やす。

       uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // 新しいブロックをサイズnextSizeでtmpにコピーする。
       //ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000);//大きな配列をリサイズする。
       //total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//ブロックを解凍し、Ticks3に追加する。
       
       total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //ブロックを解凍し、Ticks3で上書きする。
       ZIPpos+=nextSize;
       for (int j = 0; j < ticks; j++){ Strategy(Ticks3[j]);}//戦略
    };


すべてのブロックのティックを1つの大きな配列に集める:

    while (ZIPpos<ArraySize(Ticks2)){
       nextSize=Compressor3.ArrToInt(Ticks2,ZIPpos);//次のブロックのサイズを決め、ZIPposを4増やす。

       uint s = ArrayCopy(tmp,Ticks2,0,ZIPpos,nextSize); // 新しいブロックをサイズnextSizeでtmpにコピーする。
       //ArrayResize(Ticks3,total_ticks+ticks_per_block,10000000);//大きな配列をリサイズする。
       total_ticks=Compressor3.DeCompress(tmp,Ticks3,nextSize,total_ticks);//ブロックを解凍し、Ticks3に追加する。
       
       //total_ticks+=Compressor3.DeCompress(tmp,Ticks3,nextSize,0); //ブロックを解凍し、Ticks3に上書きする。
       ZIPpos+=nextSize;
       //for (int j = 0; j < ticks; j++){ ストラテジー(Ticks3[j]);}///ストラテジー
    };


または1行。記録されるのは1ブロックのみ。それ以上の場合は、上記の2つのコードを使用する。

total_ticks=Compressor3.DeCompress(Ticks2,Ticks3);



MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/66201

Report by Magic and currency MT5 indicator for account PNL and trade statistics exported to CSV Report by Magic and currency MT5 indicator for account PNL and trade statistics exported to CSV

包括的な取引統計をCSVファイルにエクスポート。

Daily Lot Statistics Daily Lot Statistics

毎日の取引統計をMT5チャートに直接表示する最新のインジケーターです。取引ロット、注文数、各日の損益を表示する美しいフラットデザインのパネルで取引パフォーマンスを追跡します。

Titik Impas Breakeven Titik Impas Breakeven

1つの取引のストップロスを建値に合わせて手動で調整するのは比較的簡単な作業ですが、多数のポジションを個別に管理するのは面倒で時間のかかる作業です。MT4/MT5用のTitik Impas Breakevenスクリプトは、このプロセスを合理化し、複数のポジションを扱うトレーダーに効率性と利便性を提供します。

ATR Weighted Moving Averages ATR Weighted Moving Averages

ATR加重移動平均を計算するインジケーターです。