1. ChartGetDouble関数の概要と実務での活用法
ChartGetDoubleは、指定したチャートのプロパティ(属性)の中から、浮動小数点数(double型)の値を取得するための関数です。例えば、現在表示されているチャートの価格の最大値・最小値や、特定のインジケーターウィンドウの数値などをプログラム側で把握するために使用します。
実務開発において、初心者が最もつまずきやすいのは「関数の戻り値が取得したい値そのものではない」という点です。この関数は「値の取得に成功したかどうか」を真偽値(true/false)で返し、実際の値は「参照渡し」という手法で変数に格納されます。
実務での活用例:
* チャートの表示範囲に合わせたオブジェクト配置: チャートの最高値・最安値を自動で取得し、フィボナッチや水平線を適切な位置に描画する。
* サブウィンドウのスケール調整: オシレーター系のインジケーターが特定の数値を超えた場合にアラートを出す、あるいは動的に表示倍率を計算する。
* ビジュアル的なUI設計: EAの設定画面や情報をチャート上に表示する際、価格のメモリと重ならないように座標を計算する。
単に「価格を取得する」だけならCopyRatesやiCloseで事足りますが、「今、トレーダーが見ている画面の状態」をプログラムに認識させるためには、この関数が不可欠です。
2. 構文と戻り値
ChartGetDoubleには2つのオーバーロード(書き方)がありますが、実務で主に使われるのは、成否を判定できる以下の形式です。
bool ChartGetDouble(
long chart_id, // チャートID(0は現在のチャート)
int prop_id, // 取得したいプロパティの種類(ENUM_CHART_PROPERTY_DOUBLE)
int sub_window, // サブウィンドウの番号(メインウィンドウは0)
double& double_var // 値を受け取る変数(参照渡し)
);
パラメーター
- chart_id: 操作対象のチャートIDを指定します。自身のチャートであれば
0を指定します。 - prop_id: 取得したい値の種類を識別子(ID)で指定します。
CHART_PRICE_MIN: チャートの表示最小価格CHART_PRICE_MAX: チャートの表示最大価格CHART_FIXED_MAX: 固定スケール時の最大値
- sub_window: ウィンドウ番号。メインチャートなら
0、インジケーター等が表示されている下の枠なら1, 2...となります。 - double_var: 取得した数値を格納するための変数です。あらかじめ宣言しておく必要があります。
戻り値
- true: 値の取得に成功。
- false: 失敗。エラーの詳細は
GetLastError()関数で確認できます。
3. 具体的な使い方・実践サンプルコード
以下のサンプルコードは、現在チャートに表示されている画面内での「最高値」と「最安値」を取得し、その中央値に水平線を引くスクリプトです。
//+------------------------------------------------------------------+
//| SampleChartGetDouble.mq5|
//+------------------------------------------------------------------+
void OnStart()
{
double priceMax; // 最高値を格納する変数
double priceMin; // 最安値を格納する変数
// 1. 現在のチャート(ID=0)の表示最大価格を取得
if(!ChartGetDouble(0, CHART_PRICE_MAX, 0, priceMax))
{
Print("最大価格の取得に失敗。エラーコード:", GetLastError());
return;
}
// 2. 現在のチャート(ID=0)の表示最小価格を取得
if(!ChartGetDouble(0, CHART_PRICE_MIN, 0, priceMin))
{
Print("最小価格の取得に失敗。エラーコード:", GetLastError());
return;
}
// 3. 取得した値を使って計算(中央値を算出)
double middlePrice = (priceMax + priceMin) / 2.0;
// 結果をエキスパートログに出力
PrintFormat("画面内の最高値: %f, 最安値: %f, 中央値: %f", priceMax, priceMin, middlePrice);
// 4. 実践的な活用:中央値に水平線を引く
string objName = "CenterLine";
ObjectDelete(0, objName); // 既存の線を削除
ObjectCreate(0, objName, OBJ_HLINE, 0, 0, middlePrice);
ObjectSetInteger(0, objName, OBJPROP_COLOR, clrRed);
ObjectSetInteger(0, objName, OBJPROP_WIDTH, 2);
ChartRedraw(); // チャートを再描画して反映
}
4. 使用上の注意点とよくあるエラー
-
取得失敗時のエラーチェックを怠らない
ChartGetDoubleは、チャートが完全に描画される前や、無効なチャートIDを指定した場合にfalseを返します。戻り値の確認をせず、格納先の変数(初期値0など)をそのまま計算に使うと、ゼロ除算エラーや意図しない価格でのエントリーを引き起こす原因になります。 -
サブウィンドウ番号の指定ミス
CHART_PRICE_MAXなどを取得する際、メインチャートを対象にする場合は必ずsub_windowに0を指定してください。RSIやMACDなどが表示されているサブウィンドウのスケールを取りたい場合は1以上の正しいインデックスを指定する必要があります。 -
価格スケール以外のプロパティ
CHART_FIXED_MAX(固定スケールの最大値)などは、チャート設定で「スケールの固定」が有効になっていないと正しい値が取れない場合があります。「今見えている範囲の価格」を取りたいのか、「設定されている上限値」を取りたいのか、prop_idの選定には注意が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、ChartGetDoubleなどの関数を駆使してどれほど完璧なロジックを組み上げたとしても、実行環境が劣悪であればその努力は水の泡となります。特に日本の家庭用インターネット回線を利用した自宅PCでの運用は、プロのクオンツの視点から見れば極めてリスクの高い行為です。家庭用回線では、プロバイダーを経由する際のネットワーク遅延(レイテンシ)やパケットロスが避けられず、ミリ秒単位の遅れが約定価格の滑り(スリッページ)を招き、期待期待値を大幅に削り取ります。
FX取引のサーバーは多くの場合、ロンドンやニューヨークの世界的なデータセンター(Equinix LD4やNY4など)に設置されています。これに対し、物理的に距離がある日本国内からの接続は、光速の限界による遅延だけで数十〜数百ミリ秒のハンデを背負うことになります。極限まで約定スピードを高め、ロジック通りのパフォーマンスを発揮させるには、ブローカーのサーバーと物理的に極めて近い距離に設置された専用のVPS(仮想専用サーバー)の利用が必須です。インフラを軽視するエンジニアは、最終的に「環境の壁」によって市場から退場させられることを肝に銘じておくべきです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント