【MQL5】CryptEncode関数の使い方と自動売買実装コード

1. CryptEncode関数の概要と実務での活用法

CryptEncodeは、MQL5においてデータの「暗号化」「ハッシュ化」「圧縮」を行うための非常に強力な組み込み関数です。MQL5で本格的なトレードシステムを構築しようとすると、単にインジケーターを動かすだけでなく、外部との通信やデータの保護が必要になる場面が増えてきます。

実務レベルでは、主に以下のようなシーンで活用されます。

  • 認証とセキュリティ: 外部サーバー(Web APIなど)と通信する際、パスワードやAPIキーをそのまま送らず、ハッシュ化(SHA-256など)して送信する。
  • 知的財産の保護: EAのライセンス認証情報をローカルファイルに保存する際、中身をAESなどで暗号化し、ユーザーによる書き換えや盗み見を防ぐ。
  • 通信量の削減: 巨大なログデータやティックデータを外部に送る際、ZIP圧縮をかけて転送効率を高める。

初心者や中級者が最初につまずきやすいのは、「文字列(string)を直接扱えない」という点です。この関数はバイナリデータ(uchar型の配列)を対象とするため、文字列を一度配列に変換する手間が必要になります。ここを理解することが、CryptEncodeを使いこなす第一歩です。

2. 構文と戻り値

CryptEncode関数の基本的な構文は以下の通りです。

int  CryptEncode(
   ENUM_CRYPT_METHOD  method,        // 変換メソッド(暗号化・ハッシュ化・圧縮の種類)
   const uchar&       data[],        // ソースデータ(変換したいデータ)
   const uchar&       key[],         // 暗号化キー(ハッシュ化や圧縮の場合は空でも可)
   uchar&             result[]       // 結果を受け取る配列
   );

パラメーター解説

  1. method: ENUM_CRYPT_METHOD 列挙型から選択します。
    • ハッシュ系: CRYPT_HASH_MD5, CRYPT_HASH_SHA256 など
    • 暗号化系: CRYPT_AES128, CRYPT_AES256 など
    • 圧縮系: CRYPT_ARCH_ZIP
  2. data[]: 変換したい元のデータを格納した uchar 型の配列です。
  3. key[]: 暗号化に使用する秘密鍵です。ハッシュ化や圧縮の場合は、空の配列を渡します。
  4. result[]: 処理結果(暗号化されたデータなど)が格納される配列です。

戻り値

  • 成功した場合:result[] 配列に書き込まれたバイト数が返ります。
  • 失敗した場合:-1 が返ります。エラーの詳細は GetLastError() で確認できます。

3. 具体的な使い方・実践サンプルコード

ここでは、実務で最も頻繁に利用される「文字列をSHA-256でハッシュ化(暗号学的変換)する方法」のサンプルコードを紹介します。これはAPI連携時の署名作成などにそのまま応用できます。

//+------------------------------------------------------------------+
//| 実行スクリプト:文字列をSHA-256でハッシュ化するサンプル            |
//+------------------------------------------------------------------+
void OnStart()
{
   string text = "MySecretPassword123"; // ハッシュ化したい元の文字列
   uchar data[];                       // 元データを格納する配列
   uchar key[];                        // ハッシュ化にキーは不要(空配列)
   uchar result[];                     // 結果を受け取る配列

   // 1. 文字列をuchar配列に変換(末尾のNULL文字は含めない)
   StringToCharArray(text, data, 0, StringLen(text));

   // 2. CryptEncodeを実行(SHA-256ハッシュを指定)
   int res = CryptEncode(CRYPT_HASH_SHA256, data, key, result);

   if(res > 0)
   {
      // 3. 結果を表示(バイナリなので16進数文字列に変換して出力)
      string hexResult = "";
      for(int i = 0; i < ArraySize(result); i++)
      {
         hexResult += StringFormat("%02x", result[i]);
      }
      Print("元の文字列: ", text);
      Print("ハッシュ値 (SHA-256): ", hexResult);
   }
   else
   {
      Print("エラーが発生しました。コード: ", GetLastError());
   }
}

4. 使用上の注意点とよくあるエラー

開発時にハマりやすいポイントをまとめました。

  1. キーの長さに注意(AES暗号化など):
    AES256を使用する場合、key[] 配列は正確に32バイト(256ビット)である必要があります。1バイトでも足りないとエラーになります。
  2. StringToCharArrayの仕様:
    デフォルトの StringToCharArray は文字列の終端文字(NULL)を配列に含めてしまいます。ハッシュ化の結果が他の言語(PythonやPHP)と合わない場合は、サンプルコードのように StringLen(text) を指定して終端文字を除外してください。
  3. ArraySizeの自動調整:
    result[] 配列は CryptEncode 内で自動的にリサイズされます。事前に ArrayResize でサイズを確保しておく必要はありません。
  4. Base64エンコードとの混同:
    CryptEncode には CRYPT_BASE64 というメソッドもありますが、これは「暗号化」ではなく「バイナリをテキスト形式に変換する」ためのものです。Web通信で暗号化データを送る際は、AESで暗号化 -> Base64でテキスト化 という2ステップを踏むのが一般的です。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムの堅牢性を高めるために CryptEncode でセキュリティを強化したとしても、トレードの現場には「ネットワーク遅延」というエンジニアが最も警戒すべき敵が潜んでいます。自宅のPCや一般的な光回線でEAを運用することは、クオンツの観点から言えば非常にリスクが高い行為です。家庭用回線は他の通信の干渉を受けやすく、またブローカーのサーバーとの物理的な距離があるため、ミリ秒単位の遅延(レイテンシ)が日常的に発生します。

このわずかな遅延は、ボラティリティが高い局面において「本来のシグナル価格から乖離した価格での約定(スリッページ)」を引き起こし、期待期待値を大幅に削り取ります。どれほど洗練されたロジックも、実行環境が不安定であれば損失を生むツールに成り下がります。約定スピードを極限まで高め、環境による不確定要素を排除するには、ブローカーのデータセンターに近い場所に位置する自動売買専用のVPS(仮想専用サーバー)の利用が不可欠です。24時間365日の安定稼働と低レイテンシを確保することこそが、プロのシストレ開発者が最初に行うべき「最強の最適化」と言えるでしょう。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました