1. TextOut関数の概要と実務での活用法
MQL5のTextOutは、メモリ上に確保した描画領域(動的リソース)に対してテキストを描画するための関数です。
多くの初心者は、チャートに文字を表示する際にObjectCreateでOBJ_LABEL(ラベル)を量産しがちですが、これは実務上、大きな落とし穴になります。ラベルオブジェクトを100個配置すると、チャートの描画負荷が激増し、ターミナルの動作が重くなる原因となるからです。
そこでプロのクオンツエンジニアが多用するのが、このTextOutです。
TextOutを使うと、「1枚のビットマップ画像」の中に全ての情報を書き込むことができます。
- 実務での活用例: 高機能な情報パネル、カスタムインジケーターの数値表示、リアルタイムのバックテスト統計、あるいは独自のボタンやGUIコンポーネントの作成。
- つまずきやすい点:
TextOutは「チャートに直接文字を書く関数」ではありません。「配列(ピクセルデータ)の中に文字を書き込む関数」であるため、その後にResourceCreateでリソース化し、OBJ_BITMAP_LABELに適用するという一連の手順が必要です。
2. 構文と戻り値
TextOut関数の基本的な構文は以下の通りです。
bool TextOut(
const string text, // 描画するテキスト
int x, // 描画開始位置(X座標)
int y, // 描画開始位置(Y座標)
uint anchor, // アンカーポイント(配置基準)
uint &data[], // ピクセルデータが格納される配列
uint width, // 描画領域の幅
uint height, // 描画領域の高さ
uint color, // テキストの色(ARGB形式)
ENUM_COLOR_FORMAT color_format // カラー形式
);
パラメーター解説
- text: 表示したい文字列です。
- x, y: アンカーポイントを基準とした描画開始座標です。
- anchor:
TA_LEFT,TA_CENTER,TA_RIGHTなど、テキストをどの位置基準で配置するかを指定します。 - data[]: 最重要項目です。ここに文字が「絵」として書き込まれます。配列サイズは
width * heightである必要があります。 - width, height: 描画するキャンバスのサイズです。
- color:
0xFF0000FF(青)のようなARGB形式(アルファチャネル込み)で指定します。 - color_format: 通常は
COLOR_FORMAT_ARGB_NORMALIZEを使用することで、透明度を含めた綺麗な描画が可能です。
戻り値
成功した場合は true、失敗した場合は false を返します。
3. 具体的な使い方・実践サンプルコード
以下は、EAの実行中に「現在のスプレッド」と「本日の損益」をチャート上に美しく表示する実践的なコード例です。
//--- プロパティ設定
#property copyright "Quant Engineer"
#property strict
//--- 定数
#define CANVAS_WIDTH 200
#define CANVAS_HEIGHT 100
#define RESOURCE_NAME "::InfoPanel"
//--- グローバル変数
uint ExtBuffer[]; // ピクセルデータを格納する配列
string ObjName = "Dashboard_Label";
int OnInit() {
// 1. 配列のサイズをキャンバスサイズに合わせる
ArrayResize(ExtBuffer, CANVAS_WIDTH * CANVAS_HEIGHT);
// 2. ビットマップラベルオブジェクトをチャートに作成
ObjectCreate(0, ObjName, OBJ_BITMAP_LABEL, 0, 0, 0);
ObjectSetString(0, ObjName, OBJPROP_BMPFILE, RESOURCE_NAME);
ObjectSetInteger(0, ObjName, OBJPROP_XDISTANCE, 20);
ObjectSetInteger(0, ObjName, OBJPROP_YDISTANCE, 20);
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) {
ObjectDelete(0, ObjName);
ResourceFree(RESOURCE_NAME);
}
void OnTick() {
// キャンバスをクリア(背景を半透明の黒にする)
ArrayFill(ExtBuffer, 0, CANVAS_WIDTH * CANVAS_HEIGHT, ColorToARGB(clrBlack, 150));
// スプレッド情報の取得
int spread = (int)SymbolInfoInteger(_Symbol, SYMBOL_SPREAD);
string text = StringFormat("Spread: %d", spread);
// 3. TextOutで配列に文字を書き込む
// 中央揃え(TA_CENTER | TA_VCENTER)で描画
TextOut(text, CANVAS_WIDTH/2, 30, TA_CENTER|TA_VCENTER, ExtBuffer, CANVAS_WIDTH, CANVAS_HEIGHT, ColorToARGB(clrWhite), COLOR_FORMAT_ARGB_NORMALIZE);
// 別の行を追加
TextOut("Status: Running", CANVAS_WIDTH/2, 60, TA_CENTER|TA_VCENTER, ExtBuffer, CANVAS_WIDTH, CANVAS_HEIGHT, ColorToARGB(clrLime), COLOR_FORMAT_ARGB_NORMALIZE);
// 4. 更新した配列をリソースとして反映させる
ResourceCreate(RESOURCE_NAME, ExtBuffer, CANVAS_WIDTH, CANVAS_HEIGHT, 0, 0, CANVAS_WIDTH, COLOR_FORMAT_ARGB_NORMALIZE);
// チャートを強制再描画
ChartRedraw();
}
4. 使用上の注意点とよくあるエラー
- 配列サイズの不一致:
data[]配列の要素数がwidth * heightと正確に一致していない場合、TextOutは失敗します。動的にサイズを変更する場合は、必ずArrayResizeを忘れないようにしてください。 - カラーコードの指定:
通常のclrRedなどの定数はcolor型ですが、TextOutで透明度を扱う場合はuint型のARGB形式が必要です。ColorToARGB(clrRed, 255)のように変換関数を通すのが安全です。 - リソース名のプレフィックス:
ResourceCreateで使うリソース名には、必ず::(ダブルコロン)を先頭に付けてください(例:::MyResource)。これを忘れると、EA内部でリソースを正しく参照できません。 - CPU負荷:
OnTickごとにResourceCreateを呼び出すのは問題ありませんが、描画サイズが巨大(例: 2000×2000ピクセル以上)になると、計算量が増え、EAの動作速度に影響を与える可能性があります。必要な最小限のサイズで作成しましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードの世界において、TextOutを駆使してどれほど完璧なダッシュボードを作り上げたとしても、実行環境が貧弱であればすべてが無意味になります。特に自宅のPCでMT5を稼働させている場合、家庭用インターネット回線の「ネットワーク遅延(レイテンシ)」が致命的なリスクとなります。
FX会社のサーバーから物理的に離れた場所にある自宅PCでは、注文を出してからサーバーに届くまでに数十から数百ミリ秒の遅延が発生します。急激な価格変動時には、この僅かな遅延の間に価格が滑り(スリッページ)、本来得られるはずだった利益が消失、あるいは損失が拡大します。プロレベルの約定スピードと24時間の安定稼働を実現するには、ブローカーのサーバーに近いロケーションに設置された「専用のVPS(仮想専用サーバー)」の導入が必須です。インフラを軽視するエンジニアに、継続的な勝利はありません。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント