1. TextSetFont関数の概要と実務での活用法
MQL5のTextSetFont関数は、チャート上に高度なグラフィック描画を行う際に、「これから描画するテキストの書体(フォント)、サイズ、スタイル」を指定するための関数です。
実務レベルの開発において、標準の「ラベル(OBJ_LABEL)」や「エディット(OBJ_EDIT)」オブジェクトだけでGUIを構築すると、オブジェクト数が増えすぎて描画処理が重くなったり、細かいレイアウト調整が難しくなったりします。そこで、プロのクオンツは「Canvas(キャンバス)」という手法を使い、一つのビットマップ画像の中に文字や図形を直接書き込みます。
TextSetFontはこのCanvas描画において、テキストの見た目を決定づける非常に重要な役割を担います。特につまずきやすいポイントとして、「この関数を呼び出しただけではチャート上の文字は変わらない」という点があります。この関数はあくまで「次に描くためのペンの種類を選ぶ」ものであり、その後にTextOut関数などと組み合わせて初めて画面に反映されることを理解しておきましょう。
2. 構文と戻り値
TextSetFont関数の基本的な定義は以下の通りです。
bool TextSetFont(
const string name, // フォント名またはフォントファイルへのパス
int size, // フォントサイズ(負の値を指定すると、ピクセル単位での高さを指定可能)
uint flags, // スタイル指定フラグ(太字、斜体、アンチエイリアスなど)
int orientation=0 // テキストの傾き(0.1度単位)
);
パラメーター解説
- name: “Arial”や”Meiryo”などのフォント名を指定します。
- size: 通常はフォントサイズを指定します。
-120のように負の値を指定すると、12.0ピクセルといった精密なサイズ指定が可能です。 - flags:
FONT_ITALIC(斜体)、FONT_BOLD(太字)、FONT_UNDERLINE(下線)などの定数を論理和(|)で組み合わせて指定します。滑らかな文字を描画するにはFW_EXTRADARK(アンチエイリアス関連)などの指定も重要です。 - orientation: 文字を回転させたい場合に指定します。例えば、
900を指定すると90度回転します。
戻り値
- 成功した場合は
true、失敗した場合はfalseを返します。
3. 具体的な使い方・実践サンプルコード
以下は、TextSetFontを使用して、チャート上にカスタムフォントで現在のスプレッド情報を描画する実践的なサンプルです。
//+------------------------------------------------------------------+
//| TextSetFontDemo.mq5 |
//+------------------------------------------------------------------+
#property strict
// 描画用の設定
string canvasName = "::SpreadDisplay";
uint canvasBuffer[]; // 画像データを格納する配列
void OnTick()
{
int width = 200;
int height = 50;
ArrayResize(canvasBuffer, width * height);
ArrayFill(canvasBuffer, 0, width * height, 0); // 背景を透明にリセット
// 1. フォントの設定(メイリオ、サイズ20、太字、アンチエイリアス有効)
if(!TextSetFont("Meiryo", -200, FONT_BOLD))
{
Print("フォントの設定に失敗しました。エラーコード: ", GetLastError());
return;
}
// 2. 描画するテキストの準備
double spread = SymbolInfoDouble(_Symbol, SYMBOL_ASK) - SymbolInfoDouble(_Symbol, SYMBOL_BID);
string text = StringFormat("Spread: %.1f pips", spread / _Point / 10);
// 3. テキストを配列(キャンバス)に書き込む
// 引数: 書き込む文字列、x座標、y座標、配置、色、背景色
if(!TextOut(text, 10, 10, TA_LEFT|TA_TOP, canvasBuffer, width, height, ColorToARGB(clrCyan), COLOR_FORMAT_ARGB_NORMALIZE))
{
Print("テキストの描画に失敗しました。");
return;
}
// 4. 動的にリソースを作成してチャートに表示
ResourceCreate(canvasName, canvasBuffer, width, height, 0, 0, width, COLOR_FORMAT_ARGB_NORMALIZE);
// チャート上に表示用オブジェクトがなければ作成
if(ObjectFind(0, "SpreadObj") < 0)
{
ObjectCreate(0, "SpreadObj", OBJ_BITMAP_LABEL, 0, 0, 0);
ObjectSetString(0, "SpreadObj", OBJPROP_BMPFILE, canvasName);
ObjectSetInteger(0, "SpreadObj", OBJPROP_XDISTANCE, 50);
ObjectSetInteger(0, "SpreadObj", OBJPROP_YDISTANCE, 50);
}
ChartRedraw();
}
void OnDeinit(const int reason)
{
ObjectDelete(0, "SpreadObj");
ResourceFree(canvasName);
}
4. 使用上の注意点とよくあるエラー
① ObjectSetStringとの混同
初心者が最もやりがちなミスは、OBJ_LABELなどのオブジェクトのフォントを変えようとしてTextSetFontを使ってしまうことです。オブジェクトのフォント変更には ObjectSetString(chart_id, name, OBJPROP_FONT, "FontName") を使用します。TextSetFontはあくまでメモリ内での描画(TextOut等)専用です。
② フォント名の綴りミス
フォント名は文字列で指定するため、”MS Gothic” を “MS Gotic” と書くなどのスペルミスがあるとデフォルトのフォントに差し替わります。必ずPCにインストールされている正確な名前を使用してください。
③ リソース消費
TextSetFont自体は軽量ですが、これを頻繁に呼び出し、かつ大きなビットマップをResourceCreateで更新し続けるとCPU負荷が上がります。ティックごとにフォント設定を変える必要がない場合は、OnInitなどで一度だけ設定する工夫も検討しましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、TextSetFontを使ってどれだけ美しく情報効率の良いダッシュボードを作ったとしても、実行環境が貧弱であればすべてが無意味になります。特に自宅のPCから一般的なインターネット回線を通じて自動売買を行うことは、プロの視点から見ると非常に高いリスクを伴います。
FX市場はミリ秒単位の争いです。自宅PCの場合、プロバイダーの混雑や物理的な距離による「ネットワーク遅延(レイテンシ)」が避けられず、プログラムが売買判断を下してから証券会社のサーバーに注文が届くまでに致命的なタイムラグが発生します。この遅延はスリッページを引き起こし、本来得られるはずだった利益を削り取るだけでなく、相場急変時には想定外の損失を生む原因となります。極限まで約定スピードを高め、安定した利益を追求するには、証券会社のサーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間365日の安定稼働と、一瞬のチャンスを逃さない低遅延環境を整えることこそが、勝てるエンジニアへの第一歩となります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント