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

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

MQL5のObjectGetValueByTime関数は、チャート上に描画されたグラフィカルオブジェクト(トレンドライン、チャネル、フィボナッチなど)の、指定した「時間」における「価格(垂直軸の値)」を取得するための関数です。

実務レベルの開発において、この関数は「裁量とシステムの融合」や「動的な価格計算」において極めて重要な役割を果たします。例えば、以下のような場面で多用されます。

  • トレンドライン・ブレイクの判定: 斜めに引かれたトレンドラインの「現在の足」における価格を取得し、現在のレートがそれを上抜いたか・下抜いたかを判定する。
  • 動的なストップロスの設定: チャネルラインや回帰トレンドの傾斜に合わせて、決済逆指値を毎秒更新する。
  • フィボナッチレベルの数値化: チャート上に引いたフィボナッチ・リトレースメントの各レベルの価格をプログラムで読み取り、エントリー根拠にする。

初心者の方は「ラインに触れたらアラート」という単純な機能を実装する際、価格を固定値で考えがちですが、トレンドラインには「傾き(時間経過による価格の変化)」があります。この傾きを考慮した正確な価格をリアルタイムで算出するために、本関数は必須となります。


2. 構文と戻り値

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

double ObjectGetValueByTime(
   long    chart_id,     // チャート識別子(通常は現在のチャートを示す0)
   string  name,         // オブジェクトの名前
   datetime time,        // 価格を取得したい時間
   int     line_id=0     // ラインのインデックス(チャネルなどの複数線がある場合に使用)
);

パラメーター解説

  1. chart_id: 操作対象のチャートIDです。自身のチャートであれば 0 を指定します。
  2. name: 取得したいオブジェクトの名称です(例: “Trendline 1″)。
  3. time: どの時点の価格を知りたいかを指定します。TimeCurrent() や、特定のバーの時間を指定することが一般的です。
  4. line_id: ほとんどのオブジェクト(トレンドライン等)は 0 で構いません。ボリンジャーバンドの描画オブジェクトや標準偏差チャネルのように、複数の線で構成される場合に 0, 1, 2... と使い分けます。

戻り値

指定した時間における「価格」を double 型で返します。指定した時間にオブジェクトが存在しない場合や、エラーが発生した場合は 0.0 または EMPTY_VALUE を返すため、後述するエラーチェックが不可欠です。


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

以下のサンプルコードは、チャート上に「MyTrendLine」という名前のトレンドラインがあることを前提に、現在の足におけるラインの価格を取得し、価格がラインをクロスした際にログを出力する簡単なEAのロジックです。

void OnTick()
{
    // ターゲットとするオブジェクト名
    string objectName = "MyTrendLine";

    // オブジェクトが存在するか確認
    if(ObjectFind(0, objectName) < 0)
    {
        // 開発時はコメントアウト推奨だが、実行時は確認が必要
        // Print("オブジェクトが見つかりません。");
        return;
    }

    // 現在の最新の足(インデックス0)の開始時間を取得
    datetime currentTime = iTime(_Symbol, _Period, 0);

    // 指定した時間におけるトレンドラインの価格を取得
    double linePrice = ObjectGetValueByTime(0, objectName, currentTime, 0);

    // 現在の価格(Bid)を取得
    double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

    // 取得した価格が有効かチェック(エラー時は0が返ることが多いため)
    if(linePrice > 0)
    {
        // シンプルなブレイク判定の例
        if(currentBid > linePrice)
        {
            Comment("現在の価格はラインの上側にあります。価格: ", linePrice);
        }
        else
        {
            Comment("現在の価格はラインの下側にあります。価格: ", linePrice);
        }
    }
}

このコードを応用すれば、「トレンドラインにタッチした瞬間に成行注文を出す」といった、裁量トレーダーの引いたラインをプログラムが監視するハイブリッドEAが構築可能です。


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

開発時にハマりやすいポイントがいくつかあります。

  1. オブジェクト名の不一致:
    ObjectGetValueByTime は名前を文字列で指定するため、1文字でも違う(全角半角、大文字小文字など)と取得に失敗します。ObjectFind で存在確認を挟むのが定石です。
  2. 未来の時間の指定:
    トレンドラインの「延長(Ray)」が設定されている場合、現在時刻より未来の時間を指定しても値を返しますが、延長設定がない場合はエラーとなるか、意図しない値が返ることがあります。
  3. 時間軸の同期:
    datetime time に渡す値が、チャートの時間軸と合っているか注意してください。例えば、1時間足のチャートで1分足の中途半端な秒数を指定すると、線上の正確な補間値が得られない場合があります。
  4. 戻り値の「0」トラップ:
    関数の失敗時に 0.0 が返るため、価格そのものが 0 に近い銘柄(一部のクロス円や特殊なCFDなど)を取り扱う際は、GetLastError() を併用して「値が0なのはエラーなのか、正常な計算結果なのか」を切り分ける必要があります。

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

アルゴリズムトレードにおいて、ObjectGetValueByTime を使って完璧なロジックを組んだとしても、実行環境が「自宅のPC」であれば、その優位性の多くを失うことになります。FX市場はミリ秒単位の争いであり、自宅の光回線を経由した通信では、ブローカーのサーバーに注文が届くまでに数十から数百ミリ秒の遅延(レイテンシ)が発生するからです。このわずかな遅延が、滑り(スリッページ)を引き起こし、バックテスト通りの利益を削り取ります。

プロのクオンツエンジニアが共通して認識しているのは、「ロジックの最適化と同じくらい、通信経路の最適化が重要である」ということです。極限まで約定スピードを高め、不意のPCシャットダウンやネットワーク瞬断による致命的な損失を回避するには、金融データセンターに近い場所に位置する24時間稼働の専用VPS(仮想専用サーバー)が必須です。安定した高速環境を確保することは、中長期的に見て、高度なアルゴリズムを開発することと同等以上の価値がある投資と言えるでしょう。

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

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

コメント

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