2017年2月14日火曜日

[MT4インジケータ]スプレッドを記録する。

■EURUSD M1 Alpari-Demo スプレッド

朝方の時間帯はスプレッド大きいですね。朝スキャ対策でしょうか?

いや・・・・役に立つかどうかわからないのですが・・・(笑)
スプレッドを延々記録するインジケータです。

MT4でスプレッドは、過去データでは配信されていませんので、実時間で観測し続ける必要があります。いや、FX-ONにスプレッドを比較する超いいページがあるのですがマイナー通貨とか、対応していない業者のスプレッドも記録しておきたいこともあるかもしれません。
FX-ON 各社スプレッド比較

Pips単位に置き換えて表示します。

あとファイルに保存する機能も持っています。
バー切り替えのタイミングで保存するため、週末最終バーなどは次の週にならないと記録されないので週またいでの記録が必要な場合はMT4を落とさないように気を付けてください。
■インジケータを立ち上げた直後

立ち上げ直すと、また最新バーからの描画となります。
1分足チャートに入れておくと1分毎のスプレッドがspred_シンボル名_1.csvファイルに保存されます。

20017/2/15 追記
なんか勝手にインジケータが消えるときがありますね。
ファイルハンドルの持ち方を変えてみました。

FX-ONからのダウンロードはこちらから
スプレッドを表示・記録する。
スプレッドビュアー
スプレッドビュアー | fx-on.com

ソースコードはこちらから
//------------------------------------------------------------------
// スプレッドViewer
#property copyright "Copyright 2017,  Daisuke"
#property link      "http://mt4program.blogspot.jp/"
#property version   "1.00"
#property strict
#property indicator_separate_window

//バッファーを指定する。
#property indicator_buffers 2

//プロット数を指定する。
#property indicator_plots   2

#property indicator_label1  "Max"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrAqua
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

#property indicator_label2  "Min"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrIndianRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

input bool IsSaveFile = true; //スプレッドをファイルに保存する

// 表示バッファ
//最大スプレッド
double m_maxSpread[];

//最小スプレッド
double m_minSpread[];

//桁数
int m_digit;

//最小単位
double m_point;

//Pips倍率
int m_pipsRate;

//前回保存時間
datetime m_beforeSaveTime = 0;

//ファイルハンドル
int m_fileHnadle;

//------------------------------------------------------------------
//初期化
int OnInit()
{
   SetIndexBuffer(0,m_maxSpread);
   SetIndexBuffer(1,m_minSpread);
   
   //Pips計算 小数点桁数が3or5の場合、Point()*10=1pips
   m_digit = (int)MarketInfo(NULL, MODE_DIGITS);
   m_point = (double)MarketInfo(NULL, MODE_POINT);

   m_pipsRate = m_digit == 3 || m_digit == 5 ? 10 : 1;

   m_fileHnadle = FileOpen(StringFormat("spread_%s_%d.csv", Symbol(), Period()), FILE_CSV|FILE_READ|FILE_WRITE, ',', CP_ACP);
   FileSeek(m_fileHnadle, 0, SEEK_END);

   return INIT_SUCCEEDED;
}

//------------------------------------------------------------------
//終了処理
void OnDeinit(const int reason)
{
   FileClose(m_fileHnadle);
}

//------------------------------------------------------------------
//計算イベント
int OnCalculate(const int rates_total,          //各レート要素数
                const int prev_calculated,      //計算済み要素数
                const datetime &time[],         //要素ごとの時間配列
                const double &open[],           //オープン価格配列
                const double &high[],           //高値配列
                const double &low[],            //安値配列
                const double &close[],          //クローズ価格配列
                const long &tick_volume[],      //ティック数(要素の更新回数)
                const long &volume[],           //実ボリューム(?)
                const int &spread[])            //スプレット
{
   double bid = MarketInfo(NULL, MODE_BID);
   double ask = MarketInfo(NULL, MODE_ASK);
   
   double currentSpread = MathAbs(bid - ask) / m_point / m_pipsRate;
   
   if( m_minSpread[0] == EMPTY_VALUE || m_minSpread[0] > currentSpread)
   {
      m_minSpread[0] = currentSpread;
   }
   if( m_maxSpread[0] == EMPTY_VALUE || m_maxSpread[0] < currentSpread)
   {
      m_maxSpread[0] = currentSpread;
   }
   
   if( IsSaveFile && m_minSpread[1] != EMPTY_VALUE && m_maxSpread[1] != EMPTY_VALUE)
   {
      if( m_beforeSaveTime == 0 )
      {
         m_beforeSaveTime = time[0];
      }
      else if( time[0] != m_beforeSaveTime )
      {
         FileWrite(m_fileHnadle, TimeToStr(time[1]), DoubleToStr(m_minSpread[1], 4), DoubleToStr(m_maxSpread[1], 4));
         m_beforeSaveTime = time[0];
      }
   }
   
   return rates_total;
}

「MT4でFXを勝ち抜く研究をするブログ」で公開している無料インジケータは、こちらの一覧から。
インジケータ一覧

Twitterもよろしくお願いします。
https://twitter.com/mt4program

ブログランキングにご協力よろしくお願いします。m(._.)m
にほんブログ村 為替ブログ FX テクニカルトレード派へ
にほんブログ村

お約束ですが、本ブログは、投資に対する利益を約束する物ではありません。最終的には自己責任によるご判断よろしくお願いいたします。