テキスト整列の定数
テキスト整列の定数は、テキストの整列を設定するときに使われます。
主に、ObjectSetInteger関数です。
簡単に関数の説明です。
- ObjectSetInteger関数:オブジェクトの状態を設定する
それぞれ、OBJPROP_ALIGNの設定値として、テキスト整列の定数が使われます。
テキスト整列の定数(ENUM_ALIGN_MODE)
| 定数 | 説明 |
| ALIGN_LEFT | 左揃え |
| ALIGN_CENTER | 中央揃え |
| ALIGN_RIGHT | 右揃え |
テキスト整列の定数の使い方
主に、ObjectSetInteger関数で使用されます。
それぞれ、OBJPROP_ALIGNの設定値として、テキスト整列の定数が使われます。
上記の定数を入力しましょう。
すると、その定数に対応した整列方法になります。
例えば、以下のように使用します。
//ObjectSetInteger関数
//テキストを左揃えに設定
bool objectSetInteger = ObjectSetInteger(ChartID(), "自動売買を作ろう!", OBJPROP_ALIGN, ALIGN_LEFT);
返り値はbool型です。
成功すればture、失敗すればfalseが返ってきます。
実用的なプログラム例
ここからは、テキスト整列の定数を使った実用的なプログラム例を紹介します。
例1:エディットボックスを作成して整列を設定する
OBJ_EDITオブジェクト(テキスト入力欄)を作成し、テキストの整列方法を中央揃えに設定する例です。チャート上に入力欄を表示する場面で活用できます。
//+------------------------------------------------------------------+
//| エディットボックスを作成し、中央揃えに設定するサンプル |
//+------------------------------------------------------------------+
void OnStart()
{
// オブジェクト名を定義
string objName = "MyEditBox";
// 既に同名オブジェクトがあれば削除
if(ObjectFind(0, objName) >= 0)
ObjectDelete(0, objName);
// OBJ_EDIT(テキスト入力欄)をチャート上に作成
// 座標はピクセル指定(左上からX:50, Y:50の位置)
bool created = ObjectCreate(0, objName, OBJ_EDIT, 0, 0, 0);
if(created)
{
// X座標(ピクセル)を設定
ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 50);
// Y座標(ピクセル)を設定
ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 50);
// 幅を200ピクセルに設定
ObjectSetInteger(0, objName, OBJPROP_XSIZE, 200);
// 高さを30ピクセルに設定
ObjectSetInteger(0, objName, OBJPROP_YSIZE, 30);
// フォントサイズを設定
ObjectSetInteger(0, objName, OBJPROP_FONTSIZE, 12);
// ★テキスト整列を中央揃えに設定★
ObjectSetInteger(0, objName, OBJPROP_ALIGN, ALIGN_CENTER);
// テキストの初期値を設定
ObjectSetString(0, objName, OBJPROP_TEXT, "中央揃えテキスト");
// チャートを再描画して反映
ChartRedraw(0);
Print("エディットボックスを中央揃えで作成しました");
}
else
{
Print("オブジェクトの作成に失敗しました");
}
}
例2:3種類の整列方法を比較表示するスクリプト
左揃え・中央揃え・右揃えの3つのエディットボックスを並べて作成し、整列の違いを視覚的に確認できるスクリプトです。
//+------------------------------------------------------------------+
//| 3種類のテキスト整列を比較表示するスクリプト |
//+------------------------------------------------------------------+
void OnStart()
{
// オブジェクト名の配列
string objNames[] = {"Edit_Left", "Edit_Center", "Edit_Right"};
// 対応する整列定数の配列
ENUM_ALIGN_MODE alignModes[] = {ALIGN_LEFT, ALIGN_CENTER, ALIGN_RIGHT};
// 表示テキストの配列
string texts[] = {"左揃え(ALIGN_LEFT)", "中央揃え(ALIGN_CENTER)", "右揃え(ALIGN_RIGHT)"};
// 3つのエディットボックスを縦に並べて作成
for(int i = 0; i < 3; i++)
{
// 既存のオブジェクトがあれば削除
if(ObjectFind(0, objNames[i]) >= 0)
ObjectDelete(0, objNames[i]);
// OBJ_EDITオブジェクトを作成
bool created = ObjectCreate(0, objNames[i], OBJ_EDIT, 0, 0, 0);
if(created)
{
// X座標を設定
ObjectSetInteger(0, objNames[i], OBJPROP_XDISTANCE, 30);
// Y座標を設定(40ピクセルずつ下にずらす)
ObjectSetInteger(0, objNames[i], OBJPROP_YDISTANCE, 30 + i * 40);
// 幅を300ピクセルに設定
ObjectSetInteger(0, objNames[i], OBJPROP_XSIZE, 300);
// 高さを30ピクセルに設定
ObjectSetInteger(0, objNames[i], OBJPROP_YSIZE, 30);
// フォントサイズを設定
ObjectSetInteger(0, objNames[i], OBJPROP_FONTSIZE, 10);
// 背景色を設定(見やすくするため)
ObjectSetInteger(0, objNames[i], OBJPROP_BGCOLOR, clrWhite);
// ★テキスト整列の定数を使って整列方法を設定★
ObjectSetInteger(0, objNames[i], OBJPROP_ALIGN, alignModes[i]);
// テキストを設定
ObjectSetString(0, objNames[i], OBJPROP_TEXT, texts[i]);
}
}
// チャートを再描画
ChartRedraw(0);
Print("3つの整列方法を比較表示しました");
}
例3:口座情報パネルをインジケーターで表示する
チャート上に口座残高・有効証拠金・スプレッドなどの情報を右揃えで見やすく表示するインジケーターの例です。数値を右揃えにすることで、桁を揃えた見やすい表示になります。
//+------------------------------------------------------------------+
//| 口座情報パネルを表示するインジケーター |
//+------------------------------------------------------------------+
#property indicator_chart_window
// パネルに表示する項目数
#define PANEL_ROWS 4
// オブジェクト名のプレフィックス
string prefix = "InfoPanel_";
//+------------------------------------------------------------------+
//| 初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// ラベル(項目名)とエディットボックス(値)を作成
string labels[] = {"残高:", "有効証拠金:", "スプレッド:", "現在時刻:"};
for(int i = 0; i < PANEL_ROWS; i++)
{
// --- 項目名用のラベル(左揃え)を作成 ---
string labelName = prefix + "Label_" + IntegerToString(i);
if(ObjectFind(0, labelName) >= 0) ObjectDelete(0, labelName);
ObjectCreate(0, labelName, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, 20 + i * 28);
ObjectSetInteger(0, labelName, OBJPROP_XSIZE, 120);
ObjectSetInteger(0, labelName, OBJPROP_YSIZE, 24);
ObjectSetInteger(0, labelName, OBJPROP_FONTSIZE, 10);
ObjectSetInteger(0, labelName, OBJPROP_BGCOLOR, clrDarkSlateGray);
ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrWhite);
ObjectSetInteger(0, labelName, OBJPROP_READONLY, true);
// ★項目名は左揃え★
ObjectSetInteger(0, labelName, OBJPROP_ALIGN, ALIGN_LEFT);
ObjectSetString(0, labelName, OBJPROP_TEXT, labels[i]);
// --- 値用のエディットボックス(右揃え)を作成 ---
string valueName = prefix + "Value_" + IntegerToString(i);
if(ObjectFind(0, valueName) >= 0) ObjectDelete(0, valueName);
ObjectCreate(0, valueName, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, valueName, OBJPROP_XDISTANCE, 130);
ObjectSetInteger(0, valueName, OBJPROP_YDISTANCE, 20 + i * 28);
ObjectSetInteger(0, valueName, OBJPROP_XSIZE, 150);
ObjectSetInteger(0, valueName, OBJPROP_YSIZE, 24);
ObjectSetInteger(0, valueName, OBJPROP_FONTSIZE, 10);
ObjectSetInteger(0, valueName, OBJPROP_BGCOLOR, clrBlack);
ObjectSetInteger(0, valueName, OBJPROP_COLOR, clrLime);
ObjectSetInteger(0, valueName, OBJPROP_READONLY, true);
// ★数値は右揃えで桁を揃える★
ObjectSetInteger(0, valueName, OBJPROP_ALIGN, ALIGN_RIGHT);
ObjectSetString(0, valueName, OBJPROP_TEXT, "---");
}
// タイマーを1秒間隔で設定(値の更新用)
EventSetTimer(1);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| タイマーイベントで値を更新 |
//+------------------------------------------------------------------+
void OnTimer()
{
// 各項目の値を更新
ObjectSetString(0, prefix + "Value_0", OBJPROP_TEXT,
DoubleToString(AccountBalance(), 2));
ObjectSetString(0, prefix + "Value_1", OBJPROP_TEXT,
DoubleToString(AccountEquity(), 2));
ObjectSetString(0, prefix + "Value_2", OBJPROP_TEXT,
IntegerToString(MarketInfo(Symbol(), MODE_SPREAD)));
ObjectSetString(0, prefix + "Value_3", OBJPROP_TEXT,
TimeToString(TimeCurrent(), TIME_SECONDS));
// チャートを再描画
ChartRedraw(0);
}
//+------------------------------------------------------------------+
//| 終了処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// タイマーを停止
EventKillTimer();
// 作成したオブジェクトをすべて削除
for(int i = 0; i < PANEL_ROWS; i++)
{
ObjectDelete(0, prefix + "Label_" + IntegerToString(i));
ObjectDelete(0, prefix + "Value_" + IntegerToString(i));
}
}
//+------------------------------------------------------------------+
//| メイン処理(インジケーターとして必要) |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
return(rates_total);
}
例4:EAのトレード状況ダッシュボードを表示する
EA(エキスパートアドバイザー)内でトレード状況をリアルタイムに表示するダッシュボードの例です。項目名を左揃え、数値を右揃えにすることで、情報を見やすく整理しています。
//+------------------------------------------------------------------+
//| EAのトレード状況ダッシュボード |
//+------------------------------------------------------------------+
// ダッシュボードのオブジェクト名プレフィックス
string dashPrefix = "Dash_";
//+------------------------------------------------------------------+
//| ダッシュボード用のエディットボックスを1つ作成する関数 |
//| name : オブジェクト名 |
//| x, y : 表示位置(ピクセル) |
//| width : 横幅(ピクセル) |
//| text : 表示テキスト |
//| align : テキスト整列方法 |
//| bgColor : 背景色 |
//| textColor : 文字色 |
//+------------------------------------------------------------------+
void CreateDashEdit(string name, int x, int y, int width,
string text, ENUM_ALIGN_MODE align,
color bgColor, color textColor)
{
// 既存オブジェクトがあれば削除
if(ObjectFind(0, name) >= 0)
ObjectDelete(0, name);
// OBJ_EDIT(テキスト入力欄)を作成
ObjectCreate(0, name, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, name, OBJPROP_XDISTANCE, x);
ObjectSetInteger(0, name, OBJPROP_YDISTANCE, y);
ObjectSetInteger(0, name, OBJPROP_XSIZE, width);
ObjectSetInteger(0, name, OBJPROP_YSIZE, 22);
ObjectSetInteger(0, name, OBJPROP_FONTSIZE, 9);
ObjectSetInteger(0, name, OBJPROP_BGCOLOR, bgColor);
ObjectSetInteger(0, name, OBJPROP_COLOR, textColor);
// 読み取り専用に設定(ユーザーが編集できないようにする)
ObjectSetInteger(0, name, OBJPROP_READONLY, true);
ObjectSetInteger(0, name, OBJPROP_BORDER_COLOR, clrGray);
// ★テキスト整列の定数を適用★
ObjectSetInteger(0, name, OBJPROP_ALIGN, align);
// テキストを設定
ObjectSetString(0, name, OBJPROP_TEXT, text);
}
//+------------------------------------------------------------------+
//| ダッシュボードを初期化して表示する関数 |
//+------------------------------------------------------------------+
void InitDashboard()
{
int startX = 10; // ダッシュボード左端のX座標
int startY = 15; // ダッシュボード上端のY座標
int rowH = 26; // 行の高さ(ピクセル)
// タイトル行を中央揃えで作成
CreateDashEdit(dashPrefix + "Title", startX, startY, 280,
"== トレード状況 ==", ALIGN_CENTER,
clrNavy, clrWhite);
// 各行の項目名(左揃え)と値(右揃え)を作成
string items[] = {"通貨ペア", "現在価格", "保有ポジション数",
"合計損益", "スプレッド"};
for(int i = 0; i < 5; i++)
{
int y = startY + (i + 1) * rowH;
// 項目名:左揃えで表示
CreateDashEdit(dashPrefix + "L" + IntegerToString(i),
startX, y, 140,
items[i], ALIGN_LEFT,
clrDarkSlateGray, clrWhite);
// 値:右揃えで表示(初期値は「---」)
CreateDashEdit(dashPrefix + "V" + IntegerToString(i),
startX + 140, y, 140,
"---", ALIGN_RIGHT,
clrBlack, clrAqua);
}
}
//+------------------------------------------------------------------+
//| ダッシュボードの値を最新情報に更新する関数 |
//+------------------------------------------------------------------+
void UpdateDashboard()
{
// 保有ポジション数と合計損益を計算
int posCount = 0;
double totalProfit = 0.0;
for(int i = OrdersTotal() - 1; i >= 0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
// 現在の通貨ペアのポジションのみカウント
if(OrderSymbol() == Symbol())
{
posCount++;
totalProfit += OrderProfit() + OrderSwap() + OrderCommission();
}
}
}
// 損益に応じて文字色を変更(プラスは緑、マイナスは赤)
color profitColor = (totalProfit >= 0) ? clrLime : clrRed;
// 各値を更新
ObjectSetString(0, dashPrefix + "V0", OBJPROP_TEXT, Symbol());
ObjectSetString(0, dashPrefix + "V1", OBJPROP_TEXT,
DoubleToString(Bid, (int)MarketInfo(Symbol(), MODE_DIGITS)));
ObjectSetString(0, dashPrefix + "V2", OBJPROP_TEXT,
IntegerToString(posCount) + " 件");
ObjectSetString(0, dashPrefix + "V3", OBJPROP_TEXT,
DoubleToString(totalProfit, 2) + " " + AccountCurrency());
// 損益の文字色を動的に変更
ObjectSetInteger(0, dashPrefix + "V3", OBJPROP_COLOR, profitColor);
ObjectSetString(0, dashPrefix + "V4", OBJPROP_TEXT,
IntegerToString((int)MarketInfo(Symbol(), MODE_SPREAD)) + " pt");
// チャートを再描画して反映
ChartRedraw(0);
}
//+------------------------------------------------------------------+
//| ダッシュボードのオブジェクトをすべて削除する関数 |
//+------------------------------------------------------------------+
void RemoveDashboard()
{
// プレフィックスが一致するオブジェクトをすべて削除
int total = ObjectsTotal(0);
for(int i = total - 1; i >= 0; i--)
{
string name = ObjectName(0, i);
if(StringFind(name, dashPrefix) == 0)
ObjectDelete(0, name);
}
}
例5:ボタンクリックでテキスト整列を切り替えるインジケーター
チャート上にボタンとテキスト表示欄を設置し、ボタンをクリックするたびにテキストの整列方法を左揃え→中央揃え→右揃えの順に切り替えるインジケーターです。OnChartEvent関数を使ったイベント処理の参考にもなります。
//+------------------------------------------------------------------+
//| ボタンクリックでテキスト整列を切り替えるインジケーター |
//+------------------------------------------------------------------+
#property indicator_chart_window
// オブジェクト名の定数
#define BTN_NAME "AlignSwitchBtn" // ボタンのオブジェクト名
#define EDIT_NAME "AlignSwitchEdit" // テキスト表示欄のオブジェクト名
#define INFO_NAME "AlignSwitchInfo" // 現在の整列情報を表示するオブジェクト名
// 現在の整列モードを保持する変数(0=左, 1=中央, 2=右)
int currentAlignIndex = 0;
//+------------------------------------------------------------------+
//| 初期化関数 |
//+------------------------------------------------------------------+
int OnInit()
{
// --- 切り替えボタンを作成 ---
if(ObjectFind(0, BTN_NAME) >= 0)
ObjectDelete(0, BTN_NAME);
ObjectCreate(0, BTN_NAME, OBJ_BUTTON, 0, 0, 0);
ObjectSetInteger(0, BTN_NAME, OBJPROP_XDISTANCE, 30);
ObjectSetInteger(0, BTN_NAME, OBJPROP_YDISTANCE, 30);
ObjectSetInteger(0, BTN_NAME, OBJPROP_XSIZE, 140);
ObjectSetInteger(0, BTN_NAME, OBJPROP_YSIZE, 30);
ObjectSetInteger(0, BTN_NAME, OBJPROP_FONTSIZE, 10);
ObjectSetInteger(0, BTN_NAME, OBJPROP_BGCOLOR, clrSteelBlue);
ObjectSetInteger(0, BTN_NAME, OBJPROP_COLOR, clrWhite);
ObjectSetString(0, BTN_NAME, OBJPROP_TEXT, "整列を切り替え");
// --- テキスト表示欄を作成(初期は左揃え) ---
if(ObjectFind(0, EDIT_NAME) >= 0)
ObjectDelete(0, EDIT_NAME);
ObjectCreate(0, EDIT_NAME, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_XDISTANCE, 30);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_YDISTANCE, 70);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_XSIZE, 300);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_YSIZE, 30);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_FONTSIZE, 11);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_BGCOLOR, clrWhite);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_COLOR, clrBlack);
ObjectSetInteger(0, EDIT_NAME, OBJPROP_READONLY, true);
// ★初期値は左揃え★
ObjectSetInteger(0, EDIT_NAME, OBJPROP_ALIGN, ALIGN_LEFT);
ObjectSetString(0, EDIT_NAME, OBJPROP_TEXT, "サンプルテキスト ABC123");
// --- 現在の整列状態を表示するラベルを作成 ---
if(ObjectFind(0, INFO_NAME) >= 0)
ObjectDelete(0, INFO_NAME);
ObjectCreate(0, INFO_NAME, OBJ_EDIT, 0, 0, 0);
ObjectSetInteger(0, INFO_NAME, OBJPROP_XDISTANCE, 30);
ObjectSetInteger(0, INFO_NAME, OBJPROP_YDISTANCE, 108);
ObjectSetInteger(0, INFO_NAME, OBJPROP_XSIZE, 300);
ObjectSetInteger(0, INFO_NAME, OBJPROP_YSIZE, 24);
ObjectSetInteger(0, INFO_NAME, OBJPROP_FONTSIZE, 9);
ObjectSetInteger(0, INFO_NAME, OBJPROP_BGCOLOR, clrDarkSlateGray);
ObjectSetInteger(0, INFO_NAME, OBJPROP_COLOR, clrYellow);
ObjectSetInteger(0, INFO_NAME, OBJPROP_READONLY, true);
// ★情報ラベルは中央揃え★
ObjectSetInteger(0, INFO_NAME, OBJPROP_ALIGN, ALIGN_CENTER);
ObjectSetString(0, INFO_NAME, OBJPROP_TEXT,
"現在の整列: ALIGN_LEFT(左揃え)");
ChartRedraw(0);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| チャートイベント処理(ボタンクリックを検出) |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
// オブジェクトクリックイベントかどうかを判定
if(id == CHARTEVENT_OBJECT_CLICK)
{
// クリックされたのが切り替えボタンかどうかを確認
if(sparam == BTN_NAME)
{
// 整列インデックスを次に進める(0→1→2→0のループ)
currentAlignIndex = (currentAlignIndex + 1) % 3;
// インデックスに応じた整列定数と表示名を決定
ENUM_ALIGN_MODE newAlign;
string alignText;
switch(currentAlignIndex)
{
case 0:
newAlign = ALIGN_LEFT;
alignText = "ALIGN_LEFT(左揃え)";
break;
case 1:
newAlign = ALIGN_CENTER;
alignText = "ALIGN_CENTER(中央揃え)";
break;
case 2:
newAlign = ALIGN_RIGHT;
alignText = "ALIGN_RIGHT(右揃え)";
break;
default:
newAlign = ALIGN_LEFT;
alignText = "ALIGN_LEFT(左揃え)";
break;
}
// ★テキスト表示欄の整列方法を変更★
ObjectSetInteger(0, EDIT_NAME, OBJPROP_ALIGN, newAlign);
// 情報ラベルに現在の整列方法を表示
ObjectSetString(0, INFO_NAME, OBJPROP_TEXT,
"現在の整列: " + alignText);
// ボタンの押下状態を解除
ObjectSetInteger(0, BTN_NAME, OBJPROP_STATE, false);
// チャートを再描画して反映
ChartRedraw(0);
Print("テキスト整列を変更しました: ", alignText);
}
}
}
//+------------------------------------------------------------------+
//| 終了処理 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 作成したオブジェクトを削除
ObjectDelete(0, BTN_NAME);
ObjectDelete(0, EDIT_NAME);
ObjectDelete(0, INFO_NAME);
}
//+------------------------------------------------------------------+
//| メイン処理(インジケーターとして必要) |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
return(rates_total);
}


