【MQL5】ChartScreenShot関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク
  1. ChartScreenShot関数の働き・役割
  2. ChartScreenShot関数の引数について
    1. 書式
    2. 引数の詳細
  3. ENUM_ALIGN_MODEについて
    1. ALIGN_LEFT
    2. ALIGN_CENTER
    3. ALIGN_RIGHT
  4. ChartScreenShot関数の戻り値について
  5. ChartScreenShot関数を使う際の注意点
  6. ChartScreenShot関数を使ったサンプルコード
  7. サンプルコード解説1:グローバル領域での定義
    1. #property description
    2. #define WIDTH 800
    3. #define HEIGHT 600
    4. input int pictures=5
    5. int mode=-1
    6. int bars_shift=300
  8. サンプルコード解説2:OnInit関数
    1. チャートの自動スクロールを無効にする
    2. チャートの右端のシフトを設定する
    3. ローソク足チャートを表示する
    4. エキスパートアドバイザの準備完了メッセージ
  9. サンプルコード解説3:OnChartEvent関数その1
    1. OnChartEvent関数の引数詳細
      1. id
      2. lparam
      3. dparam
      4. sparam
    2. 関数の名称、呼び出し時間とイベント識別子の表示
  10. サンプルコード解説4:OnChartEvent関数その2
    1. マウスクリックイベントの処理
      1. idのチェック
      2. チャートの初期シフト位置の設定
      3. チャートの左端での動作
      4. チャートを左端にスクロール
      5. ループ処理によるスクリーンショットの取得
  11. サンプルコード解説5:OnChartEvent関数その3
    1. スクリーンショットのファイル名を準備する
    2. ファイル名をチャートにコメントとして表示する
    3. スクリーンショットの保存
    4. チャート位置の更新
    5. ユーザーに時間を与える
    6. チャートのスクロール
    7. モードの反転
  12. サンプルコード解説6:OnChartEvent関数その4
    1. チャートの右縁での動作
      1. チャートを右縁にスクロールする
      2. スクリーンショットのループ処理
      3. ファイル名の準備と表示
      4. スクリーンショットの保存
      5. チャート位置の更新
      6. ユーザーに時間を与える
      7. チャートのスクロール
      8. モードの反転

ChartScreenShot関数の働き・役割

ChartScreenShot関数は、現在のチャートのスクリーンショットを指定されたファイル形式で保存するために使用されます。
※スクリーンショットとは、コンピュータやスマートフォンの画面に表示されている内容をそのまま画像として保存する機能や行為を指します。


この関数はGIF、PNG、BMP形式でスクリーンショットを作成することができ、ファイルは指定されたディレクトリに保存されます。
※「指定されたディレクトリ」とは、MQL5スクリプトエキスパートアドバイザーがファイルを保存する標準ディレクトリを指します。具体的には、terminal_directory\MQL5\Filesフォルダがデフォルトの保存先となります。
ChartScreenShot関数を利用することで、取引の記録や分析のためにチャートの視覚的なスナップショットを簡単に取得できます。

ChartScreenShot関数の引数について

ChartScreenShot関数引数構成は以下の通りです。

書式

bool ChartScreenShot(
  long chart_id,                  // チャート識別子
  string filename,                // 銘柄名
  int width,                      // 幅
  int height,                     // 高さ
  ENUM_ALIGN_MODE align_mode=ALIGN_RIGHT // 整列の種類
);

引数の詳細

chart_id

chart_idはチャートの識別子を指定します。0を指定すると現在のチャートが対象となります。他の値を指定することで特定のチャートを対象にすることが可能です。

filename

filenameはスクリーンショットファイルの名前を指定します。この名前は最大63文字まで指定可能です。スクリーンショットファイルはプログラムディレクトリ内の\Filesフォルダに保存されます。

width

widthはスクリーンショットの幅をピクセル(デジタル画像を構成する最小の単位)単位で指定します。例えば、800を指定すると幅800ピクセルのスクリーンショットが作成されます。

height

heightはスクリーンショットの高さをピクセル単位で指定します。例えば、600を指定すると高さ600ピクセルのスクリーンショットが作成されます。

align_mode

align_modeはスクリーンショットの整列方法を指定します。この引数ENUM_ALIGN_MODEの値を使用します。初期値ALIGN_RIGHTで、これはスクリーンショットがチャートの右端に整列されることを意味します。ALIGN_LEFTを指定すると、スクリーンショットはチャートの左端に整列されます。

ENUM_ALIGN_MODEについて

ChartScreenShot関数で使用される整列方法を指定するENUM_ALIGN_MODEについて説明します。この列挙型は、スクリーンショットをチャートのどの部分に揃えるかを指定します。

ALIGN_LEFT

説明

ALIGN_LEFTは、スクリーンショットをチャートの左端に揃えることを意味します。このオプションを使用すると、スクリーンショットの左端がチャートの左端に位置します。

スクリーンショットを撮る際、チャート全体をキャプチャすることはできません。したがって、どの部分をキャプチャするかを指定する必要があります。ALIGN_LEFTを使用すると、スクリーンショットの左端がチャートの左端に揃うようにキャプチャされます。

例えば、チャートの全体幅が非常に広い場合でも、スクリーンショットの幅は設定したピクセル数になります。このとき、ALIGN_LEFTを指定すると、チャートの左端部分から設定した幅分のスクリーンショットが取得されます。これにより、チャートの左側に表示されている情報が優先的にキャプチャされます。

具体的には、次のような場合を考えてみましょう。

  1. チャートの全体幅が2000ピクセル
  2. スクリーンショットの幅を800ピクセルに設定
  3. ALIGN_LEFTを使用

この場合、スクリーンショットはチャートの最左端から800ピクセル分をキャプチャします。チャートの右端がスクリーンショットに含まれないため、左側の情報が中心となります。これは、特に左側の初期部分に重要なデータが含まれている場合に有効です。

ALIGN_CENTER

説明

ALIGN_CENTERは、スクリーンショットを中央に揃えることを意味します。ただし、これは編集オブジェクトにのみ適用されます。

具体的には、チャートの中心から左右に均等にスクリーンショットの幅が分配されます。

ALIGN_LEFTの項目で使った例を引き続き持ち出すと、チャートの中央位置は、全体幅の2000ピクセルの半分、すなわち1000ピクセルの位置になります。スクリーンショットの幅は800ピクセルなので、その中心位置を1000ピクセルに揃えた場合、左右にそれぞれ400ピクセルが分配されます。

したがって、以下の範囲がキャプチャされます:

ALIGN_RIGHT

説明

ALIGN_RIGHTは、スクリーンショットをチャートの右端に揃えることを意味します。このオプションを使用すると、スクリーンショットの右端がチャートの右端に位置します。

具体的には、チャートの右端から左方向にスクリーンショットの幅分をキャプチャします。

ALIGN_LEFTの項目で使った例を引き続き持ち出すと、チャートの右端は全体幅の2000ピクセルの位置→スクリーンショットの幅は800ピクセルなので、右端から800ピクセル左方向の範囲がキャプチャされます。

したがって、以下の範囲がキャプチャされます:

ChartScreenShot関数の戻り値について

ChartScreenShot関数戻り値は、スクリーンショットの取得が成功したかどうかを示します。

  • 成功した場合: 戻り値はtrueになります。これにより、スクリーンショットが正常に保存されたことが確認できます。
  • 失敗した場合: 戻り値はfalseになります。この場合、指定された条件でスクリーンショットを保存することができなかったことを示します。

例えば、指定したファイル名が無効であったり、保存先のディレクトリに書き込み権限がなかった場合などに、falseが返される可能性があります。

ChartScreenShot関数を使う際の注意点

ChartScreenShot関数を使用する際には、いくつかの重要な注意点があります。

まず、スクリーンショットを取得する位置を正確に指定する必要がある場合、チャートの位置を調整する必要があります。例えば、特定の位置からスクリーンショットを取得したい場合は、事前にChartNavigate関数を使用してチャートを適切な位置に移動させる必要があります。

ChartNavigate関数は、チャートの表示位置を変更するために使用される関数です。この関数を使うことで、チャートを指定したバー数だけ左または右にスクロールさせることができます。これにより、スクリーンショットを取得したいチャートの部分を表示させることが可能です。

また、スクリーンショットの幅がチャートウィンドウの幅よりも小さい場合、align_modeの設定に応じて、スクリーンショットにはチャートの右端または左端の部分が含まれることになります。具体的には、align_modeがALIGN_RIGHTに設定されている場合は右端に、ALIGN_LEFTに設定されている場合は左端に揃えられます。

これらの点に注意し、適切にチャートの位置やスクリーンショットの幅・高さを設定することで、必要な部分のスクリーンショットを正確に取得することができます。

ChartScreenShot関数を使ったサンプルコード

以下は、ChartScreenShot関数を使用して現在のチャートのスクリーンショットを取得するサンプルコードです。このコードでは、指定された枚数のスクリーンショットを一連の手順で取得し、保存します。なお、スクリーンショットのファイル名はチャート上に表示されます。

#property description "エキスパートアドバイザは、ChartScreenShot() 関数を使用して現在のチャートのスクリーンショットを連続して作成する方法を示します。"
#property description "利便性のため、ファイル名はチャート上に表示されます。画像の高さと幅はマクロで定義されています。"

#define        WIDTH  800     // ChartScreenShot() を呼ぶ画像幅
#define        HEIGHT 600     // ChartScreenShot() を呼ぶ画像の縦幅

//--- 入力パラメータ
input int     pictures=5;   // シリーズ内の画像の数
int            mode=-1;       // -1 は左へ、1は右端へのシフトを示す
int            bars_shift=300;// ChartNavigate() を使用してチャートをスクロールする際のバーの数

//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                        |
//+------------------------------------------------------------------+
void OnInit()
{
    //--- チャートの自動スクロールを無効にする
    ChartSetInteger(0,CHART_AUTOSCROLL,false);
    //--- チャートの右端のシフトを設定する
    ChartSetInteger(0,CHART_SHIFT,true);
    //--- ローソク足チャートを表示する
    ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
    //---
    Print("エキスパートアドバイザの準備が完了しました");
}

//+------------------------------------------------------------------+
//| エキスパートティック関数                                                 |
//+------------------------------------------------------------------+
void OnTick()
{
    //---
}

//+------------------------------------------------------------------+
//| ChartEvent 関数                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
{
    //--- 関数の名称、呼び出し時間とイベント識別子を表示する
    Print(__FUNCTION__,TimeCurrent(),"   id=",id,"   mode=",mode);
    //--- CHARTEVENT_CLICK イベントをハンドルする ("チャート上でのマウスクリック")
    if(id==CHARTEVENT_CLICK)
    {
        //--- チャートの縁から初期シフト
        int pos=0;
        //--- チャートの左縁での動作
        if(mode>0)
        {
            //--- チャートを左縁にスクロールする
            ChartNavigate(0,CHART_BEGIN,pos);
            for(int i=0;i<pictures;i++)
            {
                //--- チャートに表示するテキスト及びファイル名を準備する
                string name="ChartScreenShot"+"CHART_BEGIN"+string(pos)+".gif";
                //--- チャート名をコメントとして表示する
                Comment(name);
                //--- terminal_directory\MQL5\Files\ にチャートのスクリーンショットファイルを保存する
                if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_LEFT))
                    Print("スクリーンショットを保存しました: ",name);
                //---
                pos+=bars_shift;
                //--- ユーザにチャートの新しい部分を見る時間を与える
                Sleep(3000);
                //--- 現在位置 bars_shift バーからチャートを右にスクロールする
                ChartNavigate(0,CHART_CURRENT_POS,bars_shift);
            }
            //--- モードを反対に変更する
            mode*=-1;
        }
        else // チャートの右縁での動作
        {
            //--- チャートを右縁にスクロールする
            ChartNavigate(0,CHART_END,pos);
            for(int i=0;i<pictures;i++)
            {
                //--- チャートに表示するテキスト及びファイル名を準備する
                string name="ChartScreenShot"+"CHART_END"+string(pos)+".gif";
                //--- チャート名をコメントとして表示する
                Comment(name);
                //--- terminal_directory\MQL5\Files\ にチャートのスクリーンショットファイルを保存する
                if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_RIGHT))
                    Print("スクリーンショットを保存しました: ",name);
                //---
                pos+=bars_shift;
                //--- ユーザにチャートの新しい部分を見る時間を与える
                Sleep(3000);
                //--- 現在位置 bars_shift バーからチャートを右にスクロールする
                ChartNavigate(0,CHART_CURRENT_POS,-bars_shift);
            }
            //--- モードを反対に変更する
            mode*=-1;
        }
    } // CHARTEVENT_CLICK イベント処理の終了
} // OnChartEvent() ハンドラの終わり

サンプルコード解説1:グローバル領域での定義

以下のコードは、エキスパートアドバイザーが使用する設定や定義をグローバル領域で行っています。これにより、エキスパートアドバイザー全体で一貫した設定を簡単に利用することができます。

#property description "エキスパートアドバイザは、ChartScreenShot() 関数を使用して"
#property description "現在のチャートのスクリーンショットを連続して作成する方法を示します。"
#property description "利便性のため、ファイル名はチャート上に表示されます。画像の高さと幅はマクロで定義されています。"

#define        WIDTH  800     // ChartScreenShot() を呼ぶ画像幅
#define        HEIGHT 600     // ChartScreenShot() を呼ぶ画像の縦幅

//--- 入力パラメータ
input int     pictures=5;   // シリーズ内の画像の数
int            mode=-1;       // -1 は左へ、1は右端へのシフトを示す
int            bars_shift=300;// ChartNavigate() を使用してチャートをスクロールする際のバーの数

#property description

#property descriptionは、エキスパートアドバイザーの説明文を設定するために使用されます。このプロパティを設定することで、エキスパートアドバイザーの概要を明示的に説明し、ユーザーがその機能を理解しやすくします。

  • エキスパートアドバイザーChartScreenShot関数を使用して連続したスクリーンショットを作成する方法を示します。
  • ファイル名はチャート上に表示され、画像の高さと幅はマクロ(プログラム内で定義された定数やコードの再利用のための短縮表現)で定義されています。

#define WIDTH 800

#defineディレクティブを使用して、スクリーンショットの幅を800ピクセル(デジタル画像を構成する最小の単位)に設定します。これにより、スクリーンショットの幅が一貫して使用されるようになります。

#define HEIGHT 600

同様に、スクリーンショットの高さを600ピクセルに設定します。これにより、すべてのスクリーンショットが同じ高さで取得されることが保証されます。

input int pictures=5

input修飾子を使用して、ユーザーが設定できる入力パラメータを定義します。このパラメータは、連続して取得するスクリーンショットの数を指定します。初期値は5に設定されています。

int mode=-1

mode変数は、チャートをスクロールする方向を示します。初期値は-1で、これは左方向へのシフトを意味します。値が1の場合、右端へのシフトを示します。

int bars_shift=300

bars_shift変数は、ChartNavigate関数を使用してチャートをスクロールする際のバーの数を指定します。ChartNavigate関数は、チャートの表示位置を変更するために使用される関数です。例えば、この値が300に設定されている場合、チャートを300バー分スクロールさせることを意味します。

サンプルコード解説2:OnInit関数

以下のコードは、エキスパートアドバイザーの初期化時に実行されるOnInit関数の内容を示しています。この関数は、エキスパートアドバイザーがチャートに適用されたときに一度だけ呼び出され、必要な初期設定を行います。

//+------------------------------------------------------------------+
//| エキスパート初期化に使用される関数                                        |
//+------------------------------------------------------------------+
void OnInit()
{
    //--- チャートの自動スクロールを無効にする
    ChartSetInteger(0,CHART_AUTOSCROLL,false);
    //--- チャートの右端のシフトを設定する
    ChartSetInteger(0,CHART_SHIFT,true);
    //--- ローソク足チャートを表示する
    ChartSetInteger(0,CHART_MODE,CHART_CANDLES);
    //---
    Print("エキスパートアドバイザの準備が完了しました");
}

チャートの自動スクロールを無効にする

ChartSetInteger関数を使用して、チャートの自動スクロール機能を無効にしています。これにより、チャートが新しいティックデータを受信しても自動的にスクロールしなくなります。関数の第1引数にはチャート識別子を指定し、ここでは現在のチャートを意味する0を使用しています。第2引数には設定するプロパティとして CHART_AUTOSCROLLを指定し、第3引数には false を設定して無効にしています。

チャートの右端のシフトを設定する

ChartSetInteger関数を使用して、チャートの右端にシフトを設定しています。これにより、チャートの表示領域が右端にシフトされ、新しいティックデータが表示されるスペースが確保されます。第2引数には CHART_SHIFTを指定し、第3引数には true を設定して有効にしています。

ローソク足チャートを表示する

ChartSetInteger関数を使用して、チャートの表示モードをローソク足チャートに設定しています。これにより、チャートがローソク足形式で表示されます。第2引数には CHART_MODEを指定し、第3引数には CHART_CANDLES を設定しています。

エキスパートアドバイザの準備完了メッセージ

Print関数を使用して、エキスパートアドバイザーの準備が完了したことをエキスパートログに出力しています。これにより、初期化処理が正常に完了したことを確認できます。

サンプルコード解説3:OnChartEvent関数その1

以下のコードは、OnChartEvent関数の一部を示しており、チャート上で発生するイベントを処理するために使用されます。この関数は、チャートで特定のイベントが発生したときに自動的に呼び出されます。

//+------------------------------------------------------------------+
//| ChartEvent 関数                                                   |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                const long &lparam,
                const double &dparam,
                const string &sparam)
{
    //--- 関数の名称、呼び出し時間とイベント識別子を表示する
    Print(__FUNCTION__,TimeCurrent(),"   id=",id,"   mode=",mode);

OnChartEvent関数の引数詳細

id

idは、発生したイベントの種類を識別するための識別子です。事前に定義された列挙型によってイベントの種類が決まります。以下に代表的なイベントの識別子を示します。

これらの識別子により、どの種類のイベントが発生したのかを判別することができます。

lparam

lparamは、イベントに関連する追加の情報を含む長整数型の引数です。特定のイベントに対して、その詳細情報が格納されます。例えば、マウスクリックイベントの場合、マウスのX座標やY座標が含まれます。

dparam

dparamは、イベントに関連する追加の情報を含む倍精度浮動小数点数型の引数です。この引数も特定のイベントに対して、その詳細情報を提供します。例えば、チャートのズームイベントの場合、ズームの倍率が含まれます。

sparam

sparamは、イベントに関連する追加の情報を含む文字列型の引数です。この引数は、特に文字列情報を必要とするイベントに使用されます。例えば、テキスト入力イベントの場合、入力された文字列が含まれます。

関数の名称、呼び出し時間とイベント識別子の表示

Print関数を使用して、関数の名称、現在の時刻、イベント識別子、およびモード変数の値をエキスパートログに出力しています。

  • __FUNCTION__は、現在の関数の名前を返すマクロ(プログラム内で定義された定数やコードの再利用のための短縮表現)です。
  • TimeCurrent関数は、現在のサーバー時刻を返します。
  • idは、発生したイベントの種類を示します。
  • modeは、チャートのスクロール方向を示す変数です。この変数は、スクロールの方向が左か右かを示します。

このようにして、エキスパートログに必要な情報を出力することで、イベントの発生状況や関数の動作を確認することができます。

サンプルコード解説4:OnChartEvent関数その2

以下のコードは、OnChartEvent関数の中でチャート上のマウスクリックイベントを処理する部分を示しています。この部分では、マウスクリックが発生した際にチャートのスクリーンショットを取得するための手順が実行されます。

    if(id==CHARTEVENT_CLICK)
    {
        //--- チャートの縁から初期シフト
        int pos=0;
        //--- チャートの左縁での動作
        if(mode>0)
        {
            //--- チャートを左縁にスクロールする
            ChartNavigate(0,CHART_BEGIN,pos);
            for(int i=0;i<pictures;i++)
            {

マウスクリックイベントの処理

idのチェック

最初に、idCHARTEVENT_CLICKと等しいかどうかを確認します。CHARTEVENT_CLICKは、チャート上でマウスクリックが発生したことを示すイベント識別子です。このチェックにより、マウスクリックイベントが発生した場合にのみ、次の処理が実行されるようにしています。

チャートの初期シフト位置の設定

int pos=0により、チャートの初期シフト位置を0に設定します。これは、スクリーンショットを取得する際の基準位置となります。

チャートの左端での動作

if(mode>0)の条件文で、mode変数が正の値である場合、つまり左端へのシフトを示す場合の処理を行います。

チャートを左端にスクロール

ChartNavigate関数を使用して、チャートを左端にスクロールさせます。この関数は、指定されたバー数だけチャートをスクロールさせるために使用されます。

  • 第1引数にチャート識別子(ここでは0、現在のチャートを意味します)を指定します。
  • 第2引数CHART_BEGINを指定し、チャートを左端にスクロールします。
  • 第3引数posを指定し、初期シフト位置を設定します。

ループ処理によるスクリーンショットの取得

forループを使用して、指定された枚数(pictures変数で指定)のスクリーンショットを順次取得します。このループ内で、各スクリーンショットの位置とファイル名を設定し、チャートの異なる部分のスクリーンショットを取得する処理を行います。

このようにして、マウスクリックイベントが発生したときに、チャートの左端からスクリーンショットを取得し、保存する手順が実行されます。

サンプルコード解説5:OnChartEvent関数その3

以下のコードは、OnChartEvent関数の中でマウスクリックイベントが発生した際に実行される処理の続きです。この部分では、スクリーンショットを取得して保存する手順を詳細に示しています。

//--- チャートに表示するテキスト及びファイル名を準備する
string name="ChartScreenShot"+"CHART_BEGIN"+string(pos)+".gif";
//--- チャート名をコメントとして表示する
Comment(name);
//--- terminal_directory\MQL5\Files\ にチャートのスクリーンショットファイルを保存する
if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_LEFT))
    Print("スクリーンショットを保存しました: ",name);
//---
pos+=bars_shift;
//--- ユーザにチャートの新しい部分を見る時間を与える
Sleep(3000);
//--- 現在位置 bars_shift バーからチャートを右にスクロールする
ChartNavigate(0,CHART_CURRENT_POS,bars_shift);
}
//--- モードを反対に変更する
mode*=-1;
}

スクリーンショットのファイル名を準備する

string name=”ChartScreenShot“+”CHART_BEGIN“+string(pos)+”.gif”;では、スクリーンショットのファイル名を生成しています。ファイル名には、ChartScreenShotというプレフィックス(前につける記号)に加え、CHART_BEGINという文字列と現在の位置を示すposの値を連結し、最後に.gifという拡張子を付けています。これにより、一意(1つしか存在しない)のファイル名が生成されます。

ファイル名をチャートにコメントとして表示する

Comment(name);では、生成したファイル名をチャート上にコメントとして表示しています。これにより、ユーザーが現在のスクリーンショットのファイル名を確認することができます。

スクリーンショットの保存

if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_LEFT))では、ChartScreenShot関数を使用してスクリーンショットを取得し、指定したファイル名で保存します。この関数引数には、チャート識別子、ファイル名、幅、高さ、および整列モードを指定しています。

  • チャート識別子には現在のチャートを意味する0を指定します。
  • ファイル名には先ほど生成したnameを指定します。
  • 幅と高さにはそれぞれWIDTHHEIGHTを指定します。
  • 整列モードにはALIGN_LEFTを指定し、スクリーンショットがチャートの左端に揃えられるようにします。

スクリーンショットの保存が成功した場合、Print関数を使用してエキスパートログに保存されたファイル名を出力します。

チャート位置の更新

pos+=bars_shift;では、次のスクリーンショットの位置を設定するためにposを更新しています。bars_shiftの値だけ位置を移動します。

ユーザーに時間を与える

Sleep(3000);では、次の操作まで3秒間待機します。これにより、ユーザーがチャートの新しい部分を確認するための時間が与えられます。

チャートのスクロール

ChartNavigate(0,CHART_CURRENT_POS,bars_shift);では、ChartNavigate関数を使用してチャートを右にスクロールします。これにより、次のスクリーンショットの位置が表示されるようになります。

モードの反転

mode*=-1;では、mode変数の値を反転させています。これにより、次回のクリックイベントでチャートのスクロール方向が逆になります。

サンプルコード解説6:OnChartEvent関数その4

以下のコードは、OnChartEvent関数の中でチャートの右端での操作を処理する部分です。この部分では、マウスクリックイベントが発生した際にチャートの右端からスクリーンショットを取得する手順が実行されます。

 else // チャートの右縁での動作
        {
            //--- チャートを右縁にスクロールする
            ChartNavigate(0,CHART_END,pos);
            for(int i=0;i<pictures;i++)
            {
                //--- チャートに表示するテキスト及びファイル名を準備する
                string name="ChartScreenShot"+"CHART_END"+string(pos)+".gif";
                //--- チャート名をコメントとして表示する
                Comment(name);
                //--- terminal_directory\MQL5\Files\ にチャートのスクリーンショットファイルを保存する
                if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_RIGHT))
                    Print("スクリーンショットを保存しました: ",name);
                //---
                pos+=bars_shift;
                //--- ユーザにチャートの新しい部分を見る時間を与える
                Sleep(3000);
                //--- 現在位置 bars_shift バーからチャートを右にスクロールする
                ChartNavigate(0,CHART_CURRENT_POS,-bars_shift);
            }
            //--- モードを反対に変更する
            mode*=-1;
        }
    } // CHARTEVENT_CLICK イベント処理の終了
} // OnChartEvent() ハンドラの終わり

チャートの右縁での動作

チャートを右縁にスクロールする

ChartNavigate関数を使用して、チャートを右端にスクロールさせます。この関数の第2引数にCHART_ENDを指定し、チャートの右端までスクロールさせます。これにより、右端からスクリーンショットを取得する準備が整います。

スクリーンショットのループ処理

forループを使用して、指定された枚数(pictures変数で指定)のスクリーンショットを順次取得します。このループ内で、各スクリーンショットの位置とファイル名を設定し、チャートの異なる部分のスクリーンショットを取得します。

ファイル名の準備と表示

string name=”ChartScreenShot“+”CHART_END”+string(pos)+”.gif”;では、スクリーンショットのファイル名を生成しています。ファイル名には、ChartScreenShotというプレフィックス(前につける記号)に加え、CHART_ENDという文字列と現在の位置を示すposの値を連結し、最後に.gifという拡張子を付けています。これにより、一意のファイル名が生成されます。

Comment(name);では、生成したファイル名をチャート上にコメントとして表示しています。これにより、ユーザーが現在のスクリーンショットのファイル名を確認することができます。

スクリーンショットの保存

if(ChartScreenShot(0,name,WIDTH,HEIGHT,ALIGN_RIGHT))では、ChartScreenShot関数を使用してスクリーンショットを取得し、指定したファイル名で保存します。この関数引数には、チャート識別子、ファイル名、幅、高さ、および整列モードを指定しています。

  • チャート識別子には現在のチャートを意味する0を指定します。
  • ファイル名には先ほど生成したnameを指定します。
  • 幅と高さにはそれぞれWIDTHとHEIGHTを指定します。
  • 整列モードにはALIGN_RIGHTを指定し、スクリーンショットがチャートの右端に揃えられるようにします。

スクリーンショットの保存が成功した場合、Print関数を使用してエキスパートログに保存されたファイル名を出力します。

チャート位置の更新

pos+=bars_shift;では、次のスクリーンショットの位置を設定するためにposを更新しています。bars_shiftの値だけ位置を移動します。

ユーザーに時間を与える

Sleep(3000);では、次の操作まで3秒間待機します。これにより、ユーザーがチャートの新しい部分を確認するための時間が与えられます。

チャートのスクロール

ChartNavigate(0,CHART_CURRENT_POS,-bars_shift);では、ChartNavigate関数を使用してチャートを左にスクロールします。これにより、次のスクリーンショットの位置が表示されるようになります。

モードの反転

mode*=-1;では、mode変数の値を反転させています。これにより、次回のクリックイベントでチャートのスクロール方向が逆になります。

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