恥は/dev/nullへ by 初心者

プログラミング素人がのろのろと学んだことをつづっています♪

MT4でチャート画面のスクリーンショットを撮る

この記事では、チャート画面のスクリーンショットを撮る自作関数のコードにコメントを書き加えたものを掲載しています。

なお、スクリーンショットは、自分のトレードを振り返る時に使っています。

 

3つの引数

第1引数と第2引数は、スクリーンショット画像のサイズが小さい場合に、画像の縦幅と横幅を増やすためのものです。

第3引数は撮影位置の指定です。自分の場合、ポジションを持った場面や決済した場面を記録するために現在足のあたり(画面の右端)を撮影するので「0」を指定しています。(備考)それよりも過去を撮影する場合は「2」を指定します。

「0」は「ALIGN_RIGHT」なので、チャート画面の右端を撮影
「2」は「ALIGN_CENTER」なので、チャート画面の中央を撮影

 

使用例

スクリプトとして使用する場合は以下のようになります。

void OnStart()
{
    GetScreenShot();
}

この場合、3つの引数は全てデフォルト値(10, 35, 0)となります。

第3引数が「0」なのでチャートの右端を撮影。

 

チャートの右端ではなく過去を撮影したい場合は以下のとおりです。

void OnStart()
{
    GetScreenShot(10, 35, 2);
}

 

もしもスクリプトを実行するたびに第3引数を変更したいのであれば、パラメーターを指定できるようにスクリプトを少し変更します。

#property strict
#property script_show_inputs

input ENUM_ALIGN_MODE pos = ALIGN_CENTER; // 撮影位置(ALIGN)

void OnStart()
{
    GetScreenShot(10, 35, pos);
}

 

保存先

スクリーンショット画像は「MQL4 → Files」フォルダに出力されます。

 

コード

//----------------------------------------------------------------------------------------
// スクリーンショット撮影関数
//----------------------------------------------------------------------------------------
bool GetScreenShot(int addWidth   = 10,   // 追加する幅
                   int addHeight  = 35,   // 追加する高さ
                   int align      = 0     // 撮影位置のALIGN設定
                  )
{
    int picWidth  = 0;  // スクリーンショットの幅
    int picHeight = 0;  // スクリーンショットの高さ
    int subHeight = 0;  // サブウィンドウの高さ
    string fName  = ""; // 出力ファイル名を格納する変数
    datetime svTime = TimeCurrent(); // サーバー時刻

    // 出力するファイル名
    //   [例] sv_2020_0615_2207_11s_EURGBP.png
    fName =  "sv_" + IntegerToString(TimeYear(svTime)) + "_" + IntegerToString(TimeMonth(svTime), 2, '0')
          + IntegerToString(TimeDay(svTime), 2, '0') + "_"
          + IntegerToString(TimeHour(svTime), 2, '0') + IntegerToString(TimeMinute(svTime), 2, '0')
          + "_" + IntegerToString(TimeSeconds(svTime), 2, '0') + "s" + "_" + Symbol() + ".png";

    // サブウィンドウの高さを調べる
    for(int i = 1; i < WindowsTotal(); i++)
    {
        subHeight += (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, i);
    }
    // ChartGetInteger関数は、指定されたチャートの対応するプロパティの値を返す
    // 引数1 チャートID、 引数2 プロパティ識別子、引数3 サブウィンドウ番号(必要に応じて)
    // 引数2 の CHART_HEIGHT_IN_PIXELS はチャートの高さ(ピクセル単位)
    //
    // iを1からスタートさせるのは、0はメインウィンドウを指すため。
    // 仮にWindowsTotal()の結果が3の場合、サブウィンドウは2つだけ(1つはメインウィンドウ)

    // スクリーンショットの幅と高さを変数に代入
    picWidth  = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS,  0) + addWidth;
    picHeight = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS, 0) + subHeight + addHeight;

    ChartRedraw(); // チャートを最新状態にする(再描画)

    // スクリーンショットの撮影
    if(ChartScreenShot(0, fName, picWidth, picHeight, align) == false)
    {
        // 撮影に失敗したらエラーメッセージを出す
        Print(__FUNCTION__, " Error ", GetLastError());
        return(false);
    }
    // ChartScreenShot関数  スクリーンショットを指定された拡張子に応じて、GIF, PNG, BMP形式で保存する
    //
    // <変数 align の中身は、ALIGN_RIGHTなど>
    //   現在足付近を撮影する場合は、ALIGN_RIGHT を使う
    //   それ以外(もっと過去)を撮影する場合は、ALIGN_CENTER を使う
    //      ALIGN_RIGHT   は 0
    //      ALIGN_LEFT    は 1
    //      ALIGN_CENTER  は 2

    PlaySound("news.wav");  // 撮影音を鳴らす

    return(true);
}