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

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

MQL5におけるObjectSetDoubleは、チャート上に生成したオブジェクト(水平線、トレンドライン、ラベル、ボタンなど)の「浮動小数点数(double型)」のプロパティを変更するための関数です。

実務レベルの開発では、主に以下のようなシーンで多用されます。
* 水平線(Horizontal Line)の価格設定
* トレンドラインの開始・終了価格の動的変更
* フィボナッチ・リトレースメントのレベル設定

実務でつまずきやすいポイント:
初心者の多くは「オブジェクトのすべての設定はこの関数で行う」と勘違いしがちですが、MQL5には型ごとにObjectSetInteger(色、太さ、ブール値用)やObjectSetString(テキスト用)が用意されています。「価格(Price)」や「角度」などの小数を含む値だけがObjectSetDoubleの担当であるという切り分けを正確に理解することが、バグの少ないコードへの第一歩です。


2. 構文と戻り値

ObjectSetDoubleには、操作対象のチャートを指定するかどうかで2つのオーバーロードが存在しますが、一般的には以下の形式が使われます。

bool ObjectSetDouble(
   long     chart_id,          // チャート識別子(現在のチャートは0)
   string   name,              // オブジェクト名
   int      prop_id,           // プロパティ識別子(ENUM_OBJECT_PROPERTY_DOUBLE)
   double   prop_value         // 設定する値
);

パラメーター

  1. chart_id: 操作したいチャートのIDです。通常は 0(現在のチャート)を指定します。
  2. name: 作成済みのオブジェクトの名前(文字列)を指定します。
  3. prop_id: 変更したい項目のIDです。よく使うのは OBJPROP_PRICE(価格)です。インデックスが必要な場合(トレンドラインの2点目など)は、修飾子を使用します。
  4. prop_value: 設定したい数値を代入します。

戻り値

  • 成功した場合は true、失敗した場合は false を返します。
  • 失敗の理由は GetLastError() 関数で詳細を確認できます。

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

以下は、EA(エキスパートアドバイザー)がティックごとに直近の最高値を更新し、その位置に水平線を動的に移動させる実戦的なコード例です。

//+------------------------------------------------------------------+
//| ティックごとに高値を更新して水平線を移動させるサンプルコード             |
//+------------------------------------------------------------------+
void OnTick()
{
    string lineName = "MaxPriceLine";
    double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

    // 1. オブジェクトが存在するか確認(なければ作成)
    if(ObjectFind(0, lineName) < 0)
    {
        ObjectCreate(0, lineName, OBJ_HLINE, 0, 0, currentBid);
        // 色や太さはObjectSetIntegerを使用する
        ObjectSetInteger(0, lineName, OBJPROP_COLOR, clrDodgerBlue);
        ObjectSetInteger(0, lineName, OBJPROP_WIDTH, 2);
    }

    // 2. ObjectSetDoubleを使用して、価格(OBJPROP_PRICE)を更新
    // 例:現在のBid価格がラインの価格より高ければ、ラインを移動させる
    double linePrice = ObjectGetDouble(0, lineName, OBJPROP_PRICE);

    if(currentBid > linePrice)
    {
        // 戻り値を確認することで、設定ミスを早期に発見できる
        if(!ObjectSetDouble(0, lineName, OBJPROP_PRICE, currentBid))
        {
            Print("価格の設定に失敗しました。エラーコード:", GetLastError());
        }
        else
        {
            // 設定反映のためにチャートを再描画(重要)
            ChartRedraw(0);
        }
    }
}

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

① 型の混同によるサイレントエラー

最も多いミスは、色(CLR)や線のスタイルをObjectSetDoubleで設定しようとすることです。これらは内部的に整数(int)として扱われるため、ObjectSetIntegerを使う必要があります。エラーは出なくても「なぜか値が反映されない」という状況に陥ります。

② ChartRedraw() の呼び出し忘れ

ObjectSetDoubleで値を書き換えただけでは、画面上の見た目が即座に変わらないことがあります。特にEAで高速に描画を更新したい場合は、関数の実行後に ChartRedraw(0); を呼び出す癖をつけましょう。

③ オブジェクト名の指定ミス

ObjectCreateで作った名前と、ObjectSetDoubleで指定した名前が1文字でも違うと(大文字小文字の区別など)、関数は false を返します。マジックナンバーやシンボル名を含めた一意な名前管理を徹底してください。


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

クオンツエンジニアとして断言しますが、どれほど優れたアルゴリズムを組み上げたとしても、実行環境が「自宅のPC」である限り、プロの土俵で勝ち続けることは不可能です。FX市場はミリ秒単位の争いであり、自宅の一般的なインターネット回線では、証券会社のサーバーに注文が届くまでに致命的なレイテンシ(遅延)が発生します。この数ミリ秒の遅れが、スリッページを引き起こし、バックテストでは利益が出ていたロジックを「負けトレード」へと変えてしまいます。

特にMQL5で高度なオブジェクト操作や複雑な計算を行うEAを運用する場合、PCのCPU負荷やネットワークの不安定さは、注文の執行遅延だけでなく、メタトレーダー自体のフリーズを招くリスクもあります。安定した約定スピードを極限まで追求するなら、証券会社のサーバーに近いデータセンターに設置された「専用VPS」の導入は必須条件です。24時間365日の安定稼働と低遅延なネットワーク環境を手に入れて、初めてあなたのアルゴリズムは本来のポテンシャルを発揮できるのです。

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

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

コメント

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