MT4(MQL4)でオリジナルインジケータを作った際、MACDとかのようにサブウィンドウ側に表示したい!となった時に場合について解説します。
サブウィンドウに表示するコード
#property indicator_separate_window
やり方自体はとても簡単で、この1文を先頭部に追加するだけでサブウィンドウに表示されるようになります。
サンプルソース
MACDが下から上へゴールデンクロスした場合は-1、上から下へデッドクロスした場合は+1、それ以外は0とする簡単なサンプルですがここに1行追加するだけです。
//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright 2020, mef Software. |
//| https://fx-prog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, mef Software."
#property link "https://fx-prog.com/"
#property version "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Red
int BarLimit=1000;
double CrossJyoutai[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//ライン格納用
ArrayInitialize(CrossJyoutai,EMPTY_VALUE);
SetIndexBuffer(0,CrossJyoutai);
SetIndexStyle(0,DRAW_SECTION);
//0ライン用
SetLevelValue(0,0);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
init();
int i;
//----現在から過去で見る
for(i=BarLimit; i>=0; i--)
{
if(getMACDSign(3,1,i)==true)
{
CrossJyoutai[i]=1;
}
else if(getMACDSign(4,1,i)==true)
{
CrossJyoutai[i]=-1;
}
else
{
CrossJyoutai[i]=0;
}
}
return(0);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|【関数】MACDのクロスを探す |
//| |
//|【引数】 IN OUT 引数名 説明 |
//| --------------------------------------------------------- |
//| ○ aType 上下 |
//| 1:下から上へ |
//| 2:上から下へ |
//| 3:下から上へ(マイナス域の場合のみ)|
//| 4:上から下へ(プラス域の場合のみ) |
//| |
//| ○ limit どこまで遡るか |
//| ○ i 現在のBar位置 |
//|【戻値】True(クロス有り) or False(クロス無し) |
//| |
//|【備考】なし |
//+------------------------------------------------------------------+
bool getMACDSign(int type,int limit,int i)
{
int n;
bool sign = false;
double MACD_1,Signal_1,MACD_2,Signal_2;
limit = i + limit;
i = i + 1;
//下から上へのクロス
if(type==1){
for(n=i;n<=limit;n++){
MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);
Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);
Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);
if(MACD_2 <= Signal_2 && MACD_1 > Signal_1)
{
sign=true;
break;
}
}
}
//上から下へのクロス
else if(type==2){
for(n=i;n<=limit;n++){
MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);
MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);
Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);
if(MACD_2 >= Signal_2 && MACD_1 < Signal_1)
{
sign=true;
break;
}
}
}
//下から上へのクロス
if(type==3){
for(n=i;n<=limit;n++){
MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);
Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);
Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);
if(MACD_2 <= Signal_2 && MACD_1 > Signal_1 && MACD_1 <= 0 )
{
sign=true;
break;
}
}
}
//上から下へのクロス
else if(type==4){
for(n=i;n<=limit;n++){
MACD_1 = iCustom(NULL,0,"MACD",12,26,9,0,n);
Signal_1 = iCustom(NULL,0,"MACD",12,26,9,1,n);
MACD_2 = iCustom(NULL,0,"MACD",12,26,9,0,n+1);
Signal_2 = iCustom(NULL,0,"MACD",12,26,9,1,n+1);
if(MACD_2 >= Signal_2 && MACD_1 < Signal_1 && MACD_1 >= 0 )
{
sign=true;
break;
}
}
}
return(sign);
}
あとは、修正したインジケータをチャート上に反映して確認してあげると・・・
サブウィンドウに表示されるようになりました!
さいごに
以上、『オリジナルインジケータをサブウィンドウ側に表示する』でした。
自分でインジケータを作ったけど、メインチャート側に表示すると邪魔だなーという時は是非使ってみて下さい。
コンパイル方法等分からないという場合はこちら
コメント