私たちのファンページに参加してください
- ビュー:
- 103
- 評価:
- パブリッシュ済み:
-
このコードに基づいたロボットまたはインジケーターが必要なら、フリーランスでご注文ください フリーランスに移動
このライブラリを使うと、*.gz ファイルから GZIP アーカイブを復号したり、 この形式で圧縮されたサイトからの応答を復号したりできる。0.5 GB までのテキストが圧縮されたファイルでテスト済みです。
このライブラリは、アーカイブが圧縮ファイルなのかサイトからの圧縮データなのかを 4 バイト目のフラグで自動的にチェックします。
解凍用の入力データは、char型の配列で表現する必要がある。
端末関数 CryptDecode(CRYPT_ARCH_ZIP, tmp, key, tx) が解凍に使用される;
GZIPクラスにはメソッドがあります:
isGZIP(char& gz[])
- は、受信したデータの最初の3文字をチェックして、それがGZIP形式で圧縮されているかどうかを確認します。
このチェックの後、unGZIPメソッドのオーバーロードのいずれかを呼び出すことができます:
bool unGZIP(char& gz[], char& tx[], string& fname, bool printTime=false){}
これは、速度とメモリ消費量の点で好ましい使用例である。解凍中、char配列txは満たされる。それから、CSVやJSONパーサーでデータを処理することができる。こうすることで、配列を文字列にしてから文字列や他の文字で分割することなく結果を得ることができる。
それでも文字列を取得する必要がある場合は、オーバーロードのいずれかを使用できます:
bool unGZIP(char& gz[], string& out, bool printTime=false, uint codepage=CP_ACP){}
解凍に成功し、解凍された文字列が文字列outにあればtrueを返す。
または
string unGZIP(char& gz[], bool printTime=false, uint codepage=CP_ACP){}
文字列を返す。展開に失敗した場合、文字列は空になる。
データを連結して1つの文字列にする場合は注意が必要です。
0.5GBのデータを持つアーカイブを解凍した場合、文字列にはさらに0.5GBが必要となり、それを文字列の配列に分割すると、さらに0.5GBが必要となる。さらに、これらすべての操作の時間コストがかかる。
ウェブサイトから圧縮データを読み込み、ファイルから読み込む使用例:(このスクリプトはダウンロード用に添付されています)
#property copyright "Copyright 2023, Forester" #property link "https://www.mql5.com" #property version "1.00" #include <GZIP.mqh> GZIP gzip; void OnStart(){ Print("GZipped webpage read sample:"); string url="https://............"; char out[]; if(http_req(url, out,"GET","Accept-Encoding: gzip, deflate\r\n", 1,0)){ if(gzip.isGZIP(out)){ Print("GZIP detected"); string txt; if(!gzip.unGZIP(out, txt, 1, CP_UTF8)){return;}//CP_ACP Print(txt); }else{ Print("No GZIP");Print(CharArrayToString(out, 0, WHOLE_ARRAY, CP_UTF8)); } } Print("File read sample:"); bool is_common=1; string fn="3.csv.gz"; bool is_zip=1; int h; if(is_zip){ h = FileOpen(fn,FILE_READ|FILE_BIN|FILE_READ|(is_common?FILE_COMMON:0)); }else{ h = FileOpen(fn,FILE_READ|FILE_CSV|FILE_ANSI|(is_common?FILE_COMMON:0)); } if( h!=INVALID_HANDLE){ Print ("Start gzip"); char gz[],tx[]; FileReadArray(h, gz); FileClose(h); if(gzip.isGZIP(gz)){ Print("GZIP detected"); string fname; if(!gzip.unGZIP(gz, tx,fname,1)){return;} //string txt; if(!unGZIP(gz, txt, 1, CP_ACP)){return;}//CP_UTF8 //string txt=unGZIP(gz, 1, CP_ACP);if(txt==""){return;}。 if(fname!=NULL){Print("File name: ",fname,", file size: ",ArraySize(tx));} string t= CharArrayToString(tx,0,100);Print("Filr content: ",t);t= CharArrayToString(tx,ArraySize(tx)-100,100);Print("... ",t); //ulong mcs = GetMicrosecondCount(); //string csvRow[];int columns=0, next=0; char sep=',', newLine='\n'; //while(getCSVRow(tx, csvRow, columns, next, sep, newLine) && !IsStopped()){//次の行を取得する。 // for(int c=0; c<columns; c++){. //Print(); // } //Print(next); //} //Print("CSV parse time: ",(GetMicrosecondCount()-mcs)," mcs"); //ArrayPrint(csvRow); }else{} } } int getCSVRow(char& csv[], string& outAr[], int& cols, int& next, char& sep, char& newLine){// 次の行を取得する for(int i=next; i<ArraySize(csv); i++){ if(csv[i] == newLine){ cols=StringSplit(CharArrayToString(csv,next,i-next),sep,outAr);// parseCSVより5-10%速く、eは1つの大きな配列のためのメモリを持っている。 next=i+1; return true; } } return false; } bool http_req(string url, char& out[],string method="GET",string headers_request=NULL, bool printTime=false,bool debug=false){ ulong mcs = (printTime?GetMicrosecondCount():0); bool retVal=false; ResetLastError(); char data[];string headers=NULL; int r=WebRequest(method, url, headers_request, 5000, data, out, headers); if(r==-1){Print("Error in WebRequest. Err code =",GetLastError());MessageBox("It is necessary to add the address '"+url+"' to the list of allowed URLs in the 'Advisors' tab","Error",MB_ICONINFORMATION);} else{if(r==200){ retVal= true; }else{PrintFormat("Download error '%s', responce code %d",url,r);Print("Error in WebRequest. Err code =",GetLastError());}}if(debug){PrintFormat("Responce headers: %s\r\nResponce:",headers);Print(CharArrayToString(out));}// if(printTime){Print("WebRequest time: ",(GetMicrosecondCount()-mcs)," mcs");} return retVal; }
この例では、filesフォルダからファイルを読み込み、それを配列に展開します。
解凍されたファイルの最初と最後の100文字が表示されます。
この配列は、CSVまたはJSONパーサーに送ることができます。JSONについては、kodobaseにJASONライブラリがあります。これは char 配列として受け取ったデータをパースすることができます。
120MBの圧縮CSVファイル(ソースファイルは463MB)を解凍したときの出力例:
2025.05.12 15:08:40.510 GZipped webpage read sample:
2025.05.12 15:08:41.319 WebRequest time: 809637 mcs
2025.05.12 15:08:41.319 GZIP detected
2025.05.12 15:08:41.319 UnGZIP time: 3 mcs
2025.05.12 15:08:41.319 {"retCode":0,"retMsg":"OK","result":{"category":"linear","list":[... Юя
2025.05.12 15:08:41.319 File read sample:
2025.05.12 15:08:41.320 Start gzip
2025.05.12 15:08:41.384 GZIP detected
2025.05.12 15:08:42.582 UnGZIP time: 1198136 mcs
2025.05.12 15:08:42.593 File name: BTCUSD2025-05-09.csv, file size: 486006135
2025.05.12 15:08:42.593 Filr content: timestamp,symbol,side,size,price,tickDirection,trdMatchID,grossValue,homeNotional,foreignNotional,RP
2025.05.12 15:08:42.593 ... 36.00,ZeroPlusTick,e92fbea7-1471-591e-95f7-4dc0edde771c,971.4774228646926,1,9.714774228646926e-06,0
解凍には約1.2秒かかりました。
MetaQuotes Ltdによってロシア語から翻訳されました。
元のコード: https://www.mql5.com/ru/code/59309

ADX (Average Directional Index) Smoothedインディケータは、二重の指数平滑化フィル タを適用することにより標準ADXを強化し、ノイズを低減して明確なトレン ドシグナルを提供します。平滑化された+DI(青)、-DI(赤)、そしてメインのADXライン(緑) の3つのラインをプロットします。この洗練されたバージョンは、トレーダーがトレンドの強さと潜在 的な方向転換を識別するのに役立ち、誤ったシグナルを減少させます。このインディケータは、実際の価格反転が起こる前に、確立されたトレンドを確 認し、モメンタムの弱まりを警告することに優れており、トレンドフォロー戦 略と最適なエントリー/エグジットポイントの判断の両方に有用です。

このMQL5カスタムインジケーターは、価格とオーサムオシレーター(AO) の乖離を検出し、相場の反転または継続の可能性を示します。チャート上に売買の矢印を表示し、AOをヒストグラムとして表示し、トレンドラインを引 いてダイバージェンスを強調します。

AutoCloseOnProfitLoss Expert Advisor (EA)は、MetaTrader 5用の強力な自動化ツールで、事前に定義された利益目標または損失目標に達すると、すべてのオープンポジションをクローズするように設計されています。

単一シンボルのロング・スワップとショート・スワップを監視するためのシンプルなユーティリティ。ブローカー・ディーラーのスワップが口座通貨ではなくポイントで指定されている場合、このユーティリティは自動的にポイントを口座通貨に変換する。スワップは水曜日に 3 倍になる。水平方向と垂直方向のアライメントは入力で調整できる。