見出し画像

MT4残り時間表示インジケータ ハイローオーストラリア用

Tickイベントではなく、Timerで残り時間を表示するMT4用のインジケータを作成したのでシェアします。


どうも@ひろぽんです。

最近ハイローオーストラリアをちょくちょく触っているのですが、エントリー判断用にMT4でチャートを表示させています。


ハイローオーストラリアのチャートは横幅の長いTick足のような形です。細かく動くので、瞬間的な上下の動きも表示されます。

画像1

ですが、長い時間で環境認識するには不向きな面があります。


そこで、MT4を使いトレンドラインを引いて環境認識を行っているのですが、MT4にもハイローオーストラリアのような残り時間表示をさせたいと思い、コードを書きました。

画像2

日足だとこんな感じ、残り15時間で今日のローソク足が確定します。


コードは最後に乗せておくので、コピペしてください。無料です。


ちなみに環境認識は、トレンドラインを自動で引いてくれるインジケータを作ったので、これを使っています。良かったら使ってください。


注意事項

当noteに含まれる情報の全ては、情報提供を唯一の目的としたものであり、収益の保証、或いは、直接的に投資助言業務、投資勧誘を行うものではありません。投資方針や時期選択等の最終決定は、リスク等を熟知した上、ご自身で判断されますようお願いいたします。
当noteの利用、あるいは取引により利用者に生じたいかなる損害についても著者及び発行者はそれに対し、一切の責任を負いません。あらかじめご了承ください。
万が一、損失を被った場合でも、著者は一切の責任を負わないものとします。


残り時間を表すインジは既にあるのでは???


その通りです。

すでに出回っています。『残り時間 MT4 インジケータ』とかで検索すればすぐに見つかります。


でも、このインジケータって結構クセモノなんですよ。



既存のインジケータはtickで動く


すでに出回っている残り時間表示のインジケータって、Tickが更新されるときに再計算されて表示されるんですよ。

つまり、108.51、108.52、108.50みたいに値が動けば計算するみたいな。


EAだったらOnTick関数とか、インジケーターだったらstart関数とかOnCalculate関数とかがそれで、Tick情報が流れてきて初めて動くんですよ。


勘の良い人はもう気付きましたよね?


そうです。Tick情報が流れてこなきゃ動かないんですよ。


ロンドンやNY時間ならまだしも、それ以外の閑散とした時間帯って数秒間同じ値で動かないことなんて、しょっちゅうあるじゃないですか。

そんな時、既存の時間表示って、残り3分10秒。。。残り2分58秒みたいな、まるでタイムワープみたいな、タイムスリップみたいな突然の時間移動が生じちゃうんですよね。


FXなら閑散としている時間帯はパスでしょうけど、ハイローオーストラリアなら閑散レンジの上下に指して(ry


OnTimer関数で1秒ごとに動く仕様で作成


MT4って弄れば弄るほど面白い発見があるもので、OnTimer関数なるものがあるんですね。

OnTimer関数で、処理内容を記載し、EventSetTimerで何秒ごとに実行するかを決めます。

bool  EventSetTimer(
  int  seconds      // 時間(分解能:1sec)
  );

MT4でEA自作しちゃおさんを参考にさせていただきました。ありがとうございます。毎日、画面に穴空くまで読んでます。


OnTimerで動く残り時間表示インジケータのコード


昨日、一昨日と10000文字以上書いてきたので、今日は2000文字くらいで手抜きです。早速コードです。

お急ぎならコピペして、あとの文章読まなくても大丈夫です。ここまで読んでくださり、ありがとうございます。


#property strict
#property indicator_chart_window

enum kado{
  LU = 0,     // 左上
  RU = 1,     // 右上
  LL = 2,     // 左下
  RL = 3      // 右下
};

input kado ichi = RU;    // 表示位置設定

extern int FontSize = 20;
extern color FontColor = clrYellow;


int OnInit()
{
  ObjectCreate("Timer", OBJ_LABEL, 0, 0, 0);
  ObjectSet("Timer", OBJPROP_XDISTANCE, 25);
  ObjectSet("Timer", OBJPROP_YDISTANCE, 25);
  ObjectSet("Timer", OBJPROP_CORNER, ichi);
  ObjectSet("Timer",OBJPROP_COLOR,FontColor);
  EventSetTimer(1);
  return(0);
}

int deinit()
 {
	ObjectDelete("Timer");
  return(0);
 }

void OnTimer()
{
  string MM,SS,OBJ;

  int ServerTime = TimeCurrent();
  int now = Time[0];
  int NokoriSec = now + Period()*60 - ServerTime;

  int H = NokoriSec/3600;
  int M = (NokoriSec/60)%60;
  int S = NokoriSec - M*60 - H*3600;
  if(M<10)
  {
     MM = "0" + M;
  }
  else
  {
     MM = (string)M;
  }
  if(S<10)
  {
     SS = "0" + S;
  }
  else
  {
     SS = (string)S;
  }
  
  if(Period()<=60)
  {
     OBJ = MM + ":" + SS;
  }
  else
  {
     OBJ = H +":"+ MM + ":" + SS;
  }


	ObjectSetText("Timer", OBJ, FontSize);


}

int start()
{
  return(0);
}


コードの内容説明


ここからは、MT4を僕のように勉強している人の参考用です。間違ってたり、もっといい書き方があるなら教えていただけると助かります。


#property strict
#property indicator_chart_window

おまじない構文。無くても動きます。クセみたいなもの。


enum kado{
  LU = 0,     // 左上
  RU = 1,     // 右上
  LL = 2,     // 左下
  RL = 3      // 右下
};
 
input kado ichi = RU;    // 表示位置設定

列挙型でkadoで構造体作成。変数 = 引数 //表示名 みたいな感じ。

画像3

こんな感じで、選択型のリストが作れる。

細かく位置を調整したりするより、どの角に表示させるかだけで良いと思ったので、角選択をichiって変数に代入する仕組み。


extern int FontSize = 20;
extern color FontColor = clrYellow;

外部変数で、文字の大きさと文字色を選択可能。


int OnInit()
{
  ObjectCreate("Timer", OBJ_LABEL, 0, 0, 0);
  ObjectSet("Timer", OBJPROP_XDISTANCE, 25);
  ObjectSet("Timer", OBJPROP_YDISTANCE, 25);
  ObjectSet("Timer", OBJPROP_CORNER, ichi);
  ObjectSet("Timer",OBJPROP_COLOR,FontColor);
  EventSetTimer(1);
  return(0);
}

OnInitは初期化関数。起動した最初にだけ動く。オブジェクトの細かな設定とか、Ontickとかstart内で毎回読み込ませずに、OnInitで最初に読み込ませるだけにするのが、スマートなオトナの男のたしなみらしいです。


で、EventSetTimer(1)で1秒ごとに動くように設定。10なら10秒ごとになります。

int deinit()
 {
	ObjectDelete("Timer");
  return(0);
 }

インジケータ消したら時間表示は消えます。これ忘れて書いてなかったら、インジケータ消しても時間表示そのまま残ります。


void OnTimer()
{
    ・・・
}

OnTimer関数は戻り値なし。ここに、EventSetTimerで設定した秒ごとに行う処理を書いていきます。


  string MM1,MM2,SS,OBJ;

  int ServerTime = TimeCurrent();
  int now = Time[0];
  int NokoriSec = now + Period()*60 - ServerTime;

  int H = NokoriSec/3600;
  int M = (NokoriSec/60)%60;
  int S = NokoriSec - M*60 - H*3600;

stringで文字列入れる変数を作っとく。

TimeCurrent()は、サーバーの時間です。日本にサーバーがあるなら日本の時間ですが、XMとか海外のサーバーの場合、現地の時間です。

intで整数表示できます。UnixTime変換でしたっけ?

例)2020-01-03 16:13:02 ⇒ 1578035582

Time[0]は、直近ローソク足の開始時間。これもintで整数化。

どちらも秒表示です。


Period()は、チャートが何分足を表示しているか。15分足ならPeriod()は15。4時間足ならPeriod()は240が勝手に入ってきます。

NokoriSecで、そのローソク足の残り秒数を計算しています。

Hが時間、Mが分、Sが秒です。


  if(M<10)
  {
     MM = "0" + M;
  }
  else
  {
     MM = (string)M;
  }
  if(S<10)
  {
     SS = "0" + S;
  }
  else
  {
     SS = (string)S;
  }

そのまま、オブジェクトにして貼り付けても良かったのですが、気持ち悪かったので、これ付けました。

残り8分6秒って

0:8:6 だったら気持ち悪いですよね
 
だから、0:08:06 ってなるように上記のコード付けてます。



  if(Period()<=60)
  {
     OBJ = MM + ":" + SS;
  }
  else
  {
     OBJ = H +":"+ MM + ":" + SS;
  }


	ObjectSetText("Timer", OBJ, FontSize);

1時間足以上の時だけ、残り時間表示付けてます。それ以外は分まで。

最後、ObjectSetTextで作ったOBJを放り込んでます。


int start()
{
  return(0);
}

何の意味もないですが、これ書かないとEditerが怒るので書いてます。


以上です。質問等は@ひろぽんまで。


本日も読んでいただき、ありがとうございます。

次はこれ読んでください。






この記事が気に入ったらサポートをしてみませんか?