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

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

ChartScreenShotは、指定したチャートの現在の状態を画像ファイル(GIF、PNG、またはBMP)として保存するための関数です。単に「チャートを画像にする」だけの機能に見えますが、プロのクオンツや開発者の現場では非常に重要な役割を担います。

実務での主な活用法:
* トレードログの自動生成: エントリーや決済が発生した瞬間のチャートを保存し、後から「なぜこのタイミングで入ったのか」を視覚的に振り返る。
* 異常検知とデバッグ: ストップロスが滑った際や、意図しない挙動をした際のテクニカル指標の値を画像で記録し、原因究明に役立てる。
* 通知システムとの連携: WebRequest関数などと組み合わせ、LINEやDiscord、Telegramに現在のチャート画像を転送し、出先から状況を確認する。

初心者が特につまずきやすいポイントは「保存先」と「実行タイミング」です。保存される場所はターミナルのデータフォルダ内(MQL5/Files)に限定されており、またチャートの描画更新が完了する前に実行すると、インジケーターが表示されていない真っさらな画像が生成されるといったトラブルがよく見られます。

2. 構文と戻り値

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

bool  ChartScreenShot(
   long             chart_id,     // チャートID(0は現在のチャート)
   string           filename,     // 保存するファイル名(MQL5/Filesからの相対パス)
   int              width,        // 画像の幅(ピクセル)
   int              height,       // 画像の高さ(ピクセル)
   ENUM_ALIGN_MODE  align_mode=ALIGN_RIGHT // 右端基準か左端基準か(オプション)
   );

パラメーター解説

  1. chart_id: 操作対象のチャートIDを指定します。通常、実行中のチャートであれば 0 を指定します。
  2. filename: 保存するファイル名です。拡張子(.png, .gif, .bmp)を含める必要があります。
  3. width / height: 画像の解像度を指定します。
  4. align_mode: チャートのどの部分を基準に撮影するかを指定します。デフォルトの ALIGN_RIGHT は、最新の価格(右端)を基準にするため、トレード記録に最適です。

戻り値

  • 成功した場合は true、失敗した場合は false を返します。失敗した場合は GetLastError() を呼び出すことで、エラーコードを確認できます。

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

以下のコードは、EA(エキスパートアドバイザー)内でエントリー(注文発注)が行われた瞬間に、チャートを「Files/TradeScreenshots」フォルダへ自動保存する実戦的な例です。

//+------------------------------------------------------------------+
//| エントリー時にスクリーンショットを撮るサンプル                     |
//+------------------------------------------------------------------+
void CaptureTradeScene(string symbol, string type)
{
   // ファイル名の作成(例:20231027_1530_USDJPY_BUY.png)
   MqlDateTime dt;
   TimeToStruct(TimeCurrent(), dt);

   string fileName = StringFormat("TradeScreenshots\\%04d%02d%02d_%02d%02d_%s_%s.png",
                                  dt.year, dt.mon, dt.day, dt.hour, dt.min, symbol, type);

   // スクリーンショットの実行(1280x720のHDサイズ)
   // 第5引数にALIGN_RIGHTを指定することで、最新の足を確実にキャプチャ
   if(ChartScreenShot(0, fileName, 1280, 720, ALIGN_RIGHT))
   {
      Print("スクリーンショットを保存しました: ", fileName);
   }
   else
   {
      Print("エラー: スクリーンショットの保存に失敗しました。コード: ", GetLastError());
   }
}

// OnTick内での使用イメージ
void OnTick()
{
   // 何らかのエントリーロジック...
   // if(EntryCondition) {
   //    ExecuteOrder();
   //    CaptureTradeScene(_Symbol, "BUY");
   // }
}

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

  1. フォルダの自動作成はされない:
    上記のコードで TradeScreenshots\\ のようにサブフォルダを指定する場合、あらかじめ MQL5/Files 内にそのフォルダを作成しておく必要があります。フォルダが存在しないと関数は false を返します。
  2. ファイル名の重複:
    同じファイル名で実行すると、古いファイルは上書きされます。タイムスタンプやチケット番号をファイル名に含めるのが鉄則です。
  3. 拡張子の重要性:
    filename に拡張子を付け忘れると、正しく画像ファイルとして認識されません。MQL5では一般的に軽量な .png が推奨されます。
  4. バックテストでの挙動:
    ストラテジーテスターで「可視モード」を使用していない場合、ChartScreenShot は動作しません。バックテスト結果を画像で残したい場合は、可視モードを有効にする必要があります。

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

アルゴリズムトレードにおいて、ロジックの精度と同じか、それ以上に重要なのが「約定スピード」です。どんなに優れたエントリー条件をコード化しても、自宅のPC環境から一般的なインターネット回線を通じて注文を出している限り、物理的な距離とネットワーク経路の多さ(ホップ数)による遅延(レイテンシ)は避けられません。

この数ミリ秒から数百ミリ秒の遅延は、相場急変時のスリッページを増大させ、バックテストの結果とリアルトレードの結果を乖離させる致命的な要因となります。プロレベルの運用を目指すのであれば、ブローカーのサーバーと同じデータセンター、あるいは極めて近い場所に位置する専用のVPS(仮想専用サーバー)を利用することが技術的な必須要件です。安定した電源、24時間の稼働保証、そして最短のネットワーク経路を確保することこそが、システムトレーダーにとっての「攻めのインフラ投資」となります。

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

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

コメント

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