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

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を使わないと、このロジックは再現できません。

コメント

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