1. ObjectGetDouble関数の概要と実務での活用法
ObjectGetDoubleは、チャート上に描画された図形オブジェクト(水平線、トレンドライン、フィボナッチなど)から、価格や時間といった「double型(浮動小数点数)」のプロパティ値を取得するための関数です。
実務開発において、この関数は「裁量と自動売買のハイブリッド運用」を実現するために極めて重要です。例えば、トレーダーがチャート上に手動で引いた水平線の価格をEAが自動で読み取り、そのラインをブレイクしたらエントリーする、といったロジックを組む際に必須となります。
実務でのつまずきポイント:
初心者がよく陥るのが、「オブジェクトを表示させた直後に値を取得しようとして失敗する」ケースです。MQL5のチャート操作は非同期で行われることが多いため、描画が完了する前に値を取りに行くとエラーを返すことがあります。また、価格(OBJPROP_PRICE)を取得したいのか、それとも特定の時間(OBJPROP_TIME)をdouble型として取得したいのか、目的のプロパティIDを正確に指定する必要があります。
2. 構文と戻り値
ObjectGetDoubleには2つの書き方(オーバーロード)がありますが、エラーハンドリングを厳密に行う実務では「2番目」の形式が推奨されます。
構文1:直接戻り値を受け取る形式
double ObjectGetDouble(
long chart_id, // チャート識別子(現在のチャートは0)
string object_name, // オブジェクト名
int prop_id, // プロパティID(ENUM_OBJECT_PROPERTY_DOUBLE)
int prop_modifier=0 // プロパティの修飾子(フィボナッチのレベルなど、必要に応じて指定)
);
構文2:成否をboolで受け取る形式(推奨)
bool ObjectGetDouble(
long chart_id, // チャート識別子
string object_name, // オブジェクト名
int prop_id, // プロパティID
int prop_modifier, // プロパティの修飾子
double& double_var // 値を受け取る変数(参照渡し)
);
主なプロパティID(ENUM_OBJECT_PROPERTY_DOUBLE)
OBJPROP_PRICE: オブジェクトの価格座標。OBJPROP_LEVELVALUE: フィボナッチなどのレベル設定値。OBJPROP_ANGLE: 角度(トレンドラインなど)。
3. 具体的な使い方・実践サンプルコード
以下は、チャート上に「TriggerLine」という名前で引かれた水平線の価格を取得し、現在の価格がそのラインを超えたらログに出力する実用的なコード例です。
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
string lineName = "TriggerLine"; // 監視対象のライン名
double linePrice; // 価格を格納する変数
// 1. オブジェクトから価格プロパティを取得(チャートIDは0=カレントチャート)
// 第4引数は修飾子。水平線の場合は通常0
if(ObjectGetDouble(0, lineName, OBJPROP_PRICE, 0, linePrice))
{
// 取得成功:現在の価格と比較
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
if(currentBid > linePrice)
{
Print("【通知】現在の価格がライン(", linePrice, ")を上抜けました。");
// ここに注文処理(OrderSend)などを記述
}
}
else
{
// 取得失敗:オブジェクトが存在しない場合やエラーの処理
// エラーコード4001(ERR_OBJECT_DOES_NOT_EXIST)などを想定
static bool errorLogged = false;
if(!errorLogged)
{
Print("待機中: オブジェクト '", lineName, "' が見つかりません。ラインを引いてください。");
errorLogged = true;
}
}
}
4. 使用上の注意点とよくあるエラー
① プロパティIDの型間違い
最も多いミスは、ObjectGetDoubleで「色(OBJPROP_COLOR)」や「太さ(OBJPROP_WIDTH)」を取得しようとすることです。これらは整数型なので、ObjectGetIntegerを使う必要があります。doubleで取得できるのはあくまで「価格」「角度」「フィボナッチの比率」などです。
② 修飾子(prop_modifier)の指定
フィボナッチ・リトレースメントなどの複数のレベルを持つオブジェクトの場合、単にOBJPROP_LEVELVALUEを指定するだけでは不十分です。どのレベル(0番目、1番目…)の値を取得したいのかを第4引数のprop_modifierで指定する必要があります。
③ オブジェクト名の打ち間違い
MT5(MQL5)はオブジェクト名の大文字・小文字を区別します。手動で引いたラインの名前が「Horizontal Line 123」となっている場合、正確にその名前を指定しなければ、関数はfalseを返し、GetLastError()は4001を返します。
5. 【重要】自動売買における約定スピードと環境の罠
プロのクオンツエンジニアとして断言しますが、アルゴリズムの優位性と同じくらい重要なのが「実行環境の物理的距離」です。自宅のPCでMT5を稼働させ、一般的な光回線で自動売買を行うことは、プロのレーシングカーに市販のタイヤで挑むようなものです。ネットワークの遅延(レイテンシ)は、ObjectGetDoubleでラインを検知してから注文がサーバーに届くまでの間に、価格を滑らせ、本来得られるはずだった利益を削り取ります。
特にボラティリティが高い局面では、数ミリ秒の遅延が致命的なスリッページを招き、バックテスト通りの結果を出すことを不可能にします。極限まで約定スピードを高め、スリッページによる損失を最小化するためには、ブローカーの取引サーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。安定した24時間稼働と超低遅延なネットワーク環境を手に入れることは、システムトレーダーにとって「経費」ではなく、勝つための「先行投資」であることを忘れないでください。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント