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

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

MQL5のCryptDecodeは、暗号化されたデータや特定のエンコード形式(Base64など)のデータを、元の形式に復元(復号)するための関数です。対になる関数として、データを暗号化・エンコードするCryptEncodeが存在します。

実務での主な活用シーン:
1. 外部APIとの連携: Webブラウザ経由でデータをやり取りする際、データはBase64形式でエンコードされていることが多いため、これをMQL5内で読み取れる形式に戻す際に必須となります。
2. 認証情報の保護: EAのライセンス認証などで、サーバーから送られてくる暗号化された認証データを安全に受け取る際に使用します。
3. 設定ファイルの保護: 重要なパラメータやストラテジーのロジックの一部を暗号化した状態で外部ファイルに保存し、実行時にのみメモリ上で復号するといったセキュリティ対策に活用できます。

初心者が特につまずきやすいのは、「データ型の扱い」です。MQL5では文字列(string)を直接復号するのではなく、一度uchar型の配列に変換してから処理を行う必要があるため、この変換プロセスで混乱するケースが多く見られます。

2. 構文と戻り値

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

int  CryptDecode(
   ENUM_CRYPT_METHOD  method,        // 復号方法(アルゴリズム)
   const uchar        &data[],       // 復号したいデータ(ソース配列)
   const uchar        &key[],        // 復号用のキー(鍵)
   uchar              &result[]      // 復号後のデータを受け取る配列
);

パラメーター解説

  • method: ENUM_CRYPT_METHOD 列挙値から指定します。よく使われるのは CRYPT_BASE64(エンコード解除)や CRYPT_AES128, CRYPT_AES256(暗号復号)です。
  • data[]: 復号対象となるデータが入った uchar 配列です。
  • key[]: 暗号を解くための鍵です。Base64のように鍵が不要なアルゴリズムの場合は、空の配列を渡します。
  • result[]: 復号に成功したデータが格納される配列です。

戻り値

  • 成功した場合、復号後のデータサイズ(バイト数)を返します。
  • 失敗した場合は、-1 を返します。エラーの詳細は GetLastError() 関数で確認できます。

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

実務で最も頻度の高い「Base64形式でエンコードされた文字列をデコードして元のテキストに戻す」という例を紹介します。

//+------------------------------------------------------------------+
//| Base64形式の文字列をデコードするサンプルEA                           |
//+------------------------------------------------------------------+
void OnStart()
{
   // 1. デコードしたいBase64形式の文字列(例: "TFFMNSBpcyBQb3dlcmZ1bCE=" は "MQL5 is Powerful!")
   string encodedText = "TFFMNSBpcyBQb3dlcmZ1bCE=";

   // 2. string型をuchar配列に変換
   uchar data[];
   StringToCharArray(encodedText, data, 0, StringLen(encodedText));

   // 3. 結果を格納するための配列を用意
   uchar result[];
   uchar key[]; // Base64ではキーは不要

   // 4. CryptDecodeを実行 (CRYPT_BASE64を指定)
   int decodedSize = CryptDecode(CRYPT_BASE64, data, key, result);

   if(decodedSize > 0)
   {
      // 5. uchar配列からstring型へ再変換して内容を表示
      string decodedTextResult = CharArrayToString(result, 0, decodedSize);
      Print("デコード成功: ", decodedTextResult);
   }
   else
   {
      // エラー処理
      Print("デコード失敗。エラーコード: ", GetLastError());
   }
}

このコードでは、Web通信で多用されるBase64のデコードを行っています。AES暗号などを使用する場合は、第3引数の key 配列に適切な長さ(16バイトや32バイトなど)の鍵をセットすることで、高度なセキュリティを実装可能です。

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

  1. キーの長さの厳守:
    AES暗号化(CRYPT_AES128など)を使用する場合、キーの長さがアルゴリズムの規定(128bitなら16バイト)と完全に一致している必要があります。1バイトでも不足したり超過したりすると、関数は失敗します。

  2. 配列の初期化とリサイズ:
    result[] 配列は、関数内で自動的にリサイズされます。あらかじめ ArrayResize で確保しておく必要はありませんが、動的配列(サイズ指定なしで宣言した配列)を渡すようにしてください。

  3. 暗号化と復号のミスマッチ:
    CryptEncodeCRYPT_AES128 を使ったのに、CryptDecodeCRYPT_AES256 を使う」といったミスは致命的です。必ず対になるアルゴリズムを選択してください。

  4. 日本語(マルチバイト文字)の扱い:
    文字列を uchar 配列に変換する際、StringToCharArray のエンコーディング(CP_UTF8など)に注意してください。受け取り側と送り側で文字コードが異なると、復号は成功しても文字化けが発生します。

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

アルゴリズムトレードにおいて、CryptDecode を使ったセキュアな通信やデータ処理の実装は非常に重要ですが、それ以上に重要なのが「コードが実行される物理的な環境」です。どれだけ効率的なアルゴリズムを書いても、自宅のPCから一般的なインターネット回線を通じて注文を出している限り、プロの世界では勝負になりません。

一般家庭のネットワークには必ず「ゆらぎ(ジッター)」や「物理的な距離による遅延(レイテンシ)」が存在します。わずか0.1秒の遅延が、スリッページによる利益の削り取りや、最悪の場合、約定拒否(リクオート)を招き、バックテストの結果とはかけ離れた致命的な損失を生む原因となります。極限まで約定スピードを高め、安定した24時間稼働を実現するには、ブローカーのサーバーに物理的に近いデータセンターに設置された、自動売買専用のVPS(仮想専用サーバー)の利用が不可欠です。インフラを整えることは、手法を磨くことと同じくらい重要なクオンツの基本です。

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

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

コメント

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