【MT4】スプレッドが広がった時に、警告を出してくれるインジケーターの作り方(全ソースコード公開!)
スプレッドがいくつかって、常々表示しておいてほしいって思いませんか?
証券会社が提供してる取引ツールだとスプレッドが表示されてる物が多いですが、
MT4はAskとBidの値しか表示されていない為、スプレッドは自分で計算して確認しないといけないですよね?
チャンスだと思って飛び乗ったら、スプレッドが広がってた!!
なんて経験ありませんか?
私は結構あります^^;
って事で、以下の機能を持ったインジケーターを作っていきたいと思います。
①スプレッドを常に表示する
②指定したスプレッドより広がったら、警告するようにする
完成はイメージはこんな感じです。
広がった時は、文字色とフォントを大きくして知らせてくれます。
スプレッドを計算しよう!
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);
}
この記事が気に入ったらサポートをしてみませんか?