MQL4プログラミング 第9回 バックグラウンドの色を変える
前回の勝率表示のプログラムはバッチリ使う事ができましたか?ソースコードだけ見て納得するよりも実際にコンパイル&実行して、なおかつご自身でいろんなアイデアを加えてみると理解も深まると思います。
バックグラウンドの色を変える
今回公開するプログラムのテーマは「バックグラウンドの色を変える」です。この機能を使う想定としては
・サインツールでサインが出た通貨ペアのチャートを色で知らせる。これなら小さなアラートポップアップ画面を見てどのペアかを探す必要がなくなります。
・裁量エントリーしていて、もうすぐエントリー条件に達する状況である通貨ペアのチャートに対して注目すべきチャートであるとの印をつけたい場合があります。この場合は私は何か1つキーボート上のキーを決めておいて、そのキーを押したら該当チャートのバックグラウンド色を変えるようにしています。注目すべき通貨ペアですよ、との意味を持たせています。印をつけ終わったら他の通貨ペアチャートに切り替えて監視続行です。
全通貨ペアを一覧表示にするとこんな感じです。
今回はサインツールでサインが出たらバックグラウンド色を変えるプログラムを公開します。
// prg-0009.mq4
#property copyright "Copyright 2024, smile-invest-blog.com"
#property link "https://www.smile-invest-blog.com/prg-0009/"
#property strict
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Yellow
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2
double Log1Up[]; // Highサイン用バッファ
double Log1Down[]; // Low サイン用バッファ
int realBars = 0;
int shortMaPeriod = 10; // 短期移動平均線の期間
int longMaPeriod = 30; // 長期移動平均線の期間
int adxPeriod = 14; // ADXの期間
color upColor = C'2,90,98';
color downColor = C'57,14,71';
color lookColor = C'73,77,2';
color normalColor;
//+------------------------------------------------------------------+
//| initialization function
//+------------------------------------------------------------------+
int init() {
//---- indicators
SetIndexStyle(0, DRAW_ARROW, EMPTY);
SetIndexArrow(0, 233);
SetIndexBuffer(0, Log1Up);
SetIndexStyle(1, DRAW_ARROW, EMPTY);
SetIndexArrow(1, 234);
SetIndexBuffer(1, Log1Down);
normalColor = getChartBackColor();
//----
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| deinitialization function
//+------------------------------------------------------------------+
int deinit() {
getChartBackColor(normalColor);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| start function
//+------------------------------------------------------------------+
int start() {
bool ret_hantei; // hantei関数の結果格納用
int counted_bars=IndicatorCounted();
int limit = Bars - counted_bars;
for(int i = limit - 1; i >= 0; i--) {
if(i == 0) {
Log1Down[i] = EMPTY_VALUE;
Log1Up[i] = EMPTY_VALUE;
ret_hantei = hantei(i); // 上下サイン表示の判定を関数化した
if (ret_hantei == true) { // hantei関数の結果がtrueの時
if (realBars < Bars) { // 1本のローソク足で1回だけ実行するための条件
realBars = Bars; // realBarsをBarsにする事で同じローソク足では1回だけ実行する
if (Log1Up[i] != EMPTY_VALUE) { // hantei関数内で上サイン表示と判定された
Alert(Symbol(), " *** High ***");
setChartBackColor(upColor);
}
else if (Log1Down[i] != EMPTY_VALUE) { // hantei関数内で下サイン表示と判定された
Alert(Symbol(), " *** Low ***");
setChartBackColor(downColor);
}
}
}
if (TaskPeriod()) {
if (Log1Down[i] == EMPTY_VALUE && Log1Up[i] == EMPTY_VALUE) {
setChartBackColor(normalColor);
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| エントリーの条件判定関数
//| int i メイン関数からのiの値
//+------------------------------------------------------------------+
bool hantei(int i) {
double shortMaPrevious, longMaPrevious;
double shortMaCurrent, longMaCurrent;
// 前回の移動平均値を取得
shortMaPrevious = iMA(NULL, 0, shortMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i+1);
longMaPrevious = iMA(NULL, 0, longMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i+1);
// 現在の移動平均値を取得
shortMaCurrent = iMA(NULL, 0, shortMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
longMaCurrent = iMA(NULL, 0, longMaPeriod, 0, MODE_SMA, PRICE_CLOSE, i);
if (shortMaPrevious < longMaPrevious && shortMaCurrent > longMaCurrent) {
// 移動平均線のクロスを確認 → ゴールデンクロス
Log1Up[i] = Low[i] - 10 * Point;
return true;
}
else if (shortMaPrevious > longMaPrevious && shortMaCurrent < longMaCurrent) {
// 移動平均線のクロスを確認 → デッドクロス
Log1Down[i] = High[i] + 10 * Point;
return true;
}
return false;
}
//+------------------------------------------------------------------+
//| ローソク足確定時の処理
//+------------------------------------------------------------------+
bool TaskPeriod() {
static datetime s_lasttime; // 最後に記録した時間軸時間
// staticはこの関数が終了してもデータは保持される
datetime temptime = iTime(Symbol(), Period() ,0); // 現在の時間軸の時間取得
if (temptime == s_lasttime) { // 時間に変化が無い場合
return false; // 処理終了
}
s_lasttime = temptime; // 最後に記録した時間軸時間を保存
// ----- 処理はこれ以降に追加 -----------
return true; // 移動平均線のクロス判定
}
//+------------------------------------------------------------------+
//| チャートの背景色を取得する
//| 引数1 チャートID(指定なしの場合は0つまり現在のチャート)
//+------------------------------------------------------------------+
color getChartBackColor(const long chart_ID=0) {
//--- 色を受け取る変数を準備する
long result = clrNONE;
//--- エラー値をリセットする
ResetLastError();
//--- チャートの背景色を受け取る
if(!ChartGetInteger(chart_ID, CHART_COLOR_BACKGROUND, 0, result)) {
//--- エキスパート操作ログにエラーメッセージを表示する
Print(__FUNCTION__+", Error Code = ", GetLastError());
}
//--- チャートのプロパティの値を返します
return((color)result);
}
//+------------------------------------------------------------------+
//| チャートの背景色を設定する
//| 引数1 背景色のcolor値
//| 引数2 チャートID(指定なしの場合は0つまり現在のチャート)
//+------------------------------------------------------------------+
bool setChartBackColor(const color clr, const long chart_ID=0) {
//--- エラー値をリセットする
ResetLastError();
//--- チャートの背景色を設定する
if(!ChartSetInteger(chart_ID, CHART_COLOR_BACKGROUND, clr)) {
//--- エキスパート操作ログにエラーメッセージを表示する
Print(__FUNCTION__+", Error Code = ", GetLastError());
return(false);
}
//--- 実行成功
return(true);
}
まずは今回追加した関数について
141行目:getChartBackColor関数で「result = clrNONE;」はこの関数の戻り値resultを初期化しています。
「ResetLastError();」でエラー状態をリセットします。
147行目:ChartGetInteger関数で現在のバックグラウンドカラーをresultにセットしますが、もしエラーとなればエキスパート操作ログにエラーメッセージを表示して戻り値はclrNONE(色設定なし)を返します。
152行目:147行目のChartGetInteger関数で正常にバックグラウンドカラーがresultにセットできれば関数の呼び元に取得したresultを返します。
160行目:setChartBackColor関数で「ResetLastError();」でエラー状態をリセットします。
164行目:ChartSetInteger関数でバックグラウンドカラーを指定の色(clr)にセットします。もし失敗すればエラーメッセージを表示してfalseを返します。
170行目:ChartSetInteger関数がエラーなく処理できればtrueを返します。
20行目:「color upColor = C’2,90,98′;」これは上矢印が表示された時にセットするバックグラウンドカラーを定義しています。
21行目:「color downColor = C’57,14,71′;」これは下矢印が表示された時にセットするバックグラウンドカラーを定義しています。
22行目:「color lookColor = C’73,77,2′;」今回は使いませんが次回以降で使うバックグラウンドカラーを定義しています。
23行目:「color normalColor;」これはinit関数の37行目で元々のバックグラウンドカラーを取得して保存するための変数を定義します。
46行目:「getChartBackColor(normalColor);」deinit関数(インジケーターの終了時やローソク足の期間を変える時に実行される)で元々のバックグラウンドカラーに戻す処理です。
70行目:「setChartBackColor(upColor);」上矢印が表示される時にバックグラウンドカラーを「C’2,90,98’」に変えます。
74行目:「setChartBackColor(downColor);」下矢印が表示される時にバックグラウンドカラーを「C’57,14,71’」に変えます。
80行目:「setChartBackColor(normalColor);」次足に移った時にバックグラウンドカラーをnormalColorに変えます。
ちなみにそれぞれの色設定を変えたい場合は下図のように
「F8(キーボードのファンクションキー)」を押して
①背景色の右の部分を選択して
②カスタムボタンを押して好みの色を選んで
③の数値を順番に書き写す
画像の例で、この色を下矢印表示の時に使う場合は「color downColor = C’255,0,255′;」と変更します。
今回はちょっとした機能ですが、チャートがたくさん並んでいる画面では結構便利な機能です。今回のプログラムも是非コンパイル&実行して遊んでください。