2012年5月30日水曜日

FXのチャート分析ソフトMT4で日本時間を表示するには

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)での時刻表示は、MT4のダウンロード先にもよりますが、一般的には中央ヨーロッパ時間であることが多いようです。日本時間の9時は中央ヨーロッパ時間の1時になります。なお、中央ヨーロッパ時間が夏時間の場合には、2時になります。

中央ヨーロッパ時間の他にも、西ヨーロッパ時間、東ヨーロッパ時間などがあり、また、それぞれに夏時間があります。

以下は、日本の時間と各ヨーロッパ時間との対応表です。

日本 西ヨーロッパ 中央ヨーロッパ 東ヨーロッパ
時間 時間 夏時間 時間 夏時間 時間 夏時間
0 前15 前16 前16 前17 前17 前18
1 前16 前17 前17 前18 前18 前19
2 前17 前18 前18 前19 前19 前20
3 前18 前19 前19 前20 前20 前21
4 前19 前20 前20 前21 前21 前22
5 前20 前21 前21 前22 前22 前23
6 前21 前22 前22 前23 前23 0
7 前22 前23 前23 0 0 1
8 前23 0 0 1 1 2
9 0 1 1 2 2 3
10 1 2 2 3 3 4
11 2 3 3 4 4 5
12 3 4 4 5 5 6
13 4 5 5 6 6 7
14 5 6 6 7 7 8
15 6 7 7 8 8 9
16 7 8 8 9 9 10
17 8 9 9 10 10 11
18 9 10 10 11 11 12
19 10 11 11 12 12 13
20 11 12 12 13 13 14
21 12 13 13 14 14 15
22 13 14 14 15 15 16
23 14 15 15 16 16 17
MT4で日本時間を表示するには「JPN_Time_Sub」というインディケーターを用いることにより可能になります。「JPN_Time_Sub」は、MT4に標準でインストールされていませんので下のリストをコピーして使用してください。

ファイル名は「JPN_Time_Sub.mq4」として、MT4のインストールされているフォルダ内の「experts」フォルダ内にある「indicators」フォルダに保存します。

「JPN_Time_Sub.mq4」
//作成画面とバッファの指定
#property indicator_separate_window
#property indicator_minimum -1
#property indicator_maximum 2

//初期設定変数
extern bool Grid = false;
extern bool YEAR = false;
extern bool MONTH = true;
extern bool DAY = true;
extern bool HOUR = true;
extern bool MINUTE = true;
extern bool SECOND = false;
extern bool ARROW = false;
extern bool NewLine = false;
extern color GridColor = LightSlateGray;
extern int Time_difference = 7;
extern int FontSize = 8;
extern int TimeInterval = 12;
extern color TextColor = White;

string ObjArray[300000];
datetime JPNT,StandardTime;
//string JPND,JPNM,WinName="JPN_Time_Sub";
string JPND,JPNM,WinName=" ";
int DefPeri,DefWin,ObjTotal;

//初期化
int init(){
IndicatorShortName(" ");
if(DefPeri != Period()){
DefPeri = Period();
DeleteTimeObject();
}

return(0);
}


//終了時 時間表示を削除
int deinit(){
DeleteTimeObject();
return(0);
}


int start(){

int limit=Bars-IndicatorCounted();

for(int i=limit; i>=0; i--){
      //基準時間を超えたら作成
      if(StandardTime <= Time[i]){
         //日本時間の生成
         JPNT = Time[i] + Time_difference * 3600;
         SetTimeText(Time[i]);
 
         //次の基準時間を設定する
         datetime Period_Interval=DefPeri * 60 * TimeInterval;
         for(StandardTime = Time[i] + Period_Interval;(TimeDayOfWeek(StandardTime) == 0 || TimeDayOfWeek(StandardTime) == 6) && DefPeri < PERIOD_H1;StandardTime += Period_Interval){}
      }
   }
   return(0);
}
void SetTimeText(datetime settime){
   //日付文字列の作成
   string Y="";
   string M="";
   string D="";
 
   JPND = StringSubstr(TimeToStr(JPNT, TIME_DATE),2);
 
   if(YEAR){
      Y=StringSubstr(JPND,0,2);
   }
   if(MONTH){
      if(YEAR){
         Y=StringConcatenate(Y,".");
      }
      M=StringSubstr(JPND,3,2);
   }
   if(DAY){
      if(YEAR || MONTH){
         M=StringConcatenate(M,".");
      }
      D=StringSubstr(JPND,6,2);
   }
   JPND=StringConcatenate(Y,M,D);

   //時間文字列の作成
   string h="";
   string m="";
   string s="";
   JPNM = TimeToStr(JPNT, TIME_SECONDS);
   if(HOUR){
      h=StringSubstr(JPNM,0,2);
   }
   if(MINUTE){
      if(HOUR){
         h=StringConcatenate(h,":");
      }
      m=StringSubstr(JPNM,3,2);
   }
   if(SECOND){
      if(HOUR || MINUTE){
         m=StringConcatenate(m,":");
      }
      s=StringSubstr(JPNM,6,2);
   }
   JPNM=StringConcatenate(h,m,s);
   //同じオブジェクトが存在しなければ作成
   if(ObjectFind(StringConcatenate("JPNTS_Arrow",JPND,"_",JPNM)) == -1){
      MakeTimeObject(StringConcatenate("JPNTS_Arrow",JPND,"_",JPNM),StringConcatenate("JPNTS_Text",JPND,"_",JPNM,"_1"),StringConcatenate("JPNTS_Text",JPND,"_",JPNM,"_2"),StringConcatenate("JPNTS_GridJPN",JPND,"_",JPNM),JPND,JPNM,settime);
   }
}
void MakeTimeObject(string ArrowName,string TimeTextName1,string TimeTextName2,string GridName,string DATE,string TIME,datetime settime){
   DefWin=WindowFind(WinName);//念の為
   int Pos=2;
   //矢印の作成
   if(ARROW){
      ObjArray[ObjTotal]=ArrowName;
      ObjTotal++;
      ObjectCreate(ArrowName, OBJ_ARROW,DefWin,settime, Pos);
      Pos--;
      ObjectSet(ArrowName,OBJPROP_ARROWCODE,241);
      ObjectSet(ArrowName,OBJPROP_COLOR,TextColor);
   }
  
   if(NewLine){
      //2行で表示
      //日付の作成
      ObjArray[ObjTotal]=TimeTextName1;
      ObjTotal++;
      ObjectCreate(TimeTextName1, OBJ_TEXT,DefWin,settime, Pos);
      Pos--;
      ObjectSetText(TimeTextName1, DATE, FontSize, "Arial", TextColor);
  
      //時間の作成
      ObjArray[ObjTotal]=TimeTextName2;
      ObjTotal++;
      ObjectCreate(TimeTextName2, OBJ_TEXT,DefWin,settime, Pos);
      Pos--;
      ObjectSetText(TimeTextName2, TIME, FontSize, "Arial", TextColor);
   }else{
      //1行で表示
      ObjArray[ObjTotal]=StringConcatenate(TimeTextName1,"_",TimeTextName2);
      ObjectCreate(ObjArray[ObjTotal], OBJ_TEXT,DefWin,settime, Pos);
      Pos--;
      if(YEAR || MONTH || DAY){
         if(HOUR || MINUTE || SECOND){
            ObjectSetText(ObjArray[ObjTotal], StringConcatenate(DATE,"_",TIME), FontSize, "Arial", TextColor);
         }else{
            ObjectSetText(ObjArray[ObjTotal], DATE, FontSize, "Arial", TextColor);
         }
      }else if(HOUR || MINUTE || SECOND){
            ObjectSetText(ObjArray[ObjTotal], TIME, FontSize, "Arial", TextColor);
      }
      ObjTotal++;
   }
   //グリッドの作成
   if(Grid){
      ObjArray[ObjTotal]=GridName;
      ObjTotal++;
      ObjectCreate(GridName,OBJ_TREND, 0, settime,0,settime,WindowPriceMax(0));
      ObjectSet(GridName,OBJPROP_COLOR,GridColor);
      ObjectSet(GridName, OBJPROP_STYLE, STYLE_DOT);
   }
   ObjectsRedraw();
}
void DeleteTimeObject(){
   DefWin=WindowFind(WinName);
   //配列に格納した名前で削除  
   for(int i = 0 ; i < ObjTotal ;i++){
      if(ObjArray[i] != ""){
         ObjectDelete(ObjArray[i]);
         ObjArray[i]="";
      }
   }
  
   //メソッドからすべてのオブジェクトを取得して削除
   ObjTotal=ObjectsTotal();
   for(i=ObjTotal;i>=0;i--){
      string ObjName=ObjectName(i);
      if(StringSubstr(ObjName,0,5) == "JPNTS"){
         ObjectDelete(ObjName);
      }
   }
 
  
   ObjTotal=0;
}



ファイルを保存したら、MT4を起動します。すでにMT4を起動中の場合には、MT4を再起動します。再起動しないと「JPN_Time_Sub」が動きません。

ナビゲーターウィンドウのCustom Indicatorsに「JPN_Time_Sub」が登録されているのが確認できたら、「JPN_Time_Sub」の文字をダブルクリックします。


上のチャートに日本時間が表示されました。なお、表示の高さは自由に設定できます。

▼JPN_Time_Subのパラメータの設定方法

チャート画面を右クリックしてリストから「表示中の罫線分析ツール」を選びます。


次に、「JPN_Time_Sub」をクリックして「編集」のボタンをクリックします。


「パラメータの入力」タブをクリックすると、各種パラメータが設定できます。


各種パラメータの内容は次の通りです。

日本時間の表示に重要なパラメータは「Time_difference」です。

Grid
表示した時刻に垂線を引きます。垂線の色は、GridColorで指定できます。
YEAR
年を表示します。2012年なら「12」を表示します。
MONTH
月を表示します。
DAY
日を表示します。
HOUR
時を表示します。
MINUTE
分を表示します。
SECOND
秒を表示します。
ARROW
表示した時刻の上に矢印を表示します。
NewLine
時刻の表示を2行で表示します。
GridColor
垂線の色を指定します。
Time_difference
MT4の表示時刻と日本時間との差を指定します。各ヨーロッパ時間や夏時間などによる時間差を設定します。通常は「7」に設定されていますが、夏時間の場合には「6」に設定します。
FontSize
時刻を表示する文字の大きさを指定します。
TimeInterval
ローソク足1本分を1として、時刻を表示する間隔を指定します。
TextColor
時刻を表示する色を指定します。