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
時刻を表示する色を指定します。

FXのチャート分析ソフトMT4のローソク足の設定方法

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)では、チャートの表示形式が標準ではバーチャート(Bar Chart)に設定されています。

MT4では、バーチャート以外に、ローソク足、ラインの3つのチャートが表示できます。表示の切り替えは、画面上部にあるボタンで行います。


ローソク足を表示するには、上の図の赤い線で囲んだ3つのボタンのうち真ん中のボタンをクリックします。


標準では、上の図のようなローソク足のチャートが表示されます。

ローソク足の色や背景色などを変更するには、チャート画面を右クリックしてリストから「プロパティー」を選びます。


プロパティーの設定画面が表示されます。画面の右側に設定項目、左側にプレビュー画面が表示されます。


項目を設定することで、さまざまなパターンのチャートを表示することができます。以下はその例です。

▼陽線を白色、陰線を赤色にしたパターン


▼陽線を赤色、陰線を黒色にしたパターン


▼陽線を赤色、陰線を青色にしたパターン

FXのチャート分析ソフトMT4でよく使うテクニカル指標をまとめて表示するには

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)には、さまざまなテクニカル指標が表示できます。1つのチャート画面に複数のテクニカル指標を表示させることもできます。しかし、新しいチャート画面を開いた時は、テクニカル指標などは表示されないため、新たにテクニカル指標を表示し直さなければなりません。

ここでは、よく使うテクニカル指標をまとめて表示させる方法について解説をします。

まず、チャート画面によく使うテクニカル指標を表示します。

以下のチャートでは、チャート画面に平均足と移動平均線を表示して、サブウィンドウ(チャート画面より下の画面)にADXとAroon、そして日本時間を表示するJPN_Time_Subを追加しています。


チャート画面を右クリックしてリストから「定型チャート」を選びます。次に、「定型として保存」を選びます。


ファイル名を指定して「保存」のボタンをクリックします。ここでは、ファイル名を「adx_aroon.tpl」としています。


以降は、定型チャートから保存したファイルを読み込めば、保存したテクニカル指標をまとめて表示することができます。

FXのチャート分析ソフトMT4で1つのチャート画面に2つの通貨ペアを表示するには

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)では、1つのチャート画面に1つの通貨ペアのチャートが表示できます。

2つの通貨ペアのチャートを見比べたい時には、2つのチャート画面を横に並べて表示します。しかし、2つの通貨ペアを1つの画面に表示して比較したい場合もあります。

そのような時は、「OverLay20Chart.mq4」というインディケーターを用いることで可能になります。


上のチャートは、USD/JPYのチャートに、EUR/JPYのチャートを重ね合わせたものです。デザインを変更するには、元のチャートとOverLay20Chart.mq4のそれぞれの設定を変更します。


上のチャートは、USD/JPYのチャートに、EUR/USDのチャートを重ね合わせたものです。シンプルなデザインに変更しています。

「OverLay20Chart.mq4」のソースリストは次の通りです。

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

「OverLay20Chart.mq4」
//+------------------------------------------------------------------+
//| OverLay Chart.mq4 Ver.1.10 |
//| Copyrightゥ 2006-2007 S.B.T. |
//| http://sufx.core.t3-ism.net/ |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+
//| This script is free to use/distribute/modify and re-distribute. |
//| (Limited to noncommercial use.) |
//+------------------------------------------------------------------+

//Indicator Properties
#property copyright "Copyrightゥ 2006 S.B.T."
#property link "http://sufx.core.t3-ism.net/"
#property indicator_chart_window
#property indicator_buffers 4


//Indicator Parameters
extern string SubSymbol = "USDJPY";
extern color BullBarColor = MediumSeaGreen;
extern color BearBarColor = Orange;
extern color GridColor = Black;
extern bool Mirroring = false;

//Global Variables
string Prefix; //Indicator Prefix
int Grid = 10; //Grid Lines
int SnapPips = 10; //Snap Pips For Grid Lines


//Indicator Buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double ExtMapBuffer3[];
double ExtMapBuffer4[];



//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init() {

//Initialize Indexes
Prefix = "OverLayChart" + SubSymbol;

IndicatorShortName( "OverLay Chart( " + SubSymbol + " )" );

SetIndexBuffer( 0, ExtMapBuffer1 );
SetIndexBuffer( 1, ExtMapBuffer2 );
SetIndexBuffer( 2, ExtMapBuffer3 );
SetIndexBuffer( 3, ExtMapBuffer4 );

SetIndexStyle( 0, DRAW_HISTOGRAM, DRAW_LINE, 1, BullBarColor );
SetIndexStyle( 1, DRAW_HISTOGRAM, DRAW_LINE, 1, BearBarColor );
SetIndexStyle ( 2, DRAW_HISTOGRAM, DRAW_LINE, 3, BullBarColor );
SetIndexStyle( 3, DRAW_HISTOGRAM, DRAW_LINE, 3, BearBarColor );

SetIndexEmptyValue( 0, 0.0 );
SetIndexEmptyValue( 1, 0.0 );
SetIndexEmptyValue( 2, 0.0 );
SetIndexEmptyValue( 3, 0.0 );


return( 0 );
}



//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit() {
int _i;



//Delete Objects
ObjectDelete( Prefix + "Status" );
ObjectDelete( Prefix + "Copyright" );

for ( _i = 1; _i <= Grid ; _i ++ ) {
ObjectDelete( Prefix + "Grid" + _i );
ObjectDelete( Prefix + "Price" + _i );
}


return( 0 );
}



//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start() {
int _BarsCount;
double _CurRangeHigh, _CurRangeLow, _CurRangeCenter;
double _SubRangeHigh, _SubRangeLow, _SubRangeCenter;
double _SubPoint, _SubDigit;
double _SubOpen, _SubHigh, _SubLow, _SubClose;
double _PipsRatio;
double _GridPips, _GridPrice;
int _i;



//Initialize Buffers
RefreshRates();

ArrayInitialize( ExtMapBuffer1, 0.0 );
ArrayInitialize( ExtMapBuffer2, 0.0 );
ArrayInitialize( ExtMapBuffer3, 0.0 );
ArrayInitialize( ExtMapBuffer4, 0.0 );


//Calculate Visible Bars
_BarsCount = BarsPerWindow() + 1;
int _FirstBar = FirstVisibleBar();
int _LastBar = _FirstBar - _BarsCount + 1;
if ( _LastBar < 0 ) {
_LastBar = 0;
_BarsCount = _FirstBar + 1;
}


//Calculate Chart Ratio
_CurRangeHigh = High[Highest(NULL, 0, MODE_HIGH, _BarsCount, _LastBar)];
_CurRangeLow = Low[Lowest(NULL, 0, MODE_LOW, _BarsCount, _LastBar)];
_CurRangeCenter = ( _CurRangeHigh + _CurRangeLow ) / 2;

if ( Mirroring ) {
_SubRangeHigh = iLow( SubSymbol, 0, Lowest( SubSymbol, 0, MODE_LOW, _BarsCount, _LastBar ) );
_SubRangeLow = iHigh( SubSymbol, 0, Highest( SubSymbol, 0, MODE_HIGH, _BarsCount, _LastBar ) );
} else {
_SubRangeHigh = iHigh( SubSymbol, 0, Highest( SubSymbol, 0, MODE_HIGH, _BarsCount, _LastBar ) );
_SubRangeLow = iLow( SubSymbol, 0, Lowest( SubSymbol, 0, MODE_LOW, _BarsCount, _LastBar ) );
}

_SubRangeCenter = ( _SubRangeHigh + _SubRangeLow ) / 2;
_SubPoint = MarketInfo( SubSymbol, MODE_POINT );
_SubDigit = MarketInfo( SubSymbol, MODE_DIGITS );

_PipsRatio = ( _CurRangeHigh - _CurRangeLow ) / ( _SubRangeHigh - _SubRangeLow );

_GridPips = ( _SubRangeHigh - _SubRangeLow ) / Grid;
_GridPips = MathRound( ( _SubRangeHigh - _SubRangeLow ) / Grid / ( _SubPoint * SnapPips ) ) * ( _SubPoint * SnapPips );


//Draw Candlesticks
for ( _i = _LastBar; _i < _LastBar + _BarsCount; _i ++ ) {
_SubOpen = iOpen( SubSymbol, 0, _i ) - _SubRangeCenter;
_SubHigh = iHigh( SubSymbol, 0, _i ) - _SubRangeCenter;
_SubLow = iLow( SubSymbol, 0, _i ) - _SubRangeCenter;
_SubClose = iClose( SubSymbol, 0, _i ) - _SubRangeCenter;

if ( Mirroring ) {
if ( _SubOpen < _SubClose ) {
ExtMapBuffer2[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
ExtMapBuffer1[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
} else {
ExtMapBuffer2[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
ExtMapBuffer1[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
}

ExtMapBuffer4[_i] = _CurRangeCenter + _SubClose * _PipsRatio;
ExtMapBuffer3[_i] = _CurRangeCenter + _SubOpen * _PipsRatio;
} else {
if ( _SubOpen < _SubClose ) {
ExtMapBuffer1[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
ExtMapBuffer2[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
} else {
ExtMapBuffer1[_i] = _CurRangeCenter + _SubLow * _PipsRatio;
ExtMapBuffer2[_i] = _CurRangeCenter + _SubHigh * _PipsRatio;
}
ExtMapBuffer3[_i] = _CurRangeCenter + _SubClose * _PipsRatio;
ExtMapBuffer4[_i] = _CurRangeCenter + _SubOpen * _PipsRatio;
}
}


//Draw Objects
ObjectCreate( Prefix + "Copyright", OBJ_LABEL, 0, 0, 0 );
ObjectSet( Prefix + "Copyright", OBJPROP_COLOR, GridColor );
ObjectSet( Prefix + "Copyright", OBJPROP_CORNER, 3 );
ObjectSet( Prefix + "Copyright", OBJPROP_XDISTANCE, 4 );
ObjectSet( Prefix + "Copyright", OBJPROP_YDISTANCE, 4 );
ObjectSetText( Prefix + "Copyright", "OverLay Chart by S.B.T.", 8 );

ObjectCreate( Prefix + "Status", OBJ_LABEL, 0, 0, 0 );
ObjectSet( Prefix + "Status", OBJPROP_COLOR, GridColor );
ObjectSet( Prefix + "Status", OBJPROP_CORNER, 0 );
ObjectSet( Prefix + "Status", OBJPROP_XDISTANCE, 4 );
ObjectSet( Prefix + "Status", OBJPROP_YDISTANCE, 16 );
ObjectSetText( Prefix + "Status",
SubSymbol + " O = " + DoubleToStr( iOpen( SubSymbol, 0, _LastBar ), _SubDigit ) +
", H = " + DoubleToStr( iHigh( SubSymbol, 0, _LastBar ), _SubDigit ) +
", L = " + DoubleToStr( iLow( SubSymbol, 0, _LastBar ), _SubDigit ) +
", C = " + DoubleToStr( iClose( SubSymbol, 0, _LastBar ), _SubDigit ),
8 );

for ( _i = 1; _i <= Grid ; _i ++ ) {
_GridPrice = MathRound( _SubRangeCenter / ( _SubPoint * SnapPips ) ) * ( _SubPoint * SnapPips );
_GridPrice = ( ( _GridPrice + _GridPips / 2 ) + _GridPips * ( Grid / 2 - 1 ) ) - ( _GridPips * ( _i - 1 ) );

ObjectCreate( Prefix + "Grid" + _i, OBJ_TREND, 0, 0, 0 );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_TIME1, Time[_FirstBar] );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_PRICE1, _CurRangeCenter + ( _GridPrice - _SubRangeCenter ) * _PipsRatio );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_TIME2, Time[_LastBar] );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_PRICE2, _CurRangeCenter + ( _GridPrice - _SubRangeCenter ) * _PipsRatio );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_COLOR, GridColor );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_STYLE, STYLE_DOT );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_WIDTH, 1 );
ObjectSet( Prefix + "Grid" + _i, OBJPROP_RAY, true );

ObjectCreate( Prefix + "Price" + _i, OBJ_TEXT, 0, 0, 0 );
ObjectSet( Prefix + "Price" + _i, OBJPROP_TIME1, Time[_FirstBar - _BarsCount / 10] );
ObjectSet( Prefix + "Price" + _i, OBJPROP_PRICE1, _CurRangeCenter + ( _GridPrice - _SubRangeCenter ) * _PipsRatio );
ObjectSet( Prefix + "Price" + _i, OBJPROP_COLOR, GridColor );
ObjectSetText( Prefix + "Price" + _i, DoubleToStr( _GridPrice, _SubDigit ), 8 );
}


return( 0 );
}
//+------------------------------------------------------------------+

FXと外貨預金の違いは

FX(外国為替証拠金取引)と外貨預金の違いは何でしょうか。

例えば、FXでUSD/JPYの買いポジションを保有することは、円を売って米ドルを買うことです。これは、外貨預金では米ドルを預金することと同じことになります。

ここでは、FXと外貨預金の違いをいくつかまとめてみました。

▼取引先
FXの取引先はFX業者になります。一方、外貨預金の取引先は銀行などの金融機関になります。

▼利息
FXでは、スワップポイントとしてFX業者から支払われます。外貨預金でも利息が支払われますが、FX業者のほうが利息の高い傾向にあります。また、外貨預金の場合、利息は年に2回程度まとめて支払われます。なお、利息は課税対象になります。

▼ロスカット
FXの場合、レバレッジを1倍にしていてもかなり低い確率ですがロスカットになる可能性があります。ロスカットになると「円を売って米ドルを買う」状態が解消されます。一方、外貨預金ではUSD/JPYがいくら円高になってもロスカットはありません。

▼手数料
FXの場合、一般的には手数料は無料です。外貨預金の場合には、預け入れ、引き出しのそれぞれに手数料がかかります。

▼値決め
FXの場合、その時の為替レートで売買できます。FXではBID(売値)とASK(買値)で表示されます。例えばBIDが79.500円、ASKが79.510円と表示されている時に1万通貨の買いポジションをするには79万5,100円が必要になります。ちなみに、買いポジションの直後に決済すると79万5,000円が戻ってくるのでマイナス100円になります。

外貨預金では、銀行が午前9時55分にその日の取引レートを決定し、そのレートでの取引になります。外貨預金では、TTS(売値)とTTB(買値)で表示されます。米ドルの場合、TTSとTTBとの差は約2円です。例えばTTSが79.500円、TTBが81.500円と表示されている時に1万米ドルを買うには81万5,000円が必要になります。この時点で米ドルを売ると79万5,000円が戻ってくるのでマイナス2万円になります。なお、一部の銀行では、TTS、TTBではなくリアルタイムの為替レートを適用しています。

▼利益
FXも外貨預金も、為替差益が年間20万円を超えたら雑所得として確定申告が必要になります。

▼現受け
FXの場合、現受けをしているFX業者は少ないようです。一方、銀行の外貨預金では現受けがほとんどできます。なお、現受けには手数料がかかります。

FXの損切りのタイミングは

FX(外国為替証拠金取引)の損切りのタイミングは、投資スタンスにより異なりますが、一般的な損切りは次のようなケースが考えられます。

▼IFD
IFD(イフダン)によって損切りのタイミングを決定します。例えば、USD/JPYを80円で買い注文して79円になったら損切するというものです。あらかじめ損切り額を自分で設定できるため、損失額を抑えることが可能です。

▼トレール
トレールによって損切り幅を設定します。例えば、USD/JPYを80円で買い注文して1円下がったら損切するというものです。ただしトレールの場合は、為替レートが80円から80.50円になれば損切り額は79.50円へ切り上がります。もし為替レートが82円になれば81円で決済されるため、損切りにはなりません。このようにトレールでは、最大損失額を限定することができます。

▼ロスカット
証拠金維持率の低下による強制決済で、結果として損切りになります。ロスカットの場合には損失額が最大になるため、良い損切りとはいえません。

▼テクニカル指標
テクニカル指標によって損切りのタイミングを図るものです。IFDやトレールは、テクニカル指標に頼らない損切りでしたが、テクニカル指標の場合には、ある一定の数値に達したらそこで損切りをするというものです。


上の図はチャートとテクニカル指標のRSIを描画したものです。赤色の丸で囲んだ部分で売りエントリーをしたものの一向に下がらないため、黄色の丸でかこんだ部分で損切りをするケースです。

FXのチャート分析ソフトMT4で表示できる通貨ペア以外のレートは

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)では、外国為替市場で取引される通貨ペア以外のチャートも表示できます。以下はそのリストです。

なお、MT4のダウンロード先によっては表示できない場合があります。

名称 内容
#NIK225M2 日経225先物
#AU200M2 S&P ASX200種指数
#DJ30M2 ダウジョーンズ30種
#SP500M2 S&P500種平均指数
#NAS100M2 ナスダック100指数
#RUSM2 ミニラッセル2000
#CHM2 スイスSMI指数先物
#DE30M2 DAX指数
#EU50M2 EURO STOXX 50 Index
#ITA40M2 FTSE MIB
#GB100M2 FTSE 100
#FR40M2 CAC40 Index
#NLK2 AEX Index NL
#ESK2 Mini-IBEX-35 Index SP
#USOILM2 Light Sweet Crude Oil(WTI)
#NGM2 E-mini Natural Gas
#HGM2 Heating Oil
#NLM2 AEX Index
#ESM2 Mini-IBEX-35 Index
#UKOILN2 Brent Crude Oil

▼日経225先物のチャート

▼S&P500種平均指数

FXのチャート分析ソフトMT4で10分足や2時間足などを表示するには

FX(外国為替証拠金取引)のチャート分析ソフトMT4(Meta Trader 4)では、次の時間足の表示ができます。
  • ティック
  • 1分足
  • 5分足
  • 15分足
  • 30分足
  • 1時間足
  • 4時間足
  • 日足
  • 週足

MT4では、10分足や12時間足などは表示できません。しかし、インジケーターの「Period_Converter_Opt.mq4」を使えば、指定した時間足の表示が可能になります。

「Period_Converter_Opt.mq4」のソースリストは次の通りです。

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

「Period_Converter_Opt.mq4」
//+------------------------------------------------------------------+
//| Period_Converter_Opt.mq4|
//| Copyright ?2005, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//| Modified by wfy05@talkforex based on Period_Converter|
//| http://www.talkforex.com |
//+------------------------------------------------------------------+
#property copyright "wfy05@talkforex.com"
#property link "http://www.mql4.com/codebase/indicators/277/"
#property indicator_chart_window
#property show_inputs

#include

/*
Readme:

I. Features:
This is an improved version of period converter for MT4 based on the
MT4's default period converter by metaquotes.
The default period converter script do not support real-time refreshing,
and consume lots of CPU (50%-9x%) making the whole system slow.
Also, the default one is a script which do not save when you exit MT4,
so you have to apply every converter script again after restarting, quite
annoying.

This one fixed all above problems:
1. Real-time updating or custom interval millisecond level updating.
2. Low CPU cost, average 5%-10% or less.
3. Works as an indicator, so can be saved and reloaded during restart.
4. There is no one converter per chart limitation as it is not script
any more, you can only use one window as source to generate as many
new timeframe chart as possible.
5. Auto updating if there is new history block loaded.

II. How to use:
Copy the mq4 file to your MT4 indicators folder (experts\indicators)
to install it as an indicator, NOT script. then in the custom indicator
list, attach period_converter_opt to the chart you want.
It support 4 parameters:
PeriodMultiplier: new period multiplier factor, default is 2
UpdateInterval: update interval in milliseconds,
zero means update real-time. default is zero.
Enabled: You can disable it without remove it with this option.

Other parameters are comments or for debugging, it is safe to ignore them.

Also Make sure you have Allow Dll imports option checked in common tab or
it won't work

After that, File->Open Offline to open the generated offline data. then
the offline data will be updated automatically.

As long as you keep the source chart open and the converter indicator
running, the generated chart including indicators inside will always
be updated. also you can close the generated chart and open again
later from File->Open Offline without problem.

If you want to quit MT4, you can leave those offline chart as other
normal online charts. when you start MT4 next time, those charts will
also be loaded and updated.


III. Notes:
1. Do NOT uncheck the "offline chart" option in offline chart common properties.
or after MT4 restart, it will treat that chart as online chart and request
the data from server, resulting empty chart window.
2. You can attach more than one converter to same window with different
PeriodMultiplier, e.g: you can attach 3 converter with
PeriodMultiplier = 2, 4, 10 to M1 to generate M2, M4, M10 at the same time.
It is even ok to use the M1 chart to generate Hourly chart like H2, which
only cost a few more CPU resource during initial conversion. but usually
most server don't have much data for those short period. resulting the
generated data isn't long enough for long period. so it is suggested
to use Hourly/Daily charts as source when needed.
3. The real-time updating mode updates quotes as fast as possible, but as
this is done via script, and MT will skip calling start() function when
your PC is busy and lots of quotes income. anyway, this seldom happen,
and you can at least get 10 updates each seconds which is much more
than enough.
4. The offline chart don't have a bid line showing in chart, but all data
in the chart including the indicators is still being updated,
so don't worry. you can show the bid line by unclick the "offline chart"
option in chart properties. but which don't helps much and if you forget
to check "offline chart" option before exit. it will cause errors and
become empty on next startup. you have to close the window and open
again from File->Open offline, which don't worth the trouble.

IV. History:
2005.12.24 1.4 faster to detect if data changed by removing float point
operations, added support to output CSV file in real time.
OutputCSVFile = 0 means no CSV.
OutputCSVFile = 1 means CSV + HST
OutputCSVFile = 2 CSV only, no HST .
(useful if you want to generate CSV for builtin periods)
CSV Filename will be the same as HST file except the extension.
added safe checking for PeriodMultiplier.
2005.12.04 1.3 Fixed missing data when there is large amount of data
loaded in several blocks, and support auto updating
when new history is loaded.
2005.11.29 1.2 Additional fix for missing data and server changing.
2005.11.29 1.1 Fixed missing partial data after restart.
Reinitialize after changing server or data corrupted.
2005.11.28 1.0 Initial release
*/


extern double Version = 1.4; // code version
extern string BuildInfo = "2005.12.24 by wfy05@talkforex.com";
extern int PeriodMultiplier = 2; // new period multiplier factor
extern int OutputCSVFile = 0; // also output CSV file?
extern int UpdateInterval = 0; // update interval in milliseconds, zero means update real-time.
extern bool Enabled = true;
extern bool Debug = false;

int FileHandle = -1;
int CSVHandle = -1;
int NewPeriod = 0;

#define OUTPUT_HST_ONLY 0
#define OUTPUT_CSV_HST 1
#define OUTPUT_CSV_ONLY 2


#define CHART_CMD_UPDATE_DATA 33324

void DebugMsg(string msg)
{
if (Debug) Alert(msg);
}

int init()
{
//safe checking for PeriodMultiplier.
if (PeriodMultiplier <= 1) { //only output CSV file PeriodMultiplier = 1; OutputCSVFile = 2; } NewPeriod = Period() * PeriodMultiplier; if (OpenHistoryFile() < 0) return (-1); WriteHistoryHeader(); UpdateHistoryFile(Bars-1, true); UpdateChartWindow(); return (0); } void deinit() { //Close file handle if(FileHandle >= 0) {
FileClose(FileHandle);
FileHandle = -1;
}
if (CSVHandle >= 0) {
FileClose(CSVHandle);
CSVHandle = -1;
}
}


int OpenHistoryFile()
{
string name;
   name = Symbol() + NewPeriod;
   if (OutputCSVFile != OUTPUT_CSV_ONLY) {
      FileHandle = FileOpenHistory(name + ".hst", FILE_BIN|FILE_WRITE);
      if (FileHandle < 0) return(-1);
   }
   if (OutputCSVFile != OUTPUT_HST_ONLY) {
      CSVHandle = FileOpen(name + ".csv", FILE_CSV|FILE_WRITE, ',');
      if (CSVHandle < 0) return(-1);
   }
   return (0);
}

int WriteHistoryHeader()
{
   string c_copyright;
   int    i_digits = Digits;
   int    i_unused[13] = {0};
   int    version = 400;  

   if (FileHandle < 0) return (-1);
   c_copyright = "(C)opyright 2003, MetaQuotes Software Corp.";
   FileWriteInteger(FileHandle, version, LONG_VALUE);
   FileWriteString(FileHandle, c_copyright, 64);
   FileWriteString(FileHandle, Symbol(), 12);
   FileWriteInteger(FileHandle, NewPeriod, LONG_VALUE);
   FileWriteInteger(FileHandle, i_digits, LONG_VALUE);
   FileWriteInteger(FileHandle, 0, LONG_VALUE);       //timesign
   FileWriteInteger(FileHandle, 0, LONG_VALUE);       //last_sync
   FileWriteArray(FileHandle, i_unused, 0, ArraySize(i_unused));
   return (0);
}


static double d_open, d_low, d_high, d_close, d_volume;
static int i_time;
void WriteHistoryData()
{
   if (FileHandle >= 0) {
      FileWriteInteger(FileHandle, i_time, LONG_VALUE);
      FileWriteDouble(FileHandle, d_open, DOUBLE_VALUE);
      FileWriteDouble(FileHandle, d_low, DOUBLE_VALUE);
      FileWriteDouble(FileHandle, d_high, DOUBLE_VALUE);
      FileWriteDouble(FileHandle, d_close, DOUBLE_VALUE);
      FileWriteDouble(FileHandle, d_volume, DOUBLE_VALUE);
   }
   if (CSVHandle >= 0) {
      int i_digits = Digits;
     
      FileWrite(CSVHandle,
         TimeToStr(i_time, TIME_DATE),
         TimeToStr(i_time, TIME_MINUTES),
         DoubleToStr(d_open, i_digits),
         DoubleToStr(d_high, i_digits),
         DoubleToStr(d_low, i_digits),
         DoubleToStr(d_close, i_digits),
         d_volume);
   }
}
int UpdateHistoryFile(int start_pos, bool init = false)
{
   static int last_fpos, csv_fpos;
   int i, ps;
     
//   if (FileHandle < 0) return (-1);
   // normalize open time
   ps = NewPeriod * 60;  
   i_time = Time[start_pos]/ps;
   i_time *=  ps;
   if (init) {
         //first time, init data
         d_open = Open[start_pos];
         d_low = Low[start_pos];
         d_high = High[start_pos];
         d_close = Close[start_pos];
         d_volume = Volume[start_pos];                          
         i = start_pos - 1;
         if (FileHandle >= 0) last_fpos = FileTell(FileHandle);
         if (CSVHandle >= 0) csv_fpos = FileTell(CSVHandle);
   } else {
         i = start_pos;
         if (FileHandle >= 0) FileSeek(FileHandle,last_fpos,SEEK_SET);
         if (CSVHandle >= 0) FileSeek(CSVHandle, csv_fpos, SEEK_SET);
   }
   if (i < 0) return (-1);
   int cnt = 0;
   int LastBarTime;
   //processing bars
   while (i >= 0) {
      LastBarTime = Time[i];
      //a new bar
      if (LastBarTime >=  i_time+ps) {
         //write the bar data
         WriteHistoryData();
         cnt++;
         i_time = LastBarTime/ps;
         i_time *= ps;
         d_open = Open[i];
         d_low = Low[i];
         d_high = High[i];
         d_close = Close[i];
         d_volume = Volume[i];
      } else {
         //no new bar
         d_volume +=  Volume[i];
         if (Low[i]         if (High[i]>d_high) d_high = High[i];
         d_close = Close[i];     
      }
      i--;
   }
  
   //record last_fpos before writing last bar.
   if (FileHandle >= 0) last_fpos = FileTell(FileHandle);
   if (CSVHandle >= 0) csv_fpos = FileTell(CSVHandle);
  
   WriteHistoryData();
   cnt++;
   d_volume -=  Volume[0];
  
   //flush the data writen
   if (FileHandle >= 0) FileFlush(FileHandle);
   if (CSVHandle >= 0) FileFlush(CSVHandle);
   return (cnt);
}

int UpdateChartWindow()
{
   static int hwnd = 0;
   if (FileHandle < 0) {
      //no HST file opened, no need updating.
      return (-1);
   }
   if(hwnd == 0) {
      //trying to detect the chart window for updating
      hwnd = WindowHandle(Symbol(), NewPeriod);
   }
   if(hwnd!= 0) {
      if (IsDllsAllowed() == false) {
         //DLL calls must be allowed
         DebugMsg("Dll calls must be allowed");
         return (-1);
      }
      if (PostMessageA(hwnd,WM_COMMAND,CHART_CMD_UPDATE_DATA,0) == 0) {
         //PostMessage failed, chart window closed
         hwnd = 0;
      } else {
         //PostMessage succeed
         return (0);
      }
   }
   //window not found or PostMessage failed
   return (-1);
}

/*
int PerfCheck(bool Start)
{
   static int StartTime = 0;
   static int Index = 0;
  
   if (Start) {
      StartTime = GetTickCount();
      Index = 0;
      return (StartTime);
   }
   Index++;
   int diff = GetTickCount() - StartTime;
   Alert("Time used [" + Index + "]: " + diff);
   StartTime = GetTickCount();
   return (diff);
}
*/
static int LastStartTime = 0;
static int LastEndTime = 0;
static int LastBarCount = 0;
int reinit()
{
   deinit();
   init();
   LastStartTime = Time[Bars-1];
   LastEndTime = Time[0];
   LastBarCount = Bars;
}
bool IsDataChanged()
{
/*
   static int LastBars = 0, LastTime = 0, LastVolume = 0;
   static double LastOpen = 0, LastClose = 0, LastHigh = 0, LastLow = 0;
  
   if (LastVolume != Volume[0] || LastBars != Bars || LastTime != Time[0]||
      LastClose != Close[0] || LastHigh != High[0] || LastLow != Low[0] ||
      LastOpen != Open[0]) {
      LastBars = Bars;
      LastVolume = Volume[0];
      LastTime = Time[0];
      LastClose = Close[0];
      LastHigh = High[0];
      LastLow = Low[0];
      LastOpen = Open[0];
      return (true);
   }
   return (false);
*/
/*
   fast version without float point operation
*/
   static int LastBars = 0, LastTime = 0, LastVolume = 0;
   bool ret;
  
   ret = false;
   if (LastVolume != Volume[0]) {
      LastVolume = Volume[0];
      ret = true;
   }
   if (LastTime != Time[0]) {
      LastTime = Time[0];
      ret = true;
   }
   if (LastBars != Bars) {
      LastBars = Bars;
      ret = true;
   }
   return (ret);
}
int CheckNewData()
{
   static string LastServer = "";
  
   if (Bars < 2) {
      //the data is not loaded yet.
      DebugMsg("Data not loaded, only " +  Bars + " Bars");
      return (-1);
   }
   string serv = ServerAddress();
   if (serv == "") {
      //no server yet
      DebugMsg("No server connected");
      return (-1);
   }
   //server changed? check this and reinit to prevent wrong data while changing server.
   if (LastServer != serv) {
      DebugMsg("Server changed from " + LastServer + " to " + serv);
      LastServer = serv;
      reinit();
      return (-1);
   }
   if (!IsDataChanged()) {
      //return if no data changed to save resource
      //DebugMsg("No data changed");
      return (-1);
   }
   if (Time[Bars-1] != LastStartTime) {
      DebugMsg("Start time changed, new history loaded or server changed");
      reinit();
      return (-1);
   }
     
   int i, cnt;
  
   //try to find LastEndTime bar, which should be Time[0] or Time[1] usually,
   //so the operation is fast
   for (i = 0; i < Bars; i++) {
      if (Time[i] <= LastEndTime) {
         break;
      }
   }
  
   if (i >= Bars || Time[i] != LastEndTime) {
      DebugMsg("End time " + TimeToStr(LastEndTime) + " not found");
      reinit();
      return (-1);
   }
  
   cnt = Bars - i;
   if (cnt != LastBarCount) {
      DebugMsg("Data loaded, cnt is " + cnt + " LastBarCount is " + LastBarCount);
      reinit();
      return (-1);
   }
   //no new data loaded, return with LastEndTime position.
   LastBarCount = Bars;
   LastEndTime = Time[0];
   return (i);
}
//+------------------------------------------------------------------+
//| program start function                                           |
//+------------------------------------------------------------------+
int start()
{
   static int last_time = 0;
   if (!Enabled) return (0);
        
   //always update or update only after certain interval
   if (UpdateInterval !=  0) {
      int cur_time;
     
      cur_time = GetTickCount();
      if (MathAbs(cur_time - last_time) < UpdateInterval) {
         return (0);
      }
      last_time = cur_time;
   }
   //if (Debug) PerfCheck(true);
   int n = CheckNewData();
   //if (Debug) PerfCheck(false);  
   if (n < 0) return (0);
   //update history file with new data
   UpdateHistoryFile(n);
   //refresh chart window
   UpdateChartWindow();
   //if (Debug) PerfCheck(false);
   return(0);
}

▼10分足を表示する方法

ここではUSD/JPYを例に挙げます。まず最初に、USD/JPYの1分足のチャートを表示します。



次に、Costom Indicatorsにある「Period_Converter_Opt.mq4」をダブルクリックします。「パラメータの入力」のタブの「PeriodMultiplier」の項目を「10」にしてOKのボタンをクリックします。


「ファイル」から「オフラインチャート」を選びます。


オフライン・チャート一覧の画面が表示されますので、その中から「USDJPY,M10」を選んで「開く」のボタンをクリックします。


10分足のチャートが表示されました。なお、このチャートはオフラインチャートのため、リアルタイムでの更新はされません。


▼2時間足を表示する方法

2時間足も10分足と同じような操作で表示できます。

ここではUSD/JPYを例に挙げます。まず最初に、USD/JPYの1時間足のチャートを表示します。

次に、Costom Indicatorsにある「Period_Converter_Opt.mq4」をダブルクリックします。「パラメータの入力」のタブの「PeriodMultiplier」の項目を「2」にしてOKのボタンをクリックします。

「ファイル」から「オフラインチャート」を選びます。

オフライン・チャート一覧の画面が表示されますので、その中から「USDJPY,H2」を選んで「開く」のボタンをクリックします。

▼他の時間足の表示方法

分単位のチャートの場合には1分足を表示してから「Period_Converter_Opt.mq4」のパラメータを変更します。2分足なら「2」、3分足なら「3」を入力します。

時間単位のチャートの場合には1時間足を表示してから「Period_Converter_Opt.mq4」のパラメータを変更します。6時間足なら「6」、8時間足なら「8」、12時間足なら「12」を入力します。