1. ObjectMove関数の概要と実務での活用法
MQL5のObjectMove関数は、チャート上に描画された既存のグラフィカルオブジェクト(ライン、ラベル、図形など)の「時間」と「価格」の座標を変更するための関数です。
実務レベルの開発において、この関数は非常に重要です。例えば、価格に追従する「トレイリングストップのライン」や、ボラティリティに合わせて動く「エントリー基準線」などを表示させる際、一度作成したオブジェクトを削除して作り直す(ObjectDelete → ObjectCreate)のは非効率です。
なぜObjectMoveを使うのか?
1. 描画負荷の軽減: オブジェクトの生成と削除を繰り返すと、特に多くのインジケーターやEAを稼働させている環境ではターミナルの動作が重くなります。
2. チラつきの防止: 作り直しを行うと一瞬オブジェクトが消えるため、画面がチラつきます。ObjectMoveならスムーズな移動が可能です。
3. 管理の簡略化: 名前を変えずに位置だけを更新し続けることで、コードがシンプルになります。
初心者がつまずきやすいポイントは、「どのアンカーポイントを動かしているか」の指定(ポイントインデックス)です。トレンドラインのように複数の点を持つオブジェクトを扱う際に、ここを正しく理解する必要があります。
2. 構文と戻り値
ObjectMove関数の構文は以下の通りです。
bool ObjectMove(
long chart_id, // チャート識別子(0は現在のチャート)
string name, // オブジェクトの名前
int point_index, // ポイントのインデックス(0, 1, 2...)
datetime time, // 新しい時間座標
double price // 新しい価格座標
);
パラメーター解説
- chart_id: 操作したいチャートのIDを指定します。自分のチャートなら
0またはChartID()を使います。 - name: 作成時に指定したオブジェクトの一意の名前です。
- point_index: 移動させるアンカーポイントの番号です。
- 水平線やラベル:通常
0のみ。 - トレンドライン:始点が
0、終点が1。 - フィボナッチ:
0〜2など。
- 水平線やラベル:通常
- time: 移動先の「時間」を指定します。
- price: 移動先の「価格」を指定します。
戻り値
- 成功した場合は
true、失敗した場合はfalseを返します。 - 失敗の理由は
GetLastError()関数で詳細を確認できます。
3. 具体的な使い方・実践サンプルコード
以下のサンプルは、現在価格に追従して水平線を移動させるシンプルなEA(またはスクリプト)の例です。
//+------------------------------------------------------------------+
//| ObjectMove_Sample.mq5|
//+------------------------------------------------------------------+
#property strict
//--- 設定
input string objName = "MyPriceLine"; // オブジェクト名
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
datetime currentTime = TimeCurrent();
// 1. オブジェクトが既に存在するか確認
if(ObjectFind(0, objName) < 0)
{
// 存在しない場合は新規作成(ここでは水平線を例に)
if(!ObjectCreate(0, objName, OBJ_HLINE, 0, 0, currentBid))
{
Print("オブジェクト作成失敗: ", GetLastError());
return;
}
// 見やすくするために色を赤に設定
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrRed);
}
else
{
// 2. 既に存在する場合は ObjectMove で位置を更新
// OBJ_HLINE(水平線)は point_index=0 のみ使用
if(!ObjectMove(0, objName, 0, currentTime, currentBid))
{
Print("オブジェクト移動失敗: ", GetLastError());
return;
}
}
// チャートを強制的に再描画して変更を即座に反映させる
ChartRedraw(0);
}
4. 使用上の注意点とよくあるエラー
-
ChartRedrawを忘れない:
ObjectMoveを実行しただけでは、次のティックが来るまでチャート上の見た目が更新されないことがあります。リアルタイム性を求めるなら、関数の後に必ずChartRedraw(0)を呼び出しましょう。 -
インデックスの指定ミス:
トレンドライン(OBJ_TREND)の終点だけを動かしたいのにpoint_indexに0を指定すると、始点が動いてしまい、ラインの角度が変わってしまいます。動かしたい点がどこかを常に意識してください。 -
削除済みオブジェクトへのアクセス:
手動でチャート上のオブジェクトを消してしまった後にObjectMoveを実行するとエラーになります。サンプルコードのように、ObjectFindで存在確認をするか、エラーハンドリングを組み込むのがクオンツとしての作法です。 -
座標の型に注意:
価格はdouble、時間はdatetimeです。特に時間を計算で求める際(例:10バー先など)は、型変換のミスに注意しましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレーダーとして最も警戒すべきは、プログラムのバグだけではありません。どんなに完璧なロジックを組み、ObjectMoveでミリ秒単位の描画更新を行ったとしても、実行環境が「自宅のPC」である限り、プロの世界では通用しません。家庭用インターネット回線には必ず「ジッター(遅延の揺らぎ)」が発生し、証券会社のサーバーとの物理的距離が数ミリ秒の致命的な約定遅延(レイテンシ)を生むからです。
FXの自動売買において、1秒の遅延は致命傷です。特にスキャルピングや急変時の対応では、滑り(スリッページ)によって期待期待値がマイナスに転じることも珍しくありません。プロのクオンツエンジニアが例外なく専用のVPS(仮想専用サーバー)を利用するのは、計算リソースの確保以上に「ブローカーのサーバーと同じデータセンター、あるいは至近距離に設置されたネットワーク環境」を手に入れるためです。安定した24時間の稼働と、極限まで削ぎ落とされた低レイテンシ環境があって初めて、あなたのアルゴリズムは真のパフォーマンスを発揮します。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント