コンテンツにスキップ

【移植#40】日本語変数名は今も使える? — MQL5の仕様境界を実機で確かめる

EURUSDのH1チャート上で日本語識別子、原典の7文字、Unicode文字列を検証し、8バッファの合格を表示したMT5画面

この記事の3行まとめ

  • 現行MetaEditorでは日本語の変数名・関数名と、原典で化けた7文字が0エラー・0警告で動きました
  • ただし、MQL5公式仕様が識別子として明記するのは英字・数字・アンダースコアだけです
  • 配布コードはASCII識別子にし、日本語はコメント・文字列・入力欄の表示名へ分けるのが安全です

今回の原典は「日本語の変数名」

投稿日順で次に当たる2010年1月29日の記事は、MQL4の変数名や関数名へ日本語を使う実験でした。

元記事「MQL4で日本語変数名を使用する場合の注意事項」を読む

原典では、残高のような日本語変数は読みやすく、スペルミスも減らせると紹介されています。一方、Shift-JISで「タ」を表す2バイトの後半0x5Eが半角の^と同じ値になるため、MetaEditor上で識別子が化ける文字もあるという注意が続きます。具体例は「タ・ゼ・ゾ・ボ・ポ・マ・ミ」です。

最後は「真に受けないで下さいね」と締める、少しユーモラスな記事でした。ただ、文字コードとコンパイラの境界を実物で確かめる視点は、今も大切です。


現行MetaEditorでは7文字とも通った

今回の配布インジケーターには、意図的に日本語の関数名、引数名、ローカル変数名を含めました。

MQL
double 日本語で加算(const double 左側, const double 右側)
{
   const double 合計 = 左側 + 右側;
   return 合計;
}

さらに、原典で問題になった7文字をそれぞれ変数名にしています。

MQL
const double  = 1.0;
const double  = 2.0;
const double  = 3.0;
const double  = 4.0;
const double  = 5.0;
const double  = 6.0;
const double  = 7.0;

MetaTrader 5 build 5836のMetaEditorでは配布版が0エラー・0警告でコンパイルされ、専用MT5でも日本語関数の計算結果42、7文字の合計28を確認できました。原典にあったShift-JIS特有の化け方は、今回の環境では再現しませんでした。

ただし、ここで「日本語識別子は正式に保証された」と結論づけるのは早計です。


「コンパイルできる」と「公式仕様」は別

MQL5公式リファレンスのIdentifiersは、識別子に書ける文字を次のように定めています。

  • 大文字・小文字のラテン文字A-Za-z
  • 数字0-9
  • アンダースコア_
  • 先頭文字は数字にできない
  • 長さは最大63文字
  • 予約語と同じ名前は使えない

日本語は、この一覧に含まれていません。現行コンパイラが受け付けても、公式に文書化された移植性の範囲外です。MetaEditorの世代、外部エディタ、静的解析、コード生成、差分表示などをまたいだとき、同じ扱いになる保証はできません。

そこで配布版は、日本語識別子が動く事実を検証しつつ、同じ計算をASCII識別子でも実行して一致を確かめます。動作確認の題材と、実運用の命名方針を分けました。


日本語は表示側へ置ける

識別子をASCIIへ寄せても、利用者に見える部分まで英語にする必要はありません。

MQL5の文字列はUnicodeを扱えます。公式Algo BookのString typeでは、文字列がushortの並びとして完全なUnicode範囲を扱うと説明されています。今回もStringLen("残高")が2文字になることを確認しました。

入力パラメーターは、公式リファレンスのInput Variablesにあるinput(name="...")を使うと、日本語の表示名を付けられます。

MQL
input(name="表示期間の例") int InpSamplePeriod = 14;
input(name="判定パネルを表示") bool InpShowPanel = true;

この分け方なら、コード側はInpSamplePeriodとして検索・連携しやすく、MT5の入力画面では「表示期間の例」と読めます。日本語コメントも同じ考え方で使えます。


8バッファでコンパイル後の実行まで確認する

「コンパイル成功」だけでは、関数が本当に呼ばれたかまでは分かりません。配布インジケーターは、次の8項目を計算バッファへ公開します。

  1. 全体合格フラグ
  2. 日本語関数による19 + 23
  3. 原典の7文字を使った変数の合計
  4. ASCII関数による19 + 23
  5. 日本語文字列残高の文字数
  6. 日本語表示名を持つ入力値
  7. 実行中ターミナルのビルド番号
  8. パネル用オブジェクト数

検証EAはCopyBuffer()を8本すべて1件ずつ読み、日本語関数とASCII関数がどちらも42、7文字の合計が28、文字列長が2、入力値が14であることを独立に照合しました。

検証項目 結果
配布インジケーターのコンパイル 0エラー・0警告
検証EAのコンパイル 0エラー・0警告
MetaTrader 5 build 5836
日本語の関数名・引数名・変数名 実行成功
原典の7文字 7 / 7文字で実行成功
日本語関数とASCII関数 42で一致
Unicode文字列残高 2文字
診断バッファ 8本一致
パネルオブジェクト 9個一致
実画面キャプチャー 成功
売買注文 なし
外部ファイルの作成・更新 なし

ダウンロードと使い方

40_MQL5_Unicode_Identifier_Preflight_v1_00.mq5 をダウンロード

MT5のIndicatorsへ保存してコンパイルし、任意のチャートへ適用してください。チャート左上のパネルへ、日本語識別子の計算、原典の7文字、Unicode文字列、公式仕様に沿う命名方針を表示します。

コードを開くと、日本語識別子による実験部分と、ASCII識別子による同じ計算を比較できます。実際のEAやインジケーターへ流用するときは、ASCII側の書き方を選んでください。


使えないこと・注意点

  • この結果は、検証時の現行MetaEditorで日本語識別子が通ったことを示すものです。将来や別環境での互換性は保証しません。
  • 日本語識別子はMQL5公式リファレンスが列挙する文字集合の外側です。
  • ソースの保存形式や外部ツールによっては、文字化け・正規化・検索漏れが起こる可能性があります。
  • 見た目が似た全角・半角文字やUnicode文字を混ぜると、レビュー時に別名を見落としやすくなります。
  • 難読化やソース保護の手段として日本語識別子へ頼らないでください。
  • 配布版は売買ロジックを持たず、取引成績を評価するものではありません。

ロジック評価の結論

原典の「日本語で書けば読みやすい」という発想は、今のMetaEditorでも技術的には動きました。しかも、Shift-JIS時代に問題になった7文字まで正常にコンパイル・実行できています。

一方、公式仕様が識別子として約束しているのはASCIIの一部です。自分の環境で一度通ることと、他人の環境へ安全に渡せることは同じではありません。

読みやすさを残しながら移植性も取りたいなら、変数名・関数名はASCII、日本語は入力欄の表示名・コメント・パネル文字列へ置くのが落としどころです。「コンパイラが許した範囲」ではなく、「仕様が約束した範囲」を配布コードの基準にしておくと、あとで困りにくくなります。


前後の記事

前: 【移植#39】Level IIは接続先しだい — MT5で板情報の有無を確かめる

— SPONSORED —