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

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

MQL5のObjectCreate関数は、チャート上に垂直線、水平線、トレンドライン、ラベル、ボタンといった「グラフィカルオブジェクト」を生成するための基本関数です。

実務開発において、この関数は単にチャートを飾るためだけのものではありません。例えば、EA(エキスパートアドバイザー)が計算したエントリーポイントを可視化したり、現在のスプレッドや損益状況をリアルタイムに画面表示したりする「UI/UXの構築」に欠かせない要素です。

しかし、初心者が最初につまずきやすいポイントとして、「オブジェクトを作っただけでは色や太さを変えられない」という点があります。ObjectCreateはあくまで「生成」のみを担当し、その後の詳細設定(プロパティ変更)はObjectSetIntegerObjectSetDoubleといった別の関数と組み合わせて使うのがMQL5の標準的な作法です。

また、オブジェクト名が重複すると新しいオブジェクトが作成されないため、動的にオブジェクトを生成する際は、名前の管理(ユニークなID付与)が非常に重要になります。

2. 構文と戻り値

ObjectCreate関数の基本的な構文は以下の通りです。

bool ObjectCreate(
   long          chart_id,      // チャートID(通常は現在のチャートを示す0)
   string        name,          // オブジェクトの固有名称(一意である必要あり)
   ENUM_OBJECT   type,          // オブジェクトの種類(OBJ_VLINE, OBJ_LABELなど)
   int           sub_window,    // サブウィンドウ番号(メインウィンドウは0)
   datetime      time1,         // 1番目のアンカーポイントの時間
   double        price1,        // 1番目のアンカーポイントの価格
   ...                          // 必要に応じてtime2, price2などが続く
);

戻り値

  • 成功時: true
  • 失敗時: false(失敗した理由は GetLastError() 関数で詳細を確認できます)

注意点

作成するオブジェクトの種類によって、必要な座標(時間と価格)の数が異なります。例えば、水平線(OBJ_HLINE)なら1セットの座標が必要ですが、トレンドライン(OBJ_TREND)なら始点と終点の2セットが必要です。ラベル(OBJ_LABEL)のようにピクセル指定で配置するものは、座標に0を指定して作成後に位置を調整します。

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

以下は、EAを実行した瞬間に現在の価格に「レジスタンスライン(水平線)」を引き、その上に「ALERT」というテキストを表示するサンプルコードです。

//+------------------------------------------------------------------+
//|                                              ObjectCreateDemo.mq5|
//+------------------------------------------------------------------+
void OnStart()
{
    string lineName = "SampleResistanceLine";
    double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_ASK);

    // 1. 水平線オブジェクトの作成
    // 第1引数 0: 現在のチャート
    // 第2引数 lineName: オブジェクト名
    // 第3引数 OBJ_HLINE: 水平線タイプ
    // 第4引数 0: メインウィンドウ
    // 第5引数 0: 時間(水平線は価格のみでOKなため0)
    // 第6引数 currentPrice: 作成する価格
    if(!ObjectCreate(0, lineName, OBJ_HLINE, 0, 0, currentPrice))
    {
        Print("オブジェクト作成失敗。エラーコード: ", GetLastError());
        return;
    }

    // 2. 作成したオブジェクトのプロパティを変更
    // 色を赤に、太さを2に設定
    ObjectSetInteger(0, lineName, OBJPROP_COLOR, clrRed);
    ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 2);

    // 3. わかりやすいようにテキストラベルも追加
    string labelName = "SampleLabel";
    ObjectCreate(0, labelName, OBJ_LABEL, 0, 0, 0); // ラベルは座標0で作成

    // アンカーポイントをチャートの右上に設定
    ObjectSetInteger(0, labelName, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
    ObjectSetInteger(0, labelName, OBJPROP_XDISTANCE, 20);
    ObjectSetInteger(0, labelName, OBJPROP_YDISTANCE, 20);
    ObjectSetString(0, labelName, OBJPROP_TEXT, "Monitoring Price...");
    ObjectSetInteger(0, labelName, OBJPROP_COLOR, clrWhite);

    // チャートを強制再描画して即座に反映
    ChartRedraw();
}

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

  1. オブジェクト名の重複:
    同じ名前のオブジェクトが既に存在する場合、ObjectCreateは失敗します。ループ処理で矢印などを描画する場合は、"Arrow_" + (string)TimeCurrent() のように名前を動的に生成するか、事前に ObjectDelete で古いものを消去してください。

  2. チャート再描画の忘れ:
    オブジェクトを作成・変更しただけでは、画面に即座に反映されないことがあります。確実に表示させるには、処理の最後に ChartRedraw() を呼び出すのが鉄則です。

  3. 座標系の勘違い:
    OBJ_LABEL(ラベル)や OBJ_BUTTON(ボタン)は、時間・価格ではなく「画面上のピクセル位置」で配置します。この時、ObjectCreateの引数である timeprice に値を入れても無視されるため、作成後に OBJPROP_XDISTANCE 等で位置を指定する必要があります。

  4. 削除処理の実装:
    EAを停止(OnDeinit)した際に、作成したオブジェクトがチャートに残ってしまうのは不作法です。ObjectsDeleteAllObjectDelete を使って、終了時にクリーンアップする習慣をつけましょう。

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

アルゴリズムトレードにおいて、ObjectCreateで視覚的な分析を極めること以上に重要なのが「実行環境」です。多くの開発者が自宅のPCでEAを稼働させようとしますが、これはプロの視点から見ると非常にリスクが高い行為です。

一般家庭のインターネット回線は、FX業者のサーバーがあるデータセンターとの物理的距離やネットワーク経路の影響で、数十〜数百ミリ秒の遅延(レイテンシ)が発生します。このわずかな遅延が、相場急変時のスリッページを引き起こし、バックテストでは勝てていたロジックを「負けトレード」へと変えてしまいます。約定スピードを極限まで高め、24時間365日安定した取引を維持するには、ブローカーのサーバーに物理的に近い場所に設置された「専用VPS」の活用が不可欠です。ネットワーク遅延による致命的な損失を回避することこそが、クオンツエンジニアが最初に行うべきリスク管理と言えるでしょう。

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

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

コメント

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