恥は/dev/nullへ by 初心者

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

MTF分析用のチャートを開くスクリプト

MT4でMTF分析(マルチタイムフレーム分析)をする時、以下の5チャートを開いてから「ウィンドウの整列」ボタンを押して並び変えるのですが、これが手間なのでスクリプトで行うことにしました。

・5分足チャート  
・15分足チャート  
・1時間足チャート  
・4時間足チャート  
・日足チャート  


やりたいこと

いま開いているチャートのうち1つをアクティブにして、そのチャートの通貨ペアを「分析したい通貨ペア」に変更します。
その上でスクリプトを実行すると、

・先述した5つの時間軸のチャートが開かれる  
・5つのチャートに普段自分が使っているテンプレートが適用される  
・5つのチャートが並び変えられる(ウィンドウの整列ボタンの代わり)  

という風にしたいと思います。

コード(スクリプト

早速コードを書いてみました。

#import "user32.dll"
   void keybd_event(int bVk,int bScan,int dwFlags,int dwExtraInfo);
#import

#define KEY_R 'R'
#define KEY_ALT 0x12
#define KEYEVENTF_KEYUP 0x0002

#property copyright "Copyright 2021, PHILOJUAN"
#property version   "1.00"
#property strict
// #property script_show_inputs  // スクリプトを実行する前にパラメーターを変更する場合はこの行を有効にする

input ENUM_TIMEFRAMES period_1 = PERIOD_M5;  // 1番ウィンドウの時間軸
input ENUM_TIMEFRAMES period_2 = PERIOD_M15; // 2番ウィンドウの時間軸
input ENUM_TIMEFRAMES period_3 = PERIOD_H1;  // 3番ウィンドウの時間軸
input ENUM_TIMEFRAMES period_4 = PERIOD_H4;  // 4番ウィンドウの時間軸
input ENUM_TIMEFRAMES period_5 = PERIOD_D1;  // 5番ウィンドウの時間軸

string tpl = "uhoho.tpl";    // ← チャートに適用したいテンプレートファイル名を記述

void OnStart()
{
    string cur_symbol = Symbol();  // 現在チャートのシンボルを取得

    //-------------------------------------------
    // 全てのチャートを閉じる
    //-------------------------------------------
    long next_chart = ChartFirst();
    ChartClose(next_chart);

    while(next_chart != -1) {
        next_chart = ChartNext(next_chart);
        ChartClose(next_chart);
    }

    //-------------------------------------------
    // パラメーターで指定した時間軸を配列に格納
    //-------------------------------------------
    ENUM_TIMEFRAMES periods[5];

    periods[0] = period_1;
    periods[1] = period_2;
    periods[2] = period_3;
    periods[3] = period_4;
    periods[4] = period_5;

    long charts[5];                // チャートIDを格納するための配列
    ArrayInitialize(charts, 0);    // 配列の初期化

    // 5つのチャートを開き、チャートIDをcharts[]配列に代入
    for(int i = 0; i < 5; i++)
        charts[i] = ChartOpen(cur_symbol, periods[0]);

    ArraySort(charts);            // 配列の中身を昇順に並び替え

    // 5つのチャートに対し、チャートIDの順番通りに時間軸とテンプレートを適用
    for(int j = 0, k = 4; k >= 0; k--) {
        ChartSetSymbolPeriod(charts[j], cur_symbol, periods[k]);
        ChartApplyTemplate(charts[j], tpl);
        j++;
    }

    // [失敗コード]
    // 以下は最初に書いたコード。ダメな例として。
    //
    //    long cur_chart = ChartID();
    //    string cur_symbol = Symbol();
    //
    //    ChartSetSymbolPeriod(cur_chart, cur_symbol, periods[0]);
    //    ChartApplyTemplate(cur_chart, tpl);
    //    
    //    for(int i = 1; i < 5; i++) {
    //        long chartID = ChartOpen(cur_symbol, periods[i]);
    //        ChartApplyTemplate(chartID, tpl);
    //    }

    SendVirtualKey(KEY_ALT, KEY_R); // ALT+R ウインドウを整列する
}

//--------------------------------------------------------------------
// キー入力を送信する関数(今回は ALT + R をMT4に送信するために使用)
//--------------------------------------------------------------------
void SendVirtualKey(int metakey, int keycode)
{
    keybd_event(metakey, 0, 0, 0);
    keybd_event(keycode, 0, 0, 0);
    keybd_event(metakey, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(keycode, 0, KEYEVENTF_KEYUP, 0);
}