MT4 - MQLのオブジェクトでRSIの信号機サインを作る

sitemap
世界最強のFXキャッシュバックサイト
設計図を作って、MQLのオブジェクトでRSIの信号機(ランプ)サインを作る【簡易版】
公開日:2018/10/15
どうも、オブジェクトの作成にのめりこんでる管理人です。

なんか、ここ最近、本当にオブジェクトばっかり作ってます。

いろんなアイディアが生まれてくるのと同時にこういうものを作りたい、これはどうやったら作れるかな?というように毎日考えてます。

ということで、またまた、オブジェクトについての記事になります。

今回は、昨日初めて挑戦したオブジェクトの円(丸)と、今まで何度か利用した四角形と文字を使って、新しいインジゲーターの簡易版を作りました。

それは...

「信号機(ランプ)」

です。

前回、RSIをオブジェクトを使ってメーター化してみましたが、今回はRSIの値が一定値以上になったときと一定値以下になったときに、それぞれ色を変えたサインを信号機(ランプ)みたいに点灯したり消えたりするものを作ってみました。

完成例はこんな感じになりました。

信号機サイン

今回も、とくにデザインとかこだわらずにプロトタイプ版として作成しました。

以下から作成過程を説明していきますが、今回は、簡単な設計図を作ってからコードを書いていきたいと思います。
設計図
今までもたまにやってたんですが、今回は、設計についても少し紹介しておきたいと思います。

なにかを作るときは、基本的には設計図を書いて、それを元に作っていきます。

まあ、今回みたいな簡単なものだったら、いらないかもしれませんが...。

最初に、どんなものを作るかを考えて、作るものが決まったらラフ書きでいいので、紙とかにザックリ書いてみます。

そして、それをどうやって作っていくかを考えるときに設計図を書いてみると、作業がスムーズに進みます。

今回、サクッと作った設計図がこんな感じです。

設計図1

上記の設計図は、OnInit()の中で作るものを書いたものです。

全部、下記のstart()の中で作ってもいいんですが、ベースとなるオブジェクトは変化しないので、1回だけ実行される、OnInit()の中で作ってしまったほうが処理が軽くなると思います。

設計図2
start()の中には、変化するオブジェクトを作ります。

今回は、RSIの数値が常に動いているので、それに合わせて表示される値も変わるようにします。

そして、今回のメインで使う信号機(ランプ)サインもRSIの値によって、点灯したり消えたりするようにします。

では、設計図ができたところで、以下からコードを書いていきます。
ソースコードの説明
上記で、設計図を作ったのでそのとおりに作っていきます。

まずは、OnInit()の中の処理から作ります。

外枠の白い線と上の文字は今まで作ったようにオブジェクトで作ります。

int OnInit()
{

   ObjectsDeleteAll(); 
   
// 外枠の四角形
   ObjectCreate(0,"box",OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,"box", OBJPROP_CORNER, CORNER_RIGHT_UPPER);
   ObjectSetInteger(0,"box", OBJPROP_XDISTANCE, 250);
   ObjectSetInteger(0,"box", OBJPROP_YDISTANCE, 100);
   ObjectSetInteger(0,"box", OBJPROP_XSIZE, 200);
   ObjectSetInteger(0,"box", OBJPROP_YSIZE, 70);
   ObjectSetInteger(0,"box", OBJPROP_BGCOLOR, EMPTY_VALUE);
   ObjectSetInteger(0,"box", OBJPROP_BACK, false);
   ObjectSetInteger(0,"box", OBJPROP_BORDER_TYPE, BORDER_FLAT);
   ObjectSetInteger(0,"box", OBJPROP_COLOR, clrWhite);
   ObjectSetInteger(0,"box", OBJPROP_STYLE, STYLE_SOLID);
   ObjectSetInteger(0,"box", OBJPROP_WIDTH, 3);
  
//左丸   
   ObjectCreate("sign_dwn01",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("sign_dwn01",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSet("sign_dwn01",OBJPROP_XDISTANCE,170);
   ObjectSet("sign_dwn01",OBJPROP_YDISTANCE,100);
   ObjectSetText("sign_dwn01",CharToStr(108),50,"Wingdings",Gray);
 
//右丸 
   ObjectCreate("sign_up01",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("sign_up01",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSet("sign_up01",OBJPROP_XDISTANCE,70);
   ObjectSet("sign_up01",OBJPROP_YDISTANCE,100);
   ObjectSetText("sign_up01",CharToStr(108),50,"Wingdings",Gray);

//RSI SIGNの文字
   ObjectCreate( "title",OBJ_LABEL,0,0,0);
   ObjectSet("title",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSet("title",OBJPROP_XDISTANCE,110);
   ObjectSet("title",OBJPROP_YDISTANCE,70);
   ObjectSetText("title","RSI SIGN" ,15,"MS ゴシック",clrWhite);

   return(INIT_SUCCEEDED);
   
}

こんな感じのコードになります。

説明は、省略しますが、これだけ作ってコンパイルしてから実行すれば、以下のようにベースとなる部分が表示されます。

ベース

参考記事:「オブジェクトで四角形を描いて装飾をする」。
参考記事:「MQLのオブジェクトで円(丸)を描く」。

次に、start()の中の処理について簡単に書いていきます。

■RSIの値を取得

前回と同じようにRSIの値を使っていきます。
常に最新の値を取得して、さらに整数として表示したいので以下のようにコードを書いていきます。

double n_rsi = iRSI(NULL,0,rsi_period,0,0);
double i_rsi = NormalizeDouble(n_rsi,0);

参考記事:「MQLのオブジェクトでメーターを作る【簡易版】」。

■オブジェクトの処理

点灯と消灯をRSIの値で判定するために、条件文のif文で判定する処理を作ります。

RSIの値が40より小さいときは、左の丸(ランプ)が赤く点灯するようにして、40以上のときは、消灯するようにしていきます。

   if(i_rsi < 40)
   {

   ObjectCreate("sign_dwn02",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("sign_dwn02",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSet("sign_dwn02",OBJPROP_XDISTANCE,170);
   ObjectSet("sign_dwn02",OBJPROP_YDISTANCE,100);
   ObjectSetText("sign_dwn02",CharToStr(108),50,"Wingdings",Red);
   
   }else{
   
   ObjectDelete("sign_dwn02");
   
   }

次に、RSIの値が60以上のときは、右の丸(ランプ)が青く点灯するようにして、60未満のときは、消灯するようにしていきます。

   if(i_rsi >= 60)
   {
   
   ObjectCreate("sign_up02",OBJ_LABEL,0,0,0,0,0);
   ObjectSet("sign_up02",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
   ObjectSet("sign_up02",OBJPROP_XDISTANCE,70);
   ObjectSet("sign_up02",OBJPROP_YDISTANCE,100);
   ObjectSetText("sign_up02",CharToStr(108),50,"Wingdings",Blue);

   }else{
   
   ObjectDelete("sign_up02");
   
   }

最後に、RSIの値を表示する処理は以下のようになります。

    ObjectCreate( "RSI",OBJ_LABEL,0,0,0);
    ObjectSet("RSI",OBJPROP_CORNER,CORNER_RIGHT_UPPER);
    ObjectSet("RSI",OBJPROP_XDISTANCE,130);
    ObjectSet("RSI",OBJPROP_YDISTANCE,120);
    ObjectSetText("RSI",i_rsi,20,"MS ゴシック",clrWhite);

参考記事:「MQLのオブジェクトでメーターを作る【簡易版】」。

これで完成です。コンパイルして実行してみます。
実行結果
RSIの値が40未満のときの表示
40以下

RSIの値が60以上のときの表示
60以上

ちなみに40以上60未満のときは、どちらの条件も満たしていないので、こんな感じになります。
40以上60未満

ちゃんとRSIの値が判定されて、信号(ランプ)サインがうまく動いています。
まとめ
いかがだったでしょうか?

今回は、設計図を作るところからのスタートだったので、少し長くなってしまいましたが、しっかり手順を踏むことで、1つ1つの作業を確認しながら効率よく作っていけたんじゃないかと思います。

また、信号機(ランプ)のオブジェクトを作ることができるようになり、少し幅が広がったので、いろいろな形のインジゲーターを作れそうな気がします。

次回以降は、今まで作ったオブジェクトを改良したり、マルチタイムフレーム化したり、いろいろなテクニカルを混ぜながら、新しいものを作っていきたいと思います。

また何か作ったら紹介していきます。

それでは、また。
今回使用したMQL一覧
関連ページ
big_candlestick_judgment
スポンサードリンク
Twitter