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

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

MQL5のTextOutは、メモリ上に確保した描画領域(動的リソース)に対してテキストを描画するための関数です。

多くの初心者は、チャートに文字を表示する際にObjectCreateOBJ_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. 使用上の注意点とよくあるエラー

  1. 配列サイズの不一致:
    data[] 配列の要素数が width * height と正確に一致していない場合、TextOutは失敗します。動的にサイズを変更する場合は、必ず ArrayResize を忘れないようにしてください。
  2. カラーコードの指定:
    通常の clrRed などの定数は color 型ですが、TextOut で透明度を扱う場合は uint 型のARGB形式が必要です。ColorToARGB(clrRed, 255) のように変換関数を通すのが安全です。
  3. リソース名のプレフィックス:
    ResourceCreate で使うリソース名には、必ず ::(ダブルコロン)を先頭に付けてください(例: ::MyResource)。これを忘れると、EA内部でリソースを正しく参照できません。
  4. CPU負荷:
    OnTick ごとに ResourceCreate を呼び出すのは問題ありませんが、描画サイズが巨大(例: 2000×2000ピクセル以上)になると、計算量が増え、EAの動作速度に影響を与える可能性があります。必要な最小限のサイズで作成しましょう。

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

アルゴリズムトレードの世界において、TextOutを駆使してどれほど完璧なダッシュボードを作り上げたとしても、実行環境が貧弱であればすべてが無意味になります。特に自宅のPCでMT5を稼働させている場合、家庭用インターネット回線の「ネットワーク遅延(レイテンシ)」が致命的なリスクとなります。

FX会社のサーバーから物理的に離れた場所にある自宅PCでは、注文を出してからサーバーに届くまでに数十から数百ミリ秒の遅延が発生します。急激な価格変動時には、この僅かな遅延の間に価格が滑り(スリッページ)、本来得られるはずだった利益が消失、あるいは損失が拡大します。プロレベルの約定スピードと24時間の安定稼働を実現するには、ブローカーのサーバーに近いロケーションに設置された「専用のVPS(仮想専用サーバー)」の導入が必須です。インフラを軽視するエンジニアに、継続的な勝利はありません。

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

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

コメント

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