MQL5でポジションの種類を確認しようとして、
Print("種類=", PositionGetInteger(POSITION_TYPE));
と書くと、ログには「種類=0」のような、意味の分からない数値しか表示されません。
`POSITION_TYPE_BUY`は実体としてはただの整数(0や1)なので、
`Print()`にそのまま渡しても、読める文字列には変換されないためです。
MQL4であれば、この数値を人が読める文字列に変換するために、
`if`や`switch`で対応表を自分で書く必要がありました。
MQL5には、この変換を1行でやってくれる、
`EnumToString()`という関数が用意されています。
EnumToStringの書式
string EnumToString(enum_value);
引数にenum型の値を渡すと、その値が宣言されたときの識別子名(定数名)を、
そのまま文字列として返します。
Print("種類=", EnumToString((ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE)));
//出力例: 種類=POSITION_TYPE_BUY
`PositionGetInteger()`の戻り値の型は`long`のため、
`EnumToString()`に渡す前に、
対象のenum型へ明示的にキャストする必要がある点に注意してください。
キャストを省略すると、コンパイルエラーになります。
組み込みenumでの実例: ポジション種別・注文種別・時間足
`EnumToString()`は、MQL5が標準で持つenum型にも、
自分で定義したenum型にも、同じ書き方で使えます。
//ポジションの種類
ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
Print("ポジション種別: ", EnumToString(posType));
//注文の種類
ENUM_ORDER_TYPE orderType = ORDER_TYPE_BUY_LIMIT;
Print("注文種別: ", EnumToString(orderType));
//時間足
ENUM_TIMEFRAMES tf = PERIOD_H4;
Print("時間足: ", EnumToString(tf));
PositionSelect/PositionGetIntegerの記事で解説した、
ポジションの状態確認コードに`EnumToString()`を組み込むと、
「今どのポジションを処理しているか」がログ上で一目で分かるようになり、
デバッグの効率が大きく上がります。
実務的な落とし穴: 返ってくるのは『識別子名』であって『日本語表示』ではない
`EnumToString()`が返すのは、
ソースコード上でその定数が宣言されたときの識別子名そのものです。
つまり`POSITION_TYPE_BUY`は常に、
`”POSITION_TYPE_BUY”`という文字列で返り、
「買い」のような読者向けの日本語には変換されません。
この性質は、開発者向けのログ出力(Print/デバッグ)には最適ですが、
チャート上のコメントやアラートのように、
エンドユーザーが直接読む画面にそのまま出すと不親切な表示になります。
エンドユーザー向けの表示が必要な場合は、
`EnumToString()`の結果を使わず、
従来どおり自分で対応表(switch文等)を用意する使い分けが必要です。
ユーザー定義enumでも同じ挙動になるため、
自作の状態管理enumをログ出力する用途では、
迷わず`EnumToString()`を使ってください。
enum ENUM_TRADE_STATE
{
STATE_WAITING,//エントリー待ち
STATE_IN_POSITION,//ポジション保有中
STATE_COOLDOWN//クールダウン中
};
ENUM_TRADE_STATE currentState = STATE_IN_POSITION;
Print("現在の状態: ", EnumToString(currentState));
//出力例: 現在の状態: STATE_IN_POSITION
実際に動くコード全体
保有ポジションと直近の注文種別を、
それぞれ`EnumToString()`でログに出力する、
実際にMetaEditorでコンパイルできるスクリプトです。
//+------------------------------------------------------------------+
//| EnumToStringDemo.mq5 |
//| Copyright 2026, FX-EA System Project Creator |
//| https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link "https://creator.fx-ea-system-project.com/"
#property version "1.00"
#property script_show_inputs
//+------------------------------------------------------------------+
//| 保有中の全ポジションの種類をログに出力する |
//+------------------------------------------------------------------+
void PrintAllPositionTypes()
{
int total = PositionsTotal();
if(total == 0)
{
Print("保有中のポジションはありません。");
return;
}
for(int i = 0; i < total; i++)
{
ulong ticket = PositionGetTicket(i);
if(ticket == 0) continue;
ENUM_POSITION_TYPE posType = (ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);
string symbol = PositionGetString(POSITION_SYMBOL);
PrintFormat("チケット=%d 銘柄=%s 種別=%s",
ticket, symbol, EnumToString(posType));
}
}
//+------------------------------------------------------------------+
//| 代表的なENUM_ORDER_TYPEを一覧でログに出力する(挙動確認用) |
//+------------------------------------------------------------------+
void PrintOrderTypeSamples()
{
ENUM_ORDER_TYPE types[] =
{
ORDER_TYPE_BUY,
ORDER_TYPE_SELL,
ORDER_TYPE_BUY_LIMIT,
ORDER_TYPE_SELL_LIMIT,
ORDER_TYPE_BUY_STOP,
ORDER_TYPE_SELL_STOP
};
for(int i = 0; i < ArraySize(types); i++)
PrintFormat("[%d] %s", i, EnumToString(types[i]));
}
//+------------------------------------------------------------------+
//| Script program start function |
//+------------------------------------------------------------------+
void OnStart()
{
PrintAllPositionTypes();
PrintOrderTypeSamples();
}
//+------------------------------------------------------------------+
MetaEditorで実際に動かす手順
- MetaTrader 5の「ツール」→「MetaQuotes Language Editor」でMetaEditorを開く
- 「ファイル」→「新規作成」→「スクリプト」を選び、名前を「EnumToStringDemo」にして作成する(中身は空のテンプレートで構いません)
- テンプレートの中身を全て削除し、上のコードを丸ごと貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートへドラッグ&ドロップし、「エキスパート」タブに保有ポジションの種別と、注文種別の一覧が読める文字列で表示されることを確認する
コピペしてコンパイルが通らない・想定と違う結果になるときに確認すること
- `’EnumToString’ – no one of the overloads can be applied to the function call`のようなエラーが出る: `PositionGetInteger()`等が返す`long`型を、対象のenum型へキャストせずに渡していないか確認する
- 期待した文字列と違う値が返る: enumの宣言側で値の並び順や明示的な数値指定を変更していないか確認する。`EnumToString()`は値そのものではなく、その値に対応する識別子名を返すため、宣言と実際の値がずれていると誤った定数名が表示される
- 画面表示(Comment/Alert)にそのまま使ったら英語の定数名がそのまま出た: 前述のとおりこれは仕様であり、エンドユーザー向け表示には別途switch文等で日本語の対応表を用意する
- ユーザー定義enumで動かない: enum自体の宣言(`enum ENUM_XXX { … };`)がスクリプト内で正しく完結しているか確認する
まとめ
MQL5でenumの値をそのまま`Print()`に渡すと、
意味の分からない数値しか表示されず、デバッグの手間が増えます。
`EnumToString()`を使えば、組み込みenumでもユーザー定義enumでも、
宣言時の識別子名をそのまま文字列として取得でき、
ログ出力が一気に読みやすくなります。
ただし返ってくるのはあくまで識別子名であり、
エンドユーザー向けの日本語表示には使えない点だけ覚えておいてください。
コメント