メタトレーダー4でプログラムを作ってみよう -39ページ目

メタトレーダー4でプログラムを作ってみよう

無料のトレードソフトであるメタトレーダー4のプログラムを作るコツをアップします。初心者がインジケーターとEAのプログラムを作成できるのを目指します。

前回の修正では足が変わった時音を1回だけ鳴らすように変更しました。

今回は、音だけではなく矢印を表示するのも1回だけにしてみます。

start を以下のように修正してください。

if(oldtime!=Time[i])
{
   if(ExtMapBuffer1[i+1]<Lower_Alert && ExtMapBuffer1[i+2]>=Lower_Alert)
   {
      ExtMapBuffer2[i]=ExtMapBuffer1[i];
      ExtMapBuffer3[i]=0;
      if(oldtime!=0) Alert("Upper");
   }
   else if(ExtMapBuffer1[i+1]>Upper_Alert && ExtMapBuffer1[i+2]<=Upper_Alert)
   {
      ExtMapBuffer2[i]=0;
      ExtMapBuffer3[i]=ExtMapBuffer1[i];
      if(oldtime!=0) Alert("Lower");
   }
}



今回の修正では、矢印の判断全体の部分を、

if(oldtime!=Time[i])

の { } で囲っています。

これにより、判断そのものを足が変わった時にだけ行います。

しかし、チャートにセットした時に、

音は鳴らしたくないけど、矢印の描写はしたいので、

oldtime!=0

は、削除しています。

そして、Alert の処理の時に、

oldtime!=0

の条件をつけて、音だけ鳴らさないようにしています。

前回までは矢印を同じ足で書き直していましたが、

今回ように、矢印の描写と音の処理部分を

if(oldtime!=Time[i])

で判断することにより、書き直しの処理を減らしています。

そうして余計な処理が減ったぶん、メタトレーダーの動きが軽くなります。

今回の例ですと大した違いはありませんが、

これが大きなプログラムや、複数のチャートで動作させる場合は、

効果がある場合がありますので、頭の隅の方に覚えておくと、

得する時があるかもしれません。

まあ、ないかもしれませんが・・・ 




   
それでは、前回修正したインジケーターの解説をします。

変数を使って足の番号を記録し、同じ足だと動作させないようにしました。

変数は、init で宣言しています。

これを、start で宣言すると、

ティックが変わるたびに宣言した変数が初期化され、

覚えていた足の番号を忘れてしまうので、

init で宣言しておきます。


次に、start の Alert の前に、

if(oldtime!=0 && oldtime!=Time[i])

を追加して、後ろの方に、

oldtime=Time[0];


を追加しています。


まずは、if文の中の、

oldtime!=0

は、oldtime が 0以外の時、という意味です。

チャートにセットしてすぐの時は、

oldtime に0が入っている状態
です。

修正前の rsi_alert01 は、

チャートにセットした時点で警告のウインドウが開いて音が鳴っていました。

これを防止するために、0以外の時という条件を設定しています。

次の、

oldtime!=Time[i]

は、start の後ろの方の、

oldtime=Time[0];

と絡んできます。

Time は足の時間を表します。

5分足なら5分刻みで、他の足に変わるまでは同じ値です。

例えば、14:00 の足なら、14:00:00 から 14:04:59 までは、

足のTimeは、14:00 となります。

start の最後にその足の値を oldtime に代入しておきます。


そして、if文の中の、

oldtime!=Time[i]


は、oldtime が Time[i] 以外の時、という意味です。

i はfor文の命令によって変化していきますが、

最初に過去からの値を計算した後は、

現在の足の値の計算だけになるようになっています。

ですので、5分足で 18:30 の足なら、18:30:00 から 18:34:59 までは、

足のTimeは、18:30 となります。

18:35:00を超えると、足のTimeが18:35になり、

覚えていた oldtime の値とは異なりますので、

Alert が実行できる状態になります。

そのあとは、

oldtime=Time[0];

で、足の値が最新のものに書き変わりますので、

次の新しい足になるまでは、Alert は実行されない
ことになります。


足が変わった時の処理は、色々な方法があり、

Bars を使うパターン等もあります。

どれがよくてどれが悪い等はありませんので、

自分にとって使い勝手の良いものでOKです。

ではでは~~

P.S. 今回は、文章ばかりでわかりにくかったかも・・・




 
前回までで矢印が出ると同時に音が出るように作成しました。(こちら

音が出るようになったのはいいのですが、

矢印が出た足でティックが変わるたびにずっと音が鳴っていると思います。

PCから離れて何かをやっていて、何度も鳴ってくれた方がいい場合は重宝しますが、

PCで他の作業しながら等の場合は、はっきり言ってうるさいだけだと思います。

rsi_alert01
 は、矢印と音を出す判断に過去の足を使用しており、

足が変わった時に1度だけ判断すれば、後は特に音が出なくても問題ありません。


今回は足が変わった時に1度だけ動作するように修正します。


まずは、init で変数を1つ宣言します。

以下を追加してください。

int oldtime=0;




次に、start を以下のように修正してください。

int limit=Bars-counted_bars-1;
for(int i=limit; i>=0; i--)
{
   ExtMapBuffer1[i]=iRSI(NULL,0,RSI_Period,PRICE_CLOSE,i);

   if(ExtMapBuffer1[i+1]<Lower_Alert && ExtMapBuffer1[i+2]>=Lower_Alert)
   {
      ExtMapBuffer2[i]=ExtMapBuffer1[i];
      ExtMapBuffer3[i]=0;
      if(oldtime!=0 && oldtime!=Time[i]) Alert("Upper");
   }
   else if(ExtMapBuffer1[i+1]>Upper_Alert && ExtMapBuffer1[i+2]<=Upper_Alert)
   {
      ExtMapBuffer2[i]=0;
      ExtMapBuffer3[i]=ExtMapBuffer1[i];
      if(oldtime!=0 && oldtime!=Time[i]) Alert("Lower");
   }
   else
   {
      ExtMapBuffer2[i]=0;
      ExtMapBuffer3[i]=0;
   }
}

oldtime=Time[0];



下の方に

oldtime=Time[0];

が追加され、

Alert("Upper"); 

Alert("Lower");

だったところが、

if(oldtime!=0 && oldtime!=Time[i]) Alert("Upper");
if(oldtime!=0 && oldtime!=Time[i]) Alert("Lower");
     
に変わっています。

とりあえずコンパイルしてチャートにセットしてみてください。

セットした時点で、動作が違うのがわかると思います。

詳しい解説は次回しますね~