見出し画像

MT4小ネタno.1 .mq4ファイルをGithubで差分表示する方法

今日はMT4、Gitに関する小ネタです。

この記事では、MT4の.mq4ファイルはGithubでは何もしないとバイナリファイルと認識され、差分表示ができませんが、その対応方法を共有します。

背景

MT4で実装しているFXトレードの自動売買のEAスクリプトをGithubで管理、複数環境で共有できるようにしています。
そのままだと、MT4で作成される .mq4ファイルはバイナリファイルとなり、以下の画像のように差分が表示されずに非常に不便です。

ネットで調べたところ分かりにくい説明が多く、対応方法が見当たらなかったので本格的に調べてみました。
調査した内容と対応方法について共有します。

【結論】MT4 .mq4ファイルをGithubで差分表示する方法

まず結論からですが、対応方法は以下のとおりになります。
この対応の、理由・背景については後述します。

  1.  .mq4 ファイルを utf-16LEとして保存する

  2.  Gitリポジトリに以下の内容を保持する .gitattributes ファイルを追加する 

*.mq4		text working-tree-encoding=UTF-16LE-BOM

とこれだけの対応になりますが、この結論にたどり着くまでには非常に時間がかかりました。
以下、調査して理解したMT4および Gitの仕様的なものを説明します。

MT4で利用されるエンコーディング

MT4で作成するEAなどのスクリプトは .mq4の拡張子をもつファイルとして保存されます。このファイルのエンコーディングについて実際に試してみて以下の事項が確認できました。

  • MT4のエディタでは、.mq4は ANSI, Unicodeで保存できる

  • このUnicodeとは、UTF-16LE(BOMあり) とも呼ばれるエンコーディング

  • ANSI(=SJIS or CP932)はUnicode対応されていないWindowsアプリケーションで利用されるエンコーディング

  • MT4では、ANSIで保存された .mq4ファイルをコンパイルすると Unicodeに変換され、保存される。

.mq4のエンコーディングの指定

今回調査に時間がかかった一つの理由が、保存時に指定したエンコーディングがコンパイル時に勝手にUnicodeに変換されることを認識していなかったことです。
なお、UTF-16とは、エンディアンとは、BOMとはといった説明は、ネットにいろいろ情報がありますので検索の上ご確認ください。

Gitでのテキスト、差分表示可否の判別

Git、Github側でテキスト、および、差分表示可と判別する条件、仕組みについても調べました。
ネットにもいろいろ情報がありますが、前提・背景などが記載されていないものが多く、今回のケースに該当・適用できない、または、判断が難しいものが多かったです。
そのため、最終的には gitの仕様原文(英語)にて確認しました。
確認できたことを整理すると、

  • Gitリポジトリへのコミットでは、バイナリファイルはそのまま、テキストは設定により改行記号、エンコーディングの変換がされる

  • バイナリの判定条件は、Githubの場合は変更ができず、先頭8,000バイトにnull(x'00')があるとバイナリと認識される。
    https://qiita.com/okuoku/items/a21bfa68570ca67817ac

  • コミット時に改行、エンコーディングを変換する仕組みとして、.gitattributesがある。

  • .gitattributesでエンコーディングを指定すると変換後のファイルはgitでのテキストの既定エンコーディングのutf-8でリポジトリに保管される。

  • 適切に変換されテキストと判定されるものは、Githubでもテキスト表示、バージョン間の差分表示がされる。

.gitattributesについて参考にした記事、および、仕様原文はこちらになります。


以上のことを理解すると、MT4の.mq4ファイルを Unicode(=UTF-16LE BOM付き)で統一すればgitでうまくハンドリングできることが分かります。
注意点として、MT4ではASCII(SJIS)、Unicodeともにサポートしているので、間違ってSJISのファイルのままでコミットしないように注意しないといけません。
きちんとコンパイルした後にコミットする手順であればおそらく問題ないと思います。

以上の設定でGithubにコミットしてあげると下図のとおりに差分表示してくれるようになります。

上の差分で表示されていますが、working-tree-encoding=UTF-16LE ではダメで、working-tree-encoding=UTF-16LE-BOMとBOM付き指定にしてあげる必要があります。

最後に

この記事はお気に入りいただけましたでしょうか?
内容お役にたちましたらうれしく思います。
また、サポートなど応援いただけましたら幸いです。


いいなと思ったら応援しよう!

なべなべ
記事の内容を有効に活用できた、記事を気に入っていただけたようでしたらチップでサポートいただけますと嬉しいです。 また、こんなことを知りたい、あんなことができないかなど記事にしたいことがございましたら、サポートの有無にかかわらずお知らせくださいませ。