見出し画像

【MT4】スプレッドが広がった時に、警告を出してくれるインジケーターの作り方(全ソースコード公開!)

スプレッドがいくつかって、常々表示しておいてほしいって思いませんか?
証券会社が提供してる取引ツールだとスプレッドが表示されてる物が多いですが、
MT4はAskとBidの値しか表示されていない為、スプレッドは自分で計算して確認しないといけないですよね?

チャンスだと思って飛び乗ったら、スプレッドが広がってた!!
なんて経験ありませんか?

私は結構あります^^;

って事で、以下の機能を持ったインジケーターを作っていきたいと思います。
①スプレッドを常に表示する
②指定したスプレッドより広がったら、警告するようにする

画像1

画像2

完成はイメージはこんな感じです。
広がった時は、文字色とフォントを大きくして知らせてくれます。

スプレッドを計算しよう!

AskとBidの差をとればよいですね!
ただ通貨によって1Pipsの小数点位置が違う為、考慮が必要です。

対象通貨の価格の精度はDigitsというシステム変数が持ってます。

って事で、まずは差をとって、Pipsに変換する関数を作ります

double getPips(double d1,double d2){
  double dRet = 0.0;
  dRet = MathAbs(d1 - d2);
  if(Digits==2 || Digits==3){
     dRet *= 100;
  }else if(Digits==4 || Digits==5){
     dRet *= 10000;
  }
  return(dRet);
}

はい、こんな感じですね。これで、二つの値の差のPipsを取得する事ができます。

後は、ラベルオブジェクトで表示すればOKですね!

string objName = "objSpread";   
ObjectCreate(objName, OBJ_LABEL, 0, 0, 0);
ObjectSet(objName, OBJPROP_XDISTANCE, IN_PositionX); 
ObjectSet(objName, OBJPROP_YDISTANCE, IN_PositionY); 
ObjectSet(objName, OBJPROP_CORNER, IN_Position);

Labelオブジェクトをまず作成して、OnCalculateの中で、
指定の値を超えてるかどうかを判断して、テキストの設定を変えてあげれば終わりです!

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 iPips = getPips(Ask,Bid);
  
  if (StrToDouble(DoubleToStr(iPips,1))>=IN_Pips ) {
     ObjectSetText(objName, "スプレッド注意!!:" + DoubleToStr(iPips,1) , IN_FontSizeK, "Meiryo UI Bold", IN_BackColor);
  } else {
     ObjectSetText(objName, "SP:" + DoubleToStr(iPips,1) , IN_FontSize, "Meiryo UI Bold", IN_FontColor);
  }

//--- return value of prev_calculated for next call
  return(rates_total);
 }

このインジケーターを使う事で、スプレッドが広がってる時に、
間違ってエントリーするなんて事が減る事を祈ってます!

全ソースコード公開!

はい、全ソースコード公開しちゃいます!
警告表示する際の閾値、フォントの色、大きさ、などいろいろ変えれるように作ってます。
よかったら、使って下さい。

ただし、すべて自己責任でお願い致します。

#property strict
#property indicator_chart_window

extern int IN_FontSize = 12; //スプレッドフォントサイズ
extern int IN_FontSizeK = 20; //警告フォントサイズ
extern color IN_FontColor = clrBlack; //フォントカラー
extern color IN_BackColor = clrRed; //警告フォントカラー
extern double IN_Pips = 2.0; //警告表示pips幅
extern int IN_PositionX = 10; //位置X
extern int IN_PositionY = 10; //位置Y
extern int IN_Position = CORNER_RIGHT_LOWER; //表示位置(0:左上 1:右上 2:左下 3:右下 )

string objName = "objSpread";   

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
 {
//--- indicator buffers mapping
  // ラベルオブジェクトを作成
  ObjectCreate(objName, OBJ_LABEL, 0, 0, 0);
  ObjectSet(objName, OBJPROP_XDISTANCE, IN_PositionX); 
  ObjectSet(objName, OBJPROP_YDISTANCE, IN_PositionY); 
  ObjectSet(objName, OBJPROP_CORNER, IN_Position);
//---
  return(INIT_SUCCEEDED);
 }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 iPips = getPips(Ask,Bid);
  
  //ラベル設定
  if (StrToDouble(DoubleToStr(iPips,1))>=IN_Pips ) {
     ObjectSetText(objName, "スプレッド注意!!:" + DoubleToStr(iPips,1) , IN_FontSizeK, "Meiryo UI Bold", IN_BackColor);
  } else {
     ObjectSetText(objName, "SP:" + DoubleToStr(iPips,1) , IN_FontSize, "Meiryo UI Bold", IN_FontColor);
  }

//--- return value of prev_calculated for next call
  return(rates_total);
 }
//+------------------------------------------------------------------+

double getPips(double d1,double d2){
  double dRet = 0.0;
  dRet = MathAbs(d1 - d2);
  if(Digits==2 || Digits==3){
     dRet *= 100;
  }else if(Digits==4 || Digits==5){
     dRet *= 10000;
  }
  return(dRet);
}


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