1. FileWriteLong関数の概要と実務での活用法
FileWriteLongは、MQL5でオープンしたバイナリ形式のファイルに対して、8バイトの整数型であるlong型のデータを書き込むための関数です。
実務レベルのEA(エキスパートアドバイザー)開発において、この関数は「チケット番号の保存」や「ミリ秒単位のタイムスタンプの記録」といった、数値データの永続化に頻繁に利用されます。
実務での活用ポイントとつまずきやすい点:
多くの初心者は、数値を保存する際に「テキストファイル(CSV等)」への書き込みを選びがちです。しかし、テキスト形式は人間が読める一方で、読み書きの処理が重く、ファイルサイズも肥大化します。
一方でFileWriteLongを用いるバイナリ形式は、コンピュータが直接解釈できる形式で保存するため、読み書きが極めて高速であり、ストレージ容量も節約できます。プロのクオンツエンジニアが数万件のバックテスト結果やログを高速に処理する場合、バイナリ形式での保存は「鉄則」と言えます。
2. 構文と戻り値
FileWriteLong関数の仕様は以下の通りです。
uint FileWriteLong(
int file_handle, // ファイルハンドル
long value // 書き込む値
);
パラメーター
- file_handle:
FileOpen()関数によって返されたファイル識別番号です。 - value: 書き込みたい
long型(64ビット整数)の数値です。
戻り値
正常に書き込まれた場合は、書き込まれたバイト数(long型の場合は通常8)が返されます。書き込みに失敗した場合は 0 が返されます。
3. 具体的な使い方・実践サンプルコード
以下は、EAが注文を出した際の「チケット番号」をバイナリファイルに保存する、実用的なサンプルコードです。
//+------------------------------------------------------------------+
//| チケット番号をバイナリファイルに保存するサンプル |
//+------------------------------------------------------------------+
void SaveTicketBinary(long ticket_number)
{
string file_name = "last_ticket.bin";
// ファイルをバイナリ書き込みモードで開く
// FILE_BIN を指定するのが必須
int file_handle = FileOpen(file_name, FILE_WRITE|FILE_BIN);
if(file_handle != INVALID_HANDLE)
{
// long型のデータを書き込む
uint bytes_written = FileWriteLong(file_handle, ticket_number);
if(bytes_written > 0)
{
Print("チケット番号の保存に成功: ", ticket_number, " (", bytes_written, " bytes)");
}
else
{
Print("書き込みエラー。エラーコード: ", GetLastError());
}
// 必ずファイルを閉じる
FileClose(file_handle);
}
else
{
Print("ファイルオープンに失敗しました。エラーコード: ", GetLastError());
}
}
このコードを実行すると、MQL5\Filesフォルダ内にlast_ticket.binというファイルが作成されます。このファイルはバイナリ形式のため、メモ帳で開いても文字化けして見えますが、FileReadLong関数を使えば正確に元の数値を読み出すことが可能です。
4. 使用上の注意点とよくあるエラー
-
FILE_BINフラグの強制:
FileWriteLongを使用する際は、FileOpen時に必ずFILE_BINフラグを指定してください。FILE_CSVやFILE_TXTを指定したファイルに対してこの関数を使用すると、予期しない動作やエラーの原因となります。 -
エンディアンの意識:
MQL5はリトルエンディアンを採用しています。他言語のシステムとバイナリデータをやり取りする場合、バイトオーダーが異なると数値が壊れるため注意が必要です(MQL5内だけで完結する場合は意識する必要はありません)。 -
ファイルポインタの管理:
複数のlong値を連続で書き込む場合、ファイルポインタは自動的に8バイトずつ進みます。特定の場所に上書きしたい場合は、FileSeek関数を併用して書き込み位置を制御する必要があります。 -
ディスク容量とクローズの忘れ:
非常に高頻度で書き込みを行う場合、FileCloseを忘れるとファイルがロックされ続け、他のプロセスからのアクセスやデータの確定ができなくなります。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムのロジックが完璧であっても、それを実行する「環境」が劣悪であれば、利益は瞬く間にスリッページ(注文価格の乖離)によって削り取られます。日本の一般的な家庭用インターネット回線や無線Wi-Fi環境は、日常利用には十分ですが、ミリ秒単位の争いとなるFXトレードにおいては致命的なネットワーク遅延(レイテンシ)を抱えています。自宅PCでの運用は、停電やWindows Updateによる強制再起動のリスクに加え、物理的な距離に起因する約定遅延が避けられません。
プロのトレーダーが極限まで約定スピードを追求する場合、ブローカーの取引サーバーが設置されているデータセンターに物理的に近い、高性能な専用VPS(仮想専用サーバー)の利用が必須条件となります。専用VPSを利用することで、ネットワーク経路を最適化し、自宅からの注文では到達不可能なレベルの超低レイテンシを実現できます。わずか数ミリ秒の短縮が、年間を通した収益曲線に劇的な差をもたらすことを、エンジニアとして常に意識すべきです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント