1. TextGetSize関数の概要と実務での活用法
MQL5でカスタムインジケーターやEA(エキスパートアドバイザー)を開発している際、「チャート上に表示したテキストの背景にちょうど良いサイズの枠を付けたい」あるいは「複数のテキストを綺麗に整列させたい」と考えたことはないでしょうか。
TextGetSize関数は、指定したフォント設定に基づいて、特定の文字列が描画された際の正確な幅(Width)と高さ(Height)をピクセル単位で取得するための関数です。
実務開発において、初心者が陥りやすいのが「文字数 × 8ピクセル」といった固定値による座標計算です。しかし、フォントがプロポーショナルフォント(文字ごとに幅が異なるもの)であったり、ユーザーがチャートのフォント設定を変更したりすると、表示が崩れて文字が枠からはみ出す原因になります。
この関数を活用することで、テキストの長さに応じて背景の四角形(矩形)のサイズを動的に変更したり、右詰め・中央揃えといった高度なレイアウトをピクセル精度で実装できるようになります。
2. 構文と戻り値
TextGetSize関数の基本的な構文は以下の通りです。
bool TextGetSize(
const string text, // 計測したい文字列
int& width, // 幅(参照渡しで値を受け取る)
int& height // 高さ(参照渡しで値を受け取る)
);
パラメーター
- text: サイズを調べたい文字列を指定します。
- width: 計算された幅が格納される
int型の変数。 - height: 計算された高さが格納される
int型の変数。
戻り値
- 成功した場合は
true、失敗した場合はfalseを返します。 - 失敗した場合は、
GetLastError()関数で詳細なエラーコードを確認できます。
※注意:この関数が返すサイズは、現在のチャートコンテキストで設定されている「フォントの設定」に依存します。そのため、事前に TextSetFont 関数でフォント名やサイズを指定しておくのが一般的です。
3. 具体的な使い方・実践サンプルコード
以下は、EAのチャート上に「現在のスプレッド」を表示し、そのテキストサイズに合わせて背景のラベル(CanvasやRectangle)のサイズを自動調整するようなロジックの基礎となるコード例です。
//+------------------------------------------------------------------+
//| TextSizeExample.mq5 |
//+------------------------------------------------------------------+
#property strict
// イベントハンドラ:チャートプロパティ変更時や初期化時
void OnStart()
{
string textToDisplay = "Spread: 1.2 pips"; // 表示したい文字列
string fontName = "Arial"; // 使用するフォント
int fontSize = -120; // フォントサイズ(12ポイント = 120)
int width, height;
// 1. まず使用するフォントを設定する(TextGetSizeの計算に影響する)
// 第3引数以降はフラグ(太字など)
if(!TextSetFont(fontName, fontSize, FW_NORMAL))
{
Print("フォント設定に失敗しました。");
return;
}
// 2. 文字列のサイズを取得
if(TextGetSize(textToDisplay, width, height))
{
PrintFormat("テキスト: '%s'", textToDisplay);
PrintFormat("計算されたサイズ: 幅 = %d px, 高さ = %d px", width, height);
// ここで取得した width と height を使って
// OBJ_RECTANGLE_LABEL のサイズ(OBJPROP_XSIZE, OBJPROP_YSIZE)を設定すれば
// 文字にぴったりの背景枠が作れます。
}
else
{
Print("サイズ取得失敗。エラーコード: ", GetLastError());
}
}
4. 使用上の注意点とよくあるエラー
-
TextSetFontとの併用が必須
TextGetSizeは、直前にTextSetFontで設定されたフォント情報を元に計算を行います。これを忘れると、デフォルトのシステムフォントで計算されてしまい、実際にチャート上に表示されるテキスト(OBJ_LABEL等)とサイズがズレる原因になります。 -
フォントサイズの指定単位
MQL5のTextSetFontでは、サイズを「ポイント単位」の10倍で指定するか、負の値でピクセル指定するなどのルールがあります。ここでの指定を間違えると、計算されるサイズが極端に大きくなったり小さくなったりします。 -
表示オブジェクトとの同期
TextGetSizeはあくまで「計算」を行う関数であり、チャート上のOBJ_LABELオブジェクトのサイズを自動で変えてくれるわけではありません。取得した値を元に、ObjectSetInteger等でオブジェクトのプロパティを書き換えるコードをセットで記述する必要があります。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、UIを綺麗に整えることは運用の安心感に繋がりますが、それ以上に重要なのが「実行環境のレスポンス」です。どんなに優れたロジックでミリ秒単位の計算を行っても、ご家庭のPCと一般的なインターネット回線では、物理的な距離に起因するネットワーク遅延(レイテンシ)が発生し、注文が証券会社に届くまでに致命的なタイムラグが生じます。
この遅延は、急変時のスリッページや約定拒否を招き、期待した期待値を大幅に削り取ります。プロのクオンツエンジニアにとって、取引サーバーの至近距離に位置する専用のVPS(仮想専用サーバー)を利用することは、もはやオプションではなく必須条件です。安定した約定スピードを確保し、インフラ側のリスクを排除して初めて、あなたの書いたアルゴリズムは真のパフォーマンスを発揮できるのです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント