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

1. ObjectGetInteger関数の概要と実務での活用法

ObjectGetIntegerは、チャート上に配置されたオブジェクト(水平線、トレンドライン、ボタン、ラベルなど)から、整数型のプロパティ値を取得するための関数です。

MQL5において、オブジェクトの属性は多岐にわたりますが、実は「色(color)」「時間(datetime)」「論理値(bool)」「サイズ(int)」などはすべて内部的に整数として扱われます。そのため、この関数ひとつで「ボタンが押されているか?」「ラインの色は何色か?」「オブジェクトがいつ作成されたか?」といった情報を自在に取得できます。

実務での活用シーン:
* ライントレードの自動化: 手動で引いた水平線の価格や色を検知し、特定の色のラインにタッチしたらエントリーする。
* GUI(操作パネル)の構築: チャート上の「自動売買ON/OFFボタン」の状態を取得し、プログラムの動作を制御する。
* 描画の不具合防止: オブジェクトが既に存在するか、または非表示になっていないかを確認してから処理を行う。

初心者が特につまずきやすいのは、価格(double型)を取得しようとしてこの関数を使い、エラーになるパターンです。価格情報を取る場合はObjectGetDoubleを使う必要があります。型に応じた適切な関数の使い分けが、バグのないEA開発の第一歩です。


2. 構文と戻り値

ObjectGetIntegerには、用途に合わせて2つの書き方(オーバーロード)があります。

形式1:値を直接戻り値として受け取る

主に「単純な値の取得」に使用します。

long ObjectGetInteger(
   long                          chart_id,    // チャートID(0は現在のチャート)
   string                        name,        // オブジェクトの名前
   ENUM_OBJECT_PROPERTY_INTEGER  prop_id,     // 取得したいプロパティの種類
   int                           modifier=0   // プロパティの修飾子(通常は0)
);

形式2:成否をbool値で受け取り、値は参照渡しで受け取る

プロパティの取得に成功したかどうかを厳密にチェックしたい実務向けの書き方です。

bool ObjectGetInteger(
   long                          chart_id,    // チャートID
   string                        name,        // オブジェクトの名前
   ENUM_OBJECT_PROPERTY_INTEGER  prop_id,     // プロパティの種類
   int                           modifier,    // プロパティの修飾子
   long&                         long_var     // 値を格納する変数(参照渡し)
);

主な戻り値:
– 形式1の場合:プロパティの値(long型)。失敗した場合は0。
– 形式2の場合:成功すれば true、失敗すれば false


3. 具体的な使い方・実践サンプルコード

以下のサンプルは、チャート上に「Manual_Trade_Btn」という名前のボタンがある場合、そのボタンが現在「クリックされて凹んでいる状態(ON)」か「戻っている状態(OFF)」かを判別するコードです。

void OnTick()
{
    string objName = "Manual_Trade_Btn";

    // 1. オブジェクトが存在するか確認
    if(ObjectFind(0, objName) < 0)
    {
        // オブジェクトが見つからない場合は処理を抜ける
        return;
    }

    // 2. ボタンの状態(押されているかどうか)を取得
    // OBJPROP_STATEはbool値(0 or 1)だが、long型として取得される
    long isPressed = ObjectGetInteger(0, objName, OBJPROP_STATE);

    // 3. 取得した値に基づいて処理を分岐
    if(isPressed == 1)
    {
        Print("ボタンは押されています。エントリーを許可します。");
        // ここにエントリーロジックなどを記述
    }
    else
    {
        // Print("ボタンは押されていません。待機中...");
    }

    // 【応用】作成時間を取得する例
    datetime createTime = (datetime)ObjectGetInteger(0, objName, OBJPROP_CREATETIME);
    // Print("オブジェクト作成時刻: ", TimeToString(createTime));
}

4. 使用上の注意点とよくあるエラー

開発中に遭遇しやすいトラブルとその回避策をまとめました。

  1. 型の混同に注意
    冒頭でも触れましたが、ObjectGetIntegerで取得できるのはあくまで「整数」です。

    • 取得OK:色、時間、Zオーダー、ボタンの状態、線の太さ
    • 取得NG:価格(ObjectGetDoubleを使用)、名前や説明(ObjectGetStringを使用)
  2. オブジェクトの存在確認をセットで行う
    オブジェクトが削除されている状態でこの関数を呼び出すと、エラーになります。ObjectFind()関数を使って存在をチェックするか、形式2の戻り値(bool)を使って成功・失敗を判定するロジックを組み込むのがプロの書き方です。

  3. チャートIDの指定
    現在のチャートを操作する場合は 0 を指定します。別のチャートにあるオブジェクトを操作する場合は、正しいチャートIDを取得して渡す必要があります。

  4. 取得後の型キャスト
    ObjectGetIntegerの戻り値は常に long 型です。これを datetimecolor 型として変数に代入する際は、(datetime) のように明示的にキャスト(型変換)すると、コードの可読性が高まり、コンパイル警告を避けることができます。


5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、ロジックの正確さと同じくらい、あるいはそれ以上に重要なのが「実行環境(インフラ)」です。多くの開発者が自宅のPCや一般的な光回線でEAを稼働させようとしますが、これはプロの視点から見ると非常にリスクが高い行為です。

FXの相場はミリ秒単位で変動しています。自宅PCからの注文は、家庭用ルーターやプロバイダーを経由するため、数ミリ秒から数百ミリ秒の「ネットワーク遅延(レイテンシ)」が不可避です。このわずかな遅延が、スリッページ(注文価格と約定価格のズレ)を引き起こし、本来得られるはずだった利益を削り取ります。さらに、自宅PCはOSの更新による再起動や停電、ネット切断などの物理的リスクに常にさらされています。

プロのクオンツエンジニアが極限まで約定スピードを高めるために選ぶのは、取引サーバーに物理的に近いデータセンター内に設置された専用のVPS(仮想専用サーバー)です。24時間365日安定して稼働し、超低遅延で注文をブローカーへ届ける環境を手に入れることは、システム開発における必要経費であり、勝率を安定させるための「最強の装備」と言えます。本気で収益を追求するのであれば、インフラへの投資を惜しんではいけません。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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