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); }