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

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

ObjectSetIntegerは、チャート上に作成した図形やボタン、ラベルなどの「オブジェクト」に対して、整数型のプロパティ(属性)を設定・変更するための関数です。

MQL5での実務開発において、この関数は単に「色を変える」だけではなく、「動的なユーザーインターフェース(GUI)の構築」「視覚的なトレード補助ツールの作成」に欠かせません。例えば、ボタンのオンオフ状態の管理、描画したラインの太さ変更、あるいは特定の条件を満たしたときにオブジェクトを表示・非表示にするといった操作を担います。

実務でつまずきやすいポイント:
初心者の多くは、価格(double型)やテキスト(string型)を設定しようとしてこの関数を使い、エラーに直面します。また、設定したはずなのにチャートに反映されないというトラブルも頻発しますが、これは「チャートの再描画」という概念が抜けていることが主な原因です。


2. 構文と戻り値

ObjectSetIntegerには、設定する項目の種類(プロパティ修飾子の有無)によって2つの書き方があります。

基本の構文

bool ObjectSetInteger(
   long    chart_id,    // チャート識別子(0は現在のチャート)
   string  name,        // オブジェクトの名前
   int     prop_id,     // プロパティID(ENUM_OBJECT_PROPERTY_INTEGER)
   long    prop_value   // 設定する値(整数値、色、ブール値など)
);

インデックス指定がある場合の構文(フィボナッチのレベル設定など)

bool ObjectSetInteger(
   long    chart_id,    // チャート識別子
   string  name,        // オブジェクトの名前
   int     prop_id,     // プロパティID
   int     prop_modifier, // プロパティ修飾子(インデックス)
   long    prop_value   // 設定する値
);

戻り値

  • true: 設定成功
  • false: 設定失敗(GetLastError()関数で詳細なエラーコードを確認できます)

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

以下のコードは、チャート上に「トレード許可ボタン」を作成し、クリックするたびにボタンの色とテキストの状態(内部的な属性)を変化させる実用的な例です。

//+------------------------------------------------------------------+
//| ボタンオブジェクトを生成し、ObjectSetIntegerで属性を操作する例          |
//+------------------------------------------------------------------+
void CreateCustomButton()
{
   string objName = "TradeStateButton";

   // 1. ボタンオブジェクトの作成
   if(ObjectCreate(0, objName, OBJ_BUTTON, 0, 0, 0))
   {
      // 2. ObjectSetIntegerを使用して整数型の属性を設定

      // ボタンのX座標、Y座標、サイズの設定
      ObjectSetInteger(0, objName, OBJPROP_XDISTANCE, 100);
      ObjectSetInteger(0, objName, OBJPROP_YDISTANCE, 50);
      ObjectSetInteger(0, objName, OBJPROP_XSIZE, 120);
      ObjectSetInteger(0, objName, OBJPROP_YSIZE, 40);

      // コーナー(表示位置)を右上に設定
      ObjectSetInteger(0, objName, OBJPROP_CORNER, CORNER_RIGHT_UPPER);

      // ボタンの色を設定(color型も内部的には整数)
      ObjectSetInteger(0, objName, OBJPROP_BGCOLOR, clrDodgerBlue);
      ObjectSetInteger(0, objName, OBJPROP_COLOR, clrWhite);

      // 選択不可(ユーザーが手動で動かせないよう固定)にする
      ObjectSetInteger(0, objName, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, objName, OBJPROP_SELECTED, false);

      // 3. 設定を反映させるためにチャートを再描画
      ChartRedraw(0);
   }
}

// ボタンの状態(押し込まれているかどうか)を判定して色を変える処理
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam)
{
   if(id == CHARTEVENT_OBJECT_CLICK && sparam == "TradeStateButton")
   {
      // ボタンが現在「押し込まれているか」を取得
      bool isPressed = (bool)ObjectGetInteger(0, "TradeStateButton", OBJPROP_STATE);

      if(isPressed)
      {
         // 押し込まれた状態なら赤色にする
         ObjectSetInteger(0, "TradeStateButton", OBJPROP_BGCOLOR, clrCrimson);
      }
      else
      {
         // 通常状態なら青色にする
         ObjectSetInteger(0, "TradeStateButton", OBJPROP_BGCOLOR, clrDodgerBlue);
      }

      ChartRedraw(0);
   }
}

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

① 価格の設定には使えない

最も多いミスが、OBJPROP_PRICE(価格座標)をObjectSetIntegerで設定しようとすることです。価格は小数点を含むデータ(double型)であるため、必ずObjectSetDoubleを使用してください。

② ChartRedraw() の呼び出し忘れ

ObjectSetIntegerでプロパティを変更しても、チャートは即座に更新されません。ループ処理などで大量に属性を変更した後に一度、ChartRedraw(0);を呼び出すことで、初めて画面上の見た目に反映されます。これを忘れると「コードは正しいのに動かない」という錯覚に陥ります。

③ 型のキャスト

色(color)や列挙型(ENUM_…)を渡す際、MQL5は型に厳格です。基本的にはそのまま渡せますが、変数に格納して渡す場合は、ObjectSetIntegerが期待するlong型への暗黙の変換が行われていることを意識しましょう。


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

アルゴリズムトレードにおいて、ObjectSetIntegerを駆使した洗練されたGUIを作ることは重要ですが、それはあくまで「フロントエンド」の話に過ぎません。自動売買の本質である「利益の確保」において、最も致命的な罠となるのがネットワーク遅延(レイテンシ)です。

自宅のPC環境でEAを稼働させる場合、プロバイダー経由の不安定な通信やPCのOSアップデートによる負荷、物理的な距離による数ミリ秒の遅延が、注文時の「スリッページ」を引き起こします。コンマ数秒の遅延が1ピップスの差を生み、それが積もり積もってバックテスト通りの利益を食いつぶすのです。FXトレードにおける約定スピードを極限まで高め、理想的なトレード環境を維持するには、証券会社のサーバーに物理的に近いデータセンターで稼働する「専用VPS」の活用がエンジニアにとっての必須要件となります。

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

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

コメント

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