チャート画像を保存して外部アプリで開く方法【MQLプログラミングの基礎】
1.ファイルの新規作成で「OnChartEvent」を選択
この記事では、チャート画像をファイルとして保存し、MT4以外の外部アプリを起動して、そのファイルを開く方法を解説します。まずはMT4に最初から入っているChartScreenShot関数を利用して、キーボードの操作で画像を保存する方法を解説します。
ファイルの新規作成で「カスタムインディケータ」を選択し、ファイル名を「ExecuteTest」とします。今回はキーボード操作を行うので、「カスタムインディケータのイベントハンドラ」の画面で「OnChartEvent」にチェックを入れて次へ進み、「完了」をクリックすれば、ひな形の完成です。
2.Pキーに割り当てられている番号を確認
ファイルが開いたら、OnChartEvent関数内に処理を記述していきます。今回は「CHARTEVENT_KEYDOWN」を利用して、キーボードのPキーを押したときに処理が実行されるようにしたいので、まずはPキーに割り当てられている番号を調べます。次のコードを記述して押されたキーの番号を出力してみましょう。
if (id == CHARTEVENT_KEYDOWN) {
Print(sparam);
}
これでコンパイルしてチャートにセットし、キーボードのPを押すと、ターミナルウィンドウの「エキスパート」タブにメッセージとして「25」が出力されます。この25がPキーに割り当てられている番号です。
3.ChartScreenShot関数で画像を保存
続いて、確認した番号を用いて、Pキーを押したときに実行される処理を記述していきます。今回は、ChartScreenShot関数を使ってチャート画像の保存を行います。ChartScreenShotは、保存したいチャートのID、ファイル名、画像の幅や高さ、基準位置などを指定して、チャートのスクリーンショットを保存する関数です。画像の保存場所は、データフォルダの「Files」ディレクトリです。
画像ファイルの種類に関しては、ファイル名の拡張子で指定したものになり、GIF画像、PNG画像、BMP画像といった形式で保存できます。ここではチャートIDを「0」、ファイル名を「chart.png」、サイズを幅「600」、高さ「400」、基準位置をデフォルトのままとします。
if (id == CHARTEVENT_KEYDOWN) {
if (sparam == 25) {
ChartScreenShot(0, "chart.png", 600, 400);
}
Print(sparam);
}
これでコンパイルしてキーボードのPキーを押してみましょう。データフォルダの「MQL4」→「Files」フォルダを開くと、「chart.png」というファイル名のチャート画像が保存されていることが分かります。
4.「import」で外部ファイルを呼び出す
上記では、Pキーに割り当てられた番号を使い、ChartScreenShot関数でチャート画像を保存することができました。続いて、ShellExecuteW functionというWindows APIを利用して、保存したファイルを開いてみましょう。
ShellExecuteW functionは「Shell32.dll」というダイナミックリンクライブラリ(Dynamic Link Library:DLL)ファイルに入っているので、そこから呼び出して使います。外部ファイルを呼び出すときは「import」でファイル名を指定し、その中に使いたい関数を書きます。「#property indicator_chart_window」の下に、次のように記述しましょう。
#import "Shell32.dll"
int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
#import
ちなみに、この関数のコードはマイクロソフトの開発者向けページからコピーして、MT4で使えるように型を変えたものです。
5.保存した画像を「ShellExecuteW」で開く
続いて、OnChartEvent関数内の「ChartScreenShot(0, “chart.png”, 600, 400);」の下で作ったShellExecuteWを呼び出します。ShellExecuteWでは、コマンドのような形でアプリに何をさせるか指定することができ、今回はファイルを開きたいので「open」を使います。その次に開きたいファイルの名前を指定しますが、「TERMINAL_DATA_PATH」というのはMQL4フォルダより前のパスを意味し、それに続く形でフォルダ名とファイル名を入力する必要があります。最後は「1」としていますが、これはどのような状態で開くかの指定です。1は普通に開く「SHOWNORMAL」に対応しており、他の数字を指定すれば、最小化や最大化して開くことも可能です。
ShellExecuteW(0, "open", TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\chart.png", "", "", 1);
なおWindows APIなどを用いる場合は、インジケーターのプロパティ画面の「全般」タブで「DLLの使用を許可する」にチェックを入れてから実行するようにしてください。DLLの使用が許可されていない状態で実行すると、エラーが発生して失敗となるので注意が必要です。
これでコンパイルしてチャートにセットしましょう。キーボードのPキーを押すと、チャートの画像が保存され、その画像ファイルが開かれます。
6.ShellExecuteWを応用した使い方
上記では、importで外部ファイルを呼び出し、ShellExecuteWという関数を利用して保存したチャート画像を開くことができました。次にShellExecuteWの応用パターンとして、ファイルではなく保存先のフォルダを開くように改造してみましょう。
方法は簡単で、ShellExecuteWで指定していたファイル名のところを「”\\MQL4\\Files\\chart.png”」から「”\\MQL4\\Files\\”」という具合にファイル名「chart.png」を削除するだけです。
ShellExecuteW(0, "open", TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\", "", "", 1);
この状態でコンパイルしてキーボードのPキーを押すと、ファイルではなくFilesフォルダが開くことが分かります。
また、ShellExecuteWでは指定したURLのページを開くことも可能です。今回はキーボードのHキーを押したときに、「OANDAラボ」のページが開くように設定してみましょう。Hキーに割り当てられている番号は「35」なので、sparamが35の場合に処理を実行するif文を「Print(sparam);」の前に追加します。そして先に記述したShellExecuteWのコードを流用し、アドレスの代わりにOANDAラボのURLを指定すれば完了です。
if (sparam == 35) {
ShellExecuteW(0, "open", "https://www.oanda.jp/lab-education/", "", "", 1);
}
これでコンパイルしてキーボードのHキーを押すと、ブラウザが起動して指定したOANDAラボのページが開きます。ShellExecuteWは応用の利く関数で、このように関連付けられたファイルやフォルダ、URLを開くことができます。
7.ソースコード
今回、作成したソースコードは下記の通りです。
//+------------------------------------------------------------------+
//| ExecuteTest.mq4 |
//| Copyright 2022, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
#import "Shell32.dll"
int ShellExecuteW(int hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd);
#import
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//---
if (id == CHARTEVENT_KEYDOWN) {
if (sparam == 25) {
ChartScreenShot(0, "chart.png", 600, 400);
ShellExecuteW(0, "open", TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL4\\Files\\", "", "", 1);
}
if (sparam == 35) {
ShellExecuteW(0, "open", "https://www.oanda.jp/lab-education/", "", "", 1);
}
Print(sparam);
}
}
本記事の監修者・HT FX
2013年にFXを開始し、その後専業トレーダーへ。2014年からMT4/MT5のカスタムインジケーターの開発に取り組む。ブログでは100本を超えるインジケーターを無料公開。投資スタイルは自作の秒足インジケーターを利用したスキャルピング。
EA(自動売買)を学びたい方へオススメコンテンツ

OANDAではEA(自動売買)を稼働するプラットフォームMT4/MT5の基本的な使い方について、画像や動画付きで詳しく解説しています。MT4/MT5のインストールからEAの設定方法までを詳しく解説しているので、初心者の方でもスムーズにEA運用を始めることが可能です。またOANDAの口座をお持ちであれば、独自開発したオリジナルインジケーターを無料で利用することもできます。EA運用をお考えであれば、ぜひ口座開設をご検討ください。
本ホームページに掲載されている事項は、投資判断の参考となる情報の提供を目的としたものであり、投資の勧誘を目的としたものではありません。投資方針、投資タイミング等は、ご自身の責任において判断してください。本サービスの情報に基づいて行った取引のいかなる損失についても、当社は一切の責を負いかねますのでご了承ください。また、当社は、当該情報の正確性および完全性を保証または約束するものでなく、今後、予告なしに内容を変更または廃止する場合があります。なお、当該情報の欠落・誤謬等につきましてもその責を負いかねますのでご了承ください。