私たちのファンページに参加してください
- ビュー:
- 61
- 評価:
- パブリッシュ済み:
- アップデート済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
ティックデータを圧縮し、.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種類のティックエレメントがプログラムされています:
- アスク、ビッド、time_msc
- アスク、ビッド、time_msc、volume_real
- すべての要素 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
包括的な取引統計をCSVファイルにエクスポート。
Daily Lot Statistics
毎日の取引統計をMT5チャートに直接表示する最新のインジケーターです。取引ロット、注文数、各日の損益を表示する美しいフラットデザインのパネルで取引パフォーマンスを追跡します。
Titik Impas Breakeven
1つの取引のストップロスを建値に合わせて手動で調整するのは比較的簡単な作業ですが、多数のポジションを個別に管理するのは面倒で時間のかかる作業です。MT4/MT5用のTitik Impas Breakevenスクリプトは、このプロセスを合理化し、複数のポジションを扱うトレーダーに効率性と利便性を提供します。
ATR Weighted Moving Averages
ATR加重移動平均を計算するインジケーターです。