【MT4】ローソク足の確定までの残り時間を1秒毎に表示するインジケータの作り方
今回はローソク足の確定までの時間を表示するインジケータの作り方を書いていきます。
残り時間を表示するインジケータは無料であると思いますが、
tickが動いた時に更新するようになっていて、
30秒⇒29秒⇒28秒⇒25秒⇒22秒・・・
って動きますよね。
これだと、あと何秒が正確にわからない(T_T)
しかも、1分足でトレードしてる方にとっては、
「残り0時間0分20秒」
の時間の分のところはずっと0で不要ですよね
更に「残り〇秒」になった時に気が付きたい!
この辺りを自分で好きなようにカスタイズできるインジケータにしていきたいと思います。
残り時間の計算方法
int iAllS, iSec, iMinute, iHour;
//秒数
iAllS = Time[0] + Period()*60 - TimeCurrent();
//残りの秒数
iSec = iAllS%60;
//Time[0]とのずれ処理
if (iSec < 0) iSec = 0;
//分計算
iMinute = (iAllS - iAllS%60) / 60;
//時間計算
if (iMinute >= 60) {
iHour = iMinute/60;
} else {
iHour = 0;
}
//分計算
iMinute = iMinute - (iHour*60);
はい、いきなりコードから^^;
残り時間を計算する処理は既にネット上に沢山あるので、
このまま使うと思ってもらえたら^^;
Time[0]とTimeCurrent()を使って計算するのですが、
Time[0]の値が変わらない時があってマイナスになる時があるので、
そこを矯正してます
//Time[0]とのずれ処理
if (iSec < 0) iSec = 0;
この部分ですね。
1秒ごとに確実にカウントダウンさせる方法
今回のメインとなる部分ですね!
通常は、OnCalculate()の中に処理を書いていく事が多いと思います。
しかしこの関数はTickが動いた時にしか動作しないんですね。
そこで、EventSetTimer()を使います!!
EventSetTimer関数は指定した間隔で処理を行ってくれます。
EventSetTimer(1) とすれば、1秒ごとに処理を行ってくれます
この関数を使っていきます。
int OnInit()
{
//--- indicator buffers mapping
//一秒毎に動かす
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
void OnTimer()
{
//1秒ごとに行いたい処理を書く
}
void OnTimer(){}
EventSetTimerをセットすると、OnTime()関数が指定した秒数毎に実行されます。
ここに残り時間を表示する処理を書くことで、秒を抜かさずに1秒ごとにカウントダウンするインジケータが出来上がります!
表示位置も自由にしたい
残り時間を表示する場所ですが、チャートの使い方は人によって様々ですよね。ですので、自分で好きな場所に表示させたいですよね!
enum eCORNER{
eLU = 0, // 左上
eRU = 1, // 右上
eLL = 2, // 左下
eRL = 3 // 右下
};
extern eCORNER IN_CORNER = eRU; // 表示位置設定
extern int IN_PositonX = 20; //表示位置X
extern int IN_PositonY = 20; //表示位置Y
extern int IN_FontSize = 10; //フォントサイズ
extern color IN_FontColor = clrYellow; //フォントカラー
int OnInit()
{
//--- indicator buffers mapping
ObjectCreate(sObjName, OBJ_LABEL, 0, 0, 0);
ObjectSet(sObjName, OBJPROP_XDISTANCE, IN_PositonX);
ObjectSet(sObjName, OBJPROP_YDISTANCE, IN_PositonY);
ObjectSet(sObjName, OBJPROP_CORNER, IN_CORNER);
ObjectSet(sObjName,OBJPROP_COLOR,IN_FontColor);
ObjectSetString(0, sObjName, OBJPROP_FONT, "MS ゴシック");
//一秒毎に動かす
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
表示位置(左上、右上、左下、右下)を選べるようにして、
さらにX,Yの位置調整。ついでに、フォントサイズ、フォントカラーまで設定出来るようにしましょう!
表示する内容も調整したい!
「残り0時間0分20秒」
この表示1分足トレーダーにとっては、邪魔になるんですよね。。。
って事で、この表示もカスタイズ出来るようにします!
//宣言部
extern bool IN_Hour = true; //時間表示
extern bool IN_Minute = true; //分表示
//残り時間計算してる個所
string sOutText;
sOutText = "残";
if (IN_Hour == true) {
sOutText = sOutText + IntegerToString(iHour) + "時間";
}
if (IN_Minute == true) {
sOutText = sOutText + IntegerToString(iMinute) + "分";
}
sOutText = sOutText + IntegerToString(iSec) + "秒";
表示するかしないかのフラグを作りました!
これで好きなように表示できますね!
こんな感じですね。どうですか?必要な情報だけってよくないですか?
残り〇秒になったら気づけるようにしたい!
足の切り替わりでエントリーしてる方も多いのではないでしょうか?
「後〇秒」で気が付きたいって要望があったのでこの機能も実装しようと思います
残り〇秒になったら、フォントを赤く大きくして気が付くようにしようと思います
//宣言部
extern int IN_LastTime = 10; //残り〇秒で表示変更
extern color IN_LastFontColor = clrRed; //残り〇秒フォントカラー
extern int IN_LastFontSize = 20; //残り〇秒フォントサイズ
//フォント表示部分
int iFontSize = IN_FontSize;
color iColor = IN_FontColor;
//残り〇秒処理
if (iHour == 0 && iMinute == 0 && iSec <= IN_LastTime) {
iFontSize = IN_LastFontSize;
iColor = IN_LastFontColor;
}
//表示
ObjectSetText(sObjName, sOutText, iFontSize);
ObjectSet(sObjName,OBJPROP_COLOR,iColor);
処理自体は簡単ですね!
残り〇秒ってなったら、指定のフォントカラー、サイズをセットするようにしてみました。
まとめ
今回は1秒ごとに確実にカウントダウン表示する方法として
EventSetTimer関数を使う方法をご紹介しました。
表示位置、フォントサイズ、フォントカラーを自由に設定出来たり、
残り〇秒になった時にフォントサイズ、カラーを変更する機能をつけてみました。
コピペするだけでOKの状態の全ソースコードは有料エリアにありますので、
よろしくお願い致します。
ソースコードなんてよくわからい!インジケータが欲しいってかたコチラ↓
この記事が気に入ったらサポートをしてみませんか?