1. ChartTimeOnDropped関数の概要と実務での活用法
MQL5のChartTimeOnDroppedは、EA(エキスパートアドバイザー)、スクリプト、またはインジケーターがチャート上に「ドラッグ&ドロップ」された際の、ドロップ地点の時刻(datetime)を取得する関数です。
実務開発、特に「半自動売買ツール」を作成する際に非常に重宝します。例えば、特定のチャート上の過去の目立つ安値にEAをドロップし、そこを起点として計算を開始させたり、特定の時間軸に印を付けたりする場合に活用されます。
多くの初心者がつまずくポイントは、「ダブルクリックで起動した場合、この関数は0を返す」という点です。ナビゲーターウィンドウからチャートへマウスで引きずって落としたときのみ有効な値を返すため、ユーザー操作に依存する設計が必要になります。この「ドロップした瞬間をトリガーにする」という直感的な操作性は、裁量トレードを補助するツール開発において大きな武器となります。
2. 構文と戻り値
関数の仕様は非常にシンプルです。引数はなく、ドロップされた位置の時刻を返します。
datetime ChartTimeOnDropped();
- 戻り値:
- 成功した場合:チャート上のドロップされた地点の時刻(
datetime型)。 - 失敗した場合(ドラッグ&ドロップ以外で起動した場合など):
0。
- 成功した場合:チャート上のドロップされた地点の時刻(
この関数と対になるChartPriceOnDropped()(価格を取得)とセットで使用することで、チャート上の特定の「点(時間と価格)」を特定することが可能になります。
3. 具体的な使い方・実践サンプルコード
以下は、EAをチャートにドロップした際、その地点の時刻に垂直線(V-Line)を引き、その時刻から現在までのバーの数を計算する実用的なサンプルコードです。
//+------------------------------------------------------------------+
//| DropTimeExample.mq5 |
//| Copyright 2023, Quant Engineer |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, Quant Engineer"
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
// 1. EAがドロップされた位置の時間を取得
datetime dropTime = ChartTimeOnDropped();
// 2. 戻り値のチェック(ダブルクリック起動時は0になる)
if(dropTime == 0)
{
Print("EAはドラッグ&ドロップで起動されませんでした。現在時刻を使用します。");
return(INIT_SUCCEEDED);
}
// 3. ログに出力
Print("EAがドロップされた時刻: ", TimeToString(dropTime));
// 4. チャート上に垂直線を描画して視覚化する
string lineName = "DropLine_" + TimeToString(dropTime);
// 既存の線を削除して再作成
ObjectDelete(0, lineName);
if(ObjectCreate(0, lineName, OBJ_VLINE, 0, dropTime, 0))
{
ObjectSetInteger(0, lineName, OBJPROP_COLOR, clrRed); // 線の色を赤に設定
ObjectSetInteger(0, lineName, OBJPROP_STYLE, STYLE_DOT); // 点線に設定
Print("ドロップ地点に垂直線を描画しました。");
}
// 5. ドロップ地点から現在までの経過バー数を計算(実務的な応用例)
int barIndex = iBarShift(_Symbol, _Period, dropTime);
Print("ドロップ地点から現在まで ", barIndex, " 本のバーが経過しています。");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// EA削除時に描画したオブジェクトを消去(任意)
ObjectsDeleteAll(0, "DropLine_");
}
4. 使用上の注意点とよくあるエラー
開発時に注意すべき点は以下の3点です。
-
ゼロ値のハンドリング:
前述の通り、ナビゲーターからダブルクリックで起動すると0が返ります。この場合を想定して、if(dropTime == 0)による条件分岐を必ず入れましょう。これを忘れると、1970年1月1日といった無効な日時をベースに計算が行われ、予期せぬバグの原因になります。 -
実行タイミングの制限:
この関数は通常、OnInit()(初期化時)またはOnStart()(スクリプト実行時)で一度だけ使用されます。EAが稼働し始めた後にマウスを動かしても、ChartTimeOnDroppedの値は更新されません。稼働中のマウス位置を取得したい場合は、OnChartEvent関数内でCHARTEVENT_MOUSE_MOVEを使用する必要があります。 -
時間軸(時間足)の精度:
ドロップした位置の正確な時刻が返されますが、それはチャートの時間足の精度に依存します。例えば1時間足チャートでドロップした場合、視覚的には「15分」の地点に見えても、正確なティック単位の時間ではなく、ロウソク足の開始時間に丸められた値が返されることがあるため、秒単位の精度を求める場合は注意が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ロジックの正確さと同じくらい重要なのが「実行環境の品質」です。多くの日本人開発者が陥る罠として、自宅のデスクトップPCやノートPCでEAを24時間稼働させてしまうことが挙げられます。しかし、自宅のインターネット回線は、プロバイダーを経由する際に大きなネットワーク遅延(レイテンシ)が発生し、数百ミリ秒単位で約定スピードが低下します。
この遅延は、ボラティリティが高い局面では致命的なスリッページを引き起こし、理論上のバックテスト結果とリアルトレードの結果に大きな乖離を生む原因となります。0.1秒の遅れが、本来得られるはずだった利益を損失に変えてしまうのがFXの世界です。プロのクオンツや専業トレーダーにとって、証券会社のサーバーに物理的に近いデータセンター内に設置された「専用VPS(仮想専用サーバー)」の使用は、もはや選択肢ではなく「必須条件」です。安定した電源、高速なバックボーン回線、そして24時間の稼働保証。これらが揃って初めて、あなたの開発したアルゴリズムはその真価を発揮します。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント