1. SocketTlsHandshake関数の概要と実務での活用法
MQL5におけるSocketTlsHandshakeは、確立されたTCP接続(ソケット)に対してTLS(Transport Layer Security)による暗号化ハンドシェイクを実行するための関数です。簡単に言えば、普通の通信を「安全な通信(HTTPSなどと同様の暗号化状態)」へアップグレードするための鍵となるステップです。
実務での活用シーン
最近のWebサービス(LINE、Discord、Slack、各種金融APIなど)は、セキュリティの観点からほぼ例外なく暗号化通信を要求します。MQL5には便利なWebRequest関数がありますが、これには「呼び出し中にEAの動作が止まる(ブロッキング)」「タイムアウトが5秒固定」といった制約があります。
実務で「バックグラウンドで非同期に外部サーバーと通信したい」、あるいは「独自のプロトコルで安全にデータを送受信したい」という高度なシストレを構築する場合、Socket系関数を組み合わせて自作の通信処理を書く必要があり、その際にこのSocketTlsHandshakeが必須となります。
つまずきやすいポイント
初心者が最もつまずくのは、「いつ呼び出すか」というタイミングです。この関数は、SocketConnectでサーバーとの物理的な接続が成功した直後に実行しなければなりません。また、接続先のホスト名がSSL証明書のドメインと一致していないと失敗するため、IPアドレスで直接接続している場合などは注意が必要です。
2. 構文と戻り値
SocketTlsHandshake関数のインターフェースは非常にシンプルです。
bool SocketTlsHandshake(
const int socket, // ソケットハンドル
const string host // 接続先のホスト名(ドメイン名)
);
パラメーター
- socket:
SocketCreateで作成し、SocketConnectで接続済みのソケットハンドルを指定します。 - host: 接続先サーバーのドメイン名(例: “api.example.com”)を指定します。これはSSL証明書の検証に使用されます。
戻り値
- 成功時:
true - 失敗時:
false(失敗の理由はGetLastError()で確認できます。エラーコード 5273 は「TLSハンドシェイク失敗」を意味することが多いです)
3. 具体的な使い方・実践サンプルコード
以下は、安全なHTTPSポート(443)に接続し、TLSハンドシェイクを行う実用的なコード例です。
// 外部通信を許可するため、MT5の設定で対象ドメインを「許可されたURL」に追加しておく必要があります。
void OnStart()
{
string host = "www.google.com"; // 接続先ホスト
int port = 443; // HTTPS(TLS)の標準ポート
int timeout = 5000; // 5秒のタイムアウト
// 1. ソケットの作成
int socket = SocketCreate();
if(socket == INVALID_HANDLE)
{
Print("ソケットの作成に失敗しました。エラー:", GetLastError());
return;
}
// 2. サーバーへ接続(TCP接続)
if(!SocketConnect(socket, host, port, timeout))
{
Print("サーバーへの接続に失敗しました。エラー:", GetLastError());
SocketClose(socket);
return;
}
// 3. TLSハンドシェイクの実行(ここで通信を暗号化)
// 第2引数のhostは証明書の検証に使われるため非常に重要です
if(!SocketTlsHandshake(socket, host))
{
Print("TLSハンドシェイクに失敗しました。エラー:", GetLastError());
SocketClose(socket);
return;
}
Print("TLS接続成功!安全な通信が確立されました。");
// 4. (例) HTTP GETリクエストの送信
string request = "GET / HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n";
char data[];
StringToCharArray(request, data);
if(SocketSend(socket, data, ArraySize(data)) < 0)
{
Print("データ送信失敗。エラー:", GetLastError());
}
else
{
Print("リクエスト送信完了。");
}
// 5. 使い終わったら必ず閉じる
SocketClose(socket);
}
4. 使用上の注意点とよくあるエラー
- ポート番号の不一致: TLS通信を行う場合、接続先ポートは通常
443(HTTPS)になります。80(HTTP)で接続した後にハンドシェイクを行おうとしても、サーバー側が対応しておらずエラーになります。 - 証明書の不備: 接続先サーバーのSSL証明書が期限切れだったり、自己署名(いわゆるオレオレ証明書)だったりする場合、
SocketTlsHandshakeは失敗します。MQL5はOSの証明書ストアを参照するため、Windows側で信頼されていない証明書は使えません。 - WebRequestとの混同:
WebRequestは内部でハンドシェイクまで自動で行ってくれます。Socket関数群を使うのは、ストリーミングデータの受信や、独自のバイナリプロトコルなど、WebRequestでは対応できない特殊な通信が必要な場合のみに限定しましょう。 - MT5の設定: ツールメニュー > オプション > エキスパートアドバイザー 画面で「WebRequestを許可するURL」にドメインを登録していないと、ソケット通信自体がブロックされることがあります。
5. 【重要】自動売買における約定スピードと環境の罠
シストレ開発において、SocketTlsHandshakeを使いこなして外部APIと連携できるようになると、トレードの幅が大きく広がります。しかし、エンジニアが最後に見落としがちなのが「物理的なネットワーク遅延」です。どんなにコードを最適化しても、自宅のPCから一般的なインターネット回線を経由して注文を出す場合、数ミリ秒から数十ミリ秒の「レイテンシ(遅延)」が発生します。この遅延は、ボラティリティが高い局面でのスリッページや約定拒否を招き、期待した期待値を大きく削り取る致命的な損失要因となります。
プロのクオンツやアルゴリズムトレーダーの世界では、ブローカーの取引サーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」を使用するのが常識です。専用環境であれば、光ファイバーの物理的な距離を最短化し、一般のネット混雑の影響を排除した極限の低遅延トレードが可能になります。1秒間に何度も価格が変動するFX市場で生き残るには、優れたロジックと同じくらい、VPSによる高速な実行環境の確保が不可欠な戦略的投資といえるでしょう。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント