MT4インディケーター作成講座4 繰り返し処理 For文
ループ処理とは、同じことを何度も同じ処理を繰り返すことです。
MT4のインディケーターやEAを作るうえで、とても重要な処理なのでしっかり覚えておきましょう!
今回作っているインディケーターはこちら→owarine_1.mq4
なぜループにするのか
今回は終値をサブウインドウに表示するインディケータを作ります。
そのためには、過去の終値情報を取得し、表示用の配列に保存していく必要があります。
今回のコードでいくと、MQLウィザードが生成した、29行目のowarineBuffer[];という配列に過去の終値の値を格納していきます
では実際にループさせている所のソースをみてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
//+------------------------------------------------------------------+ //| 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[]) { //--- int limit; //int は変数を定義する limit=Bars-IndicatorCounted(); /*Bars チャート上のバー総数 /*IndicatorCounted() 過去の変化しなかったバーの数 /*最初チャートに挿入した時には、まだバーは数えらていないのでIndicatorCountedの値は0 なので,limit=0 チャートに表示した後は、1ティック進むごとに Limit=1になります。 */ for(int i=limit-1; i>=0; i--) //ループ処理 /* for(変数の初期値; 繰り返す範囲 ;変数の操作 今回はlimitが0以上の時にループを回す指示を出している たとえばlimitが2だった場合 繰り返すたびにiの値が1づつ引かれていき、次は1 次は0というように数が減っていきます 次はマイナスになりますが、 iの数がマイナスでは i>=0という条件は満たさないのでループはしません。 */ { owarineBuffer[i]=Close[i]; //owarineBufferに終値 :Closeの値を格納していく } //--- return value of prev_calculated for next call return(rates_total); } |
コメントを入れているので長く見えますが、実際には3行程度です。
forから始まっているところがループです。
MQLのFor文
For文の形は
1 2 3 4 5 |
for(カウンタ変数の初期化; ループを回す条件;カウント) { 処理 } |
で表示することができます。 for() のあとの波かっこ間を繰り返します。
例えば、同じ処理を3回繰り返したい場合は次のように記入します。
1 |
for(int i=0 ; i<3; i++) |
これを詳しくみていくと、
最初iの値を0にして、1週毎にiの数を1ずつ増やし、iが3未満のあいだ処理を繰り返すということになります。
ちなみに、「i++」と記述しているのは、「i+1」と同じで、iの数をひとつ増やしています。 わかりずらければ、i+1と書いてもかまいません。 逆に「i–」でiの数を1ずつ減らしていくこともできます。
ちなみに比較演算子は次のようにあらわせます
a < b aよりbが小さい
a>b aよりbが大きい
a<=b aよりbが小さいまたは等しい a > b // aよりbが大きい
a>=b aよりbが大きいまたは等しい
実際のコードをみてみる
実際のコードのループ条件は
1 |
for(int i=limit-1; i>=0; i--) |
となっています。 これを日本語に読み直すと、
iにlimitという変数を入れて、ループのたびにiを1ずつ引いていき、 iが0より大きい場合はループを回し続ける
という指示です。
ちなみにMT4は最新のバーを0として、過去にさかのぼるにつれ1、2、3と数えていきます。
limitという変数は、ループ文の前に
1 |
limit=Bars-IndicatorCounted(); |
このようなコードで変数を作っています。
この記述が何をしているかというと、MQLで最初から定義されている Barsという関数とIndicatorCounted()
という変数を引いた数をlimitとしています。
Barsとはチャートウインドウに表示されているバーの本数を調べることができます。
IndicatorCountedはインディケーターを起動した後、変化していないバーの本数を数えています
つまり、チャートにインディケーターを挿入した時点ではチャートのバーの総数がlimtの数になり、
その後は変化したバーの数だけがlimitになります。
こう記述しておくことで、余分な計算を減らしコンピューターに負荷をかけないようにしています。
ループ内の処理
今回のインディケーターのループ内では
1 |
owarineBuffer[i]=Close[i]; |
次のようなコードで、owarineBufferという配列に過去の終値を順番に格納していっています。
次回はこのコードでも使っている配列を覚えましょう!