このページでは、制御文となる「if」と「for」について解説します。
制御文とは
制御文とは、プログラムの実行を制御するもので、大きく分けて、選択文(if)、繰り返し分(for)、ジャンプ文(return)の3種類があります。
このうち、「if」と「for」について解説します。
バックテストを取るうえで欠かせないものになりますし、「if」と「for」以外の他の制御文については、この2つ以上に使う機会が無いと感じていますので、この2つに重点を置いてしっかり理解していきましょう。
if文とは
if文は、条件分岐文とも言いますが、「もし○○がtrueだったら××、falseだったら△△」というようにコードの実行を条件によって分岐することが出来ます。
さらに具体例を挙げると「RSI値が「70」以上だったら、アロー(矢印)サインを出す、RSI値が「70」未満だったら、何もしない」といった内容です。
条件式を書くと以下の通りです。
ifから始まる部分が制御文となります。ifのカッコ内()に条件式を書くことで、条件を満たしている場合の次の動作を波かっこ{}内に書くことが出来ます。
アローサインを出すコードは省略しています。
そして条件を満たさなかった場合、elseの波かっこ{}内の処理を実行しようとします。
「何もしない」といった場合は、else{}自体を書かずに省略することも可能です。
あえて、「double rsi_value = 70;」と書きましたが、本来はiRSI関数などを使って現在足のRSI値がいくつなのかを確認して、その値が70以上だった時というような式を書きます。
関数については別で説明しますので、ここでは直接「70」という数値を指定しています。
ちなみに、「もしRSI値が「70」以上だったら、下向きのアロー(矢印)サインを出し、もしRSI値が「30」以下だったら、上向きのアロー(矢印)サインを出す」といった書き方もできます。
else の後ろにif()を追加することで、このような条件を付けることもできます。
for文とは
for文は、ループ処理とも呼ばれ、条件が成立している間処理を繰り返すといった場合に使用します。
チャート上に表示されているローソク足の本数を確認し、その本数分の各足の位置にあるRSI値を取得するといった場合、1本1本コードを書いていったら終わりません。そんな時にfor文が活躍します。
for文の式は以下の通りです。
for(初期化式; 条件判定; 更新式) { コードの実行文 }
例えば、ローソク足100本あった場合、各ローソク足のRSI値をiRSI関数を使って求める場合、以下のようになります。
それぞれについて説明します。
int limit = 100;
ローソク足100本を表現しています。
double rsi_value[100];
各ローソク足に対応するために配列を宣言しました。
for(int i = 0; i < limit; i++) { rsi_value[i] = iRSI(NULL,NULL,14,PRICE_CLOSE,i); }
そしてfor文ですが、初期化式の部分で「int i = 0;」というように「i」を初期化している分を書いています。「i」が「0」から始まるということがわかります。
次に条件判定ですが、「i < limit;」です。こちら初回は「0 < 100」と置き換えられますね。
この場合条件式は成立しています。
条件式が成立している場合、コードの実行文に入ります。
rsi_value[i] = iRSI(NULL,NULL,14,PRICE_CLOSE,i);
関数の説明は省略しますが、初回はrsi_value[0]と置き換えられますので、「0」番目の配列にRSI値を代入しています。
コードの実行分が終わると 更新式に移り「i++」となっています。この「++」は「1を足す」という意味になりますので、初回の「i」は「0」なので、「i」が「1」に変わります。
繰り返しに入り、条件判定「i < limit;」は、今度は「1 < 100」と置き換えられますね。
初期化式は初めの1回だけ
この条件式も成立しているので、再びコードの実行分に入り、rsi_value[i]も「1」に置き換えられることがわかると思います。
この繰り返しによって「i」の値は1ずつ増えていき、最終的に「99 < 100」まで条件式が成り立つ形となります。
その後、「i」の値は1ずつ増えて「100」になったとき、条件式が「100 < 100」となり、この条件式は成立しなくなります。
このタイミングでfor文は終了します。
おまけ:他の制御文
if文やfor文のほかにも制御文は存在します。
ただ、使わなくてもif文やfor文で表現できることも多いので、ここでの説明は省略しました。
しかし、実際に使っていないかというとそうでもないので、紹介だけしておきます。
switch
選択処理といい、「○○がAの時は××、○○がBの時は△△、○○がCの時は■■」というように「○○」の部分の違いによって制御を変えるという内容です。
これif文でも表現できますよね?
while
条件式が「true」の間ループ処理を実行します。
for文に近いものがありますが、while文に更新式が無いため、自分でコードを書くなり、どこかのタイミングで「false」になるように切り替えなければなりません。
コードの書き方を間違えると無限ループに陥って面倒になることもあります。
なので、使い方に慣れるまではfor文を使っていけば良いと思います。
コメント