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[] // 結果を受け取る配列
);
パラメーター解説
- method:
ENUM_CRYPT_METHOD列挙型から選択します。- ハッシュ系:
CRYPT_HASH_MD5,CRYPT_HASH_SHA256など - 暗号化系:
CRYPT_AES128,CRYPT_AES256など - 圧縮系:
CRYPT_ARCH_ZIP
- ハッシュ系:
- data[]: 変換したい元のデータを格納した
uchar型の配列です。 - key[]: 暗号化に使用する秘密鍵です。ハッシュ化や圧縮の場合は、空の配列を渡します。
- 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. 使用上の注意点とよくあるエラー
開発時にハマりやすいポイントをまとめました。
- キーの長さに注意(AES暗号化など):
AES256を使用する場合、key[]配列は正確に32バイト(256ビット)である必要があります。1バイトでも足りないとエラーになります。 - StringToCharArrayの仕様:
デフォルトのStringToCharArrayは文字列の終端文字(NULL)を配列に含めてしまいます。ハッシュ化の結果が他の言語(PythonやPHP)と合わない場合は、サンプルコードのようにStringLen(text)を指定して終端文字を除外してください。 - ArraySizeの自動調整:
result[]配列はCryptEncode内で自動的にリサイズされます。事前にArrayResizeでサイズを確保しておく必要はありません。 - Base64エンコードとの混同:
CryptEncodeにはCRYPT_BASE64というメソッドもありますが、これは「暗号化」ではなく「バイナリをテキスト形式に変換する」ためのものです。Web通信で暗号化データを送る際は、AESで暗号化 -> Base64でテキスト化という2ステップを踏むのが一般的です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムの堅牢性を高めるために CryptEncode でセキュリティを強化したとしても、トレードの現場には「ネットワーク遅延」というエンジニアが最も警戒すべき敵が潜んでいます。自宅のPCや一般的な光回線でEAを運用することは、クオンツの観点から言えば非常にリスクが高い行為です。家庭用回線は他の通信の干渉を受けやすく、またブローカーのサーバーとの物理的な距離があるため、ミリ秒単位の遅延(レイテンシ)が日常的に発生します。
このわずかな遅延は、ボラティリティが高い局面において「本来のシグナル価格から乖離した価格での約定(スリッページ)」を引き起こし、期待期待値を大幅に削り取ります。どれほど洗練されたロジックも、実行環境が不安定であれば損失を生むツールに成り下がります。約定スピードを極限まで高め、環境による不確定要素を排除するには、ブローカーのデータセンターに近い場所に位置する自動売買専用のVPS(仮想専用サーバー)の利用が不可欠です。24時間365日の安定稼働と低レイテンシを確保することこそが、プロのシストレ開発者が最初に行うべき「最強の最適化」と言えるでしょう。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント