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

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

ChartSetDoubleは、指定したチャートのプロパティ(属性)を「double型(浮動小数点数)」で設定するための関数です。

MQL5での開発において、チャートの見た目や挙動を制御する関数はいくつかありますが、この関数は主に価格尺度(スケール)の制御や、チャート上の特定の価格水準をプログラムから強制的に変更したい場合に使用されます。

実務での活用シーン

実務では、以下のような場面で多用されます。
* 価格スケールの固定: 自動売買(EA)がエントリーポイントやターゲットを視覚化する際、チャートが勝手に動かないよう上下限価格を固定する。
* カスタムインジケーターの表示調整: サブウィンドウではなくメインチャート上に特定の計算値を基準とした描画範囲を設定する。

つまずきやすいポイント

初心者が特につまずきやすいのは、「プロパティID」の選択ミスです。MQL5にはChartSetIntegerChartSetStringなど似た関数があり、設定したい項目がどの型に属しているかを正しく把握していないと、コードはエラーにならずとも「全く反応しない」という状況に陥ります。ChartSetDoubleはあくまで「価格」や「比率」などの小数点データ用であることを意識しましょう。


2. 構文と戻り値

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

bool ChartSetDouble(
   long   chart_id,     // チャートID(0は現在のチャート)
   int    prop_id,      // プロパティID(ENUM_CHART_PROPERTY_DOUBLE)
   double value         // 設定する値
);

パラメーター解説

  1. chart_id: 操作対象のチャートを識別するIDです。通常、現在開いているチャートを操作する場合は 0 を指定します。
  2. prop_id: 変更したい項目を指定します(例:CHART_FIXED_MAX = チャートの最大価格)。
  3. value: 設定したい具体的な数値をdouble型で入力します。

戻り値

  • 成功時: true
  • 失敗時: false
    • 失敗した場合は GetLastError() 関数を呼び出すことで、エラーの詳細を確認できます。

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

以下は、EAの実行時にチャートの価格スケールを現在の価格から上下100pipsに固定する実用的なスクリプト例です。価格の変動を一定の視野に収めたいロジックで重宝します。

//+------------------------------------------------------------------+
//| チャートの上下限価格を固定するサンプルコード                           |
//+------------------------------------------------------------------+
void SetFixedChartScale(double upper_pips, double lower_pips)
{
   // 現在の価格(Bid)を取得
   double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT);
   int digits = (int)SymbolInfoInteger(_Symbol, SYMBOL_DIGITS);

   // 上限と下限の計算(例:現在価格から指定pips分上下に設定)
   double max_price = currentPrice + (upper_pips * point * 10); // 10倍は対JPYなどの調整用
   double min_price = currentPrice - (lower_pips * point * 10);

   // 1. まずスケールを「固定モード」にする(これはInteger関数を使用)
   ChartSetInteger(0, CHART_SCALEFIX, true);

   // 2. ChartSetDoubleを使用して、上限価格を設定
   if(!ChartSetDouble(0, CHART_FIXED_MAX, max_price))
   {
      Print("上限価格の設定に失敗。エラーコード:", GetLastError());
   }

   // 3. ChartSetDoubleを使用して、下限価格を設定
   if(!ChartSetDouble(0, CHART_FIXED_MIN, min_price))
   {
      Print("下限価格の設定に失敗。エラーコード:", GetLastError());
   }

   // チャートを即時更新して反映させる
   ChartRedraw(0);

   Print("チャートスケールを固定しました: Max=", DoubleToString(max_price, digits), 
         " Min=", DoubleToString(min_price, digits));
}

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

1. 「プロパティの依存関係」に注意

ChartSetDoubleCHART_FIXED_MAX(最大価格)や CHART_FIXED_MIN(最小価格)を設定しても、チャートの設定自体が「スケール固定モード(CHART_SCALEFIX)」になっていないと、値は無視されます。前述のサンプルコードのように、ChartSetIntegerでスケール固定を有効化してから実行してください。

2. 非同期実行によるラグ

ChartSet 系の関数は、呼び出した瞬間に画面が書き換わるとは限りません。設定命令をキューに送るだけなので、計算直後に視覚的な確認が必要な場合は、必ず ChartRedraw() をセットで呼び出す癖をつけましょう。

3. データ型の不一致

「チャートの背景色を変えたい」と思って ChartSetDouble を使おうとする初心者が多いですが、色は内部的に整数(int)として処理されるため、その場合は ChartSetInteger を使用します。「価格に関連する項目(小数点が含まれるもの)」だけが ChartSetDouble の守備範囲です。


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

アルゴリズムトレードにおいて、プログラムのロジックと同じ、あるいはそれ以上に重要なのが「実行環境」です。どれほど洗練されたMQL5コードを書いて ChartSetDouble で完璧な画面表示を行ったとしても、自宅の一般的なPC環境から自動売買を行うことには致命的なリスクが伴います。

日本の家庭用インターネット回線は、ブラウジングには十分ですが、金融取引においてはネットワーク遅延(レイテンシ)やパケットロスが避けられません。FXの価格はミリ秒単位で変動しており、自宅PCから発注した注文が証券会社のサーバーに届くまでのわずかコンマ数秒の遅れが、「スリッページ」という形でダイレクトに利益を削り取ります。プロのクオンツやトレーダーが専用のVPS(仮想専用サーバー)を利用するのは、物理的に証券会社のサーバーに近い場所から注文を出すことで、この遅延を極限まで排除するためです。安定した24時間稼働と最速の約定スピードを確保することは、シストレにおける「勝つための最低条件」と言っても過言ではありません。

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

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

コメント

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