トップ  >  自作してみる >  プログラミング未経験者向け  >  F1-3.プログラミングの基礎2(条件分岐と繰り返し)
スポンサーリンク
検索

↑の検索エンジンが表示されない人は、
↓の古い検索エンジンを使用して下さい。
カスタム検索
MQL4リファレンスツリー
F1-3.プログラミングの基礎2(条件分岐と繰り返し)




前回の続きです。
未だ、 F1-2.プログラミングの基礎1を読んでいないプログラミング未経験者は
F1-2.プログラミングの基礎1のページを読んで下さい。

繰り返し

今回はプログラムの基本動作の1つの「繰り返し」について説明します。
まずは前回最後に作成したインクリメントを使って変数を0から5まで加算するプログラムを見てみましょう。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    int      template_value;              // int型の変数を宣言

    template_value = 0;                    // 変数を初期化

    Print( template_value );              // 変数の値をログ出力

    template_value++;                      // 変数に1を加算(インクリメント)

    Print( template_value );              // 変数の値をログ出力

    template_value++;                      // 変数に1を加算(インクリメント)

    Print( template_value );              // 変数の値をログ出力

    template_value++;                      // 変数に1を加算(インクリメント)

    Print( template_value );              // 変数の値をログ出力

    template_value++;                      // 変数に1を加算(インクリメント)

    Print( template_value );              // 変数の値をログ出力

    template_value++;                      // 変数に1を加算(インクリメント)

    Print( template_value );              // 変数の値をログ出力
}


結果:
TestProgram EURUSD,H1: 0
TestProgram EURUSD,H1: 1
TestProgram EURUSD,H1: 2
TestProgram EURUSD,H1: 3
TestProgram EURUSD,H1: 4
TestProgram EURUSD,H1: 5


同じ事を繰り返していて無駄に感じません?
これを1万回インクリメントする事を想像して見て下さい。
簡単なプログラムを作成して自動化すれば、プログラム作成と動作チェックも含めて5分以内で終わる作業を、 コンピュータを使ってわざわざ手入力で残業しているIT企業の社員みたいな事をやっていますよね?

せっかくコンピュータを使っているんですから、こういう単純な機械作業は全てコンピュータに指示してやらせましょう。
コンピュータはこういう機械作業の繰り返しが大得意です。


ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    int      template_value;              // int型の変数を宣言

    template_value = 0;                    // 変数を初期化

    Print( template_value );              // 変数の値をログ出力


    int      count;                       // int型の変数を宣言

    for ( count = 0; count < 5; count++ )    // 繰り返し
    {

        template_value++;                      // 変数に1を加算(インクリメント)

        Print( template_value );              // 変数の値をログ出力

    } // 繰り返しの終端

}


結果:
TestProgram EURUSD,H1: 0
TestProgram EURUSD,H1: 1
TestProgram EURUSD,H1: 2
TestProgram EURUSD,H1: 3
TestProgram EURUSD,H1: 4
TestProgram EURUSD,H1: 5



プログラミング基礎

for文の式を見て、訳が分からなくて見る気を無くしました?
とりあえず説明しないので、ソースコードとフローチャートを見比べて、感覚的にどういう動作をしているのかを感じ取って下さい。











感じ取る事は出来ました?







プログラミング基礎

緑色の囲いの中で処理が繰り返されている事をなんとなく感じ取れたと思います。


プログラミング基礎

そして中括弧{ }で囲まれている部分の処理が繰り返されている事をなんとなく感じ取れたと思います。
この中括弧は重文処理と呼びますが、 今は詳しいことを知る必要はありません、動作から感じ取って下さい。


ちなみに重文処理の中の処理をオフセットさせていますが
プログラミング基礎

これは単純にソースコードを読み易くする為です。
このオフセットする事をインデントと呼びます。
未だインデントの必要性を感じ取れないかもしれませんが、 ソースコードが長くなってくると必要性を理解できるようになると思いますので、今はとりあえず深く考え込む必要はありません。


ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
MQL未経験者向け

for文の使い方

今度はfor文の動作を感じ取りましょう。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    Print( "ループ開始前" );              // 確認用ログ出力

    int      count;                       // int型の変数を宣言

    for ( count = 0; count < 5; count++ )    // 繰り返し
    {

        Print( count );              // 変数の値をログ出力

    } // 繰り返しの終端

    Print( "ループ終了後" );              // ログ出力

    Print( count );              // 確認用ログ出力

}


結果:
TestProgram EURUSD,H1: ループ開始前
TestProgram EURUSD,H1: 0
TestProgram EURUSD,H1: 1
TestProgram EURUSD,H1: 2
TestProgram EURUSD,H1: 3
TestProgram EURUSD,H1: 4
TestProgram EURUSD,H1: ループ終了後
TestProgram EURUSD,H1: 5



プログラミング基礎

for文とループ処理の動作を見る事に重点を置いたソースコードです。

ええ言いたい事は分かります、
    Print( "ループ開始前" );              // 確認用ログ出力


ダブルクォーテーション(")で囲まれた日本語が登場していますが、今は気にしないで下さい。
ソースコードに日本語や全角文字は使えませんが、 文字列コメントだけは日本語や全角文字が使えます。
でも細かい事は今は気にしないで下さい。
「日本語のログ出力をしたい場合はこうすればいいいんだ~」とだけ感じ取ってくれれば大丈夫です。


今回確認したいのは、ループ開始前とループ終了後の間のログ出力内容です。
プログラミング基礎

今は細かい説明はしません、フローチャートとログ出力内容を見比べて、for文がどういう動作をしているのかを感じ取って下さい。

よく分からなかったら単純に5回処理を繰り返したい時に

ソースコード:
    int      count;                       // int型の変数を宣言

    for ( count = 0; count < 5; count++ )    // 繰り返し
    {

        Print( count );              // 変数の値をログ出力

    } // 繰り返しの終端


このソースコードをパクって下さい。

このfor文ループの繰り返し処理は良く使われます。


それでは簡単に説明します。
for文で繰り返し処理をするにはループ用の変数が必要という事はなんとなく感じ取れました?

for文の最初の「count = 0;」はループ用の変数を初期化しています。

2番目の「count < 5;」はcountの値を5と比較しています。
「<」は関係演算子(比較演算子とも呼ばれます)でcountと5より小さいかを比較する為の演算子です。
countの値が5未満の場合は中括弧{}内の処理を行います。

3番目の「count++」は、中括弧{}内の処理が終了する度に処理されます。
つまり最初に中括弧{}の処理を開始した時は処理されません。
なので最初のログ出力でcountの値を見ると0になっています。

そして中括弧{}内の処理が終了する度に処理されるので、
プログラミング基礎

ループ処理が終わって、ループ処理を抜けた先でcountの値を確認すると、インクリメントされています。
これは最後にループ処理内でcountが4まで加算された後に、 中括弧{}内の処理が終了した時にcountがインクリメントされてcountの値が5になります、
その後に「count < 5;」の比較が行われてforループ処理を抜けるので、forループ処理を抜けた先でcountの値を確認すると5になります。

説明内容を読んでも理解出来ない人は、とにかくソースコードと結果を見比べて動作を感じ取って下さい。

ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
MQL未経験者向け



変数名について


forループ用の変数名に「i」や「j」という一文字を使う人が多いのですが、
これはプログラム言語の参考書のサンプルソースに「i」や「j」がよく使われるからだと思います。
IT企業でも当たり前のように「i」や「j」という一文字が使われています。

私はicountやjcount等の長い名前を使用します。
理由としては「i」という一文字にすると検索時に大量にヒットしてしまう為、 いちいち単語検索指定をしなければならなくなり、その時間が勿体ないというか面倒というか煩わしいからです。
こういう地味に時間を奪われる事で作業工数を損失していきます。

実際のソースコードで「i」を検索してみると
プログラミング基礎

「i」で検索してヒットした部分が青くなっていますが、検索で大量にヒットして検索の意味を成していないですよね?
ループ用変数名に「i」を使っている人は何も不便さを感じないのでしょうか?
他みんなが当然のように「i」を使うので、逆に私だけが頭がおかしいだけなのかもしれませんがw

管理人の個人的なルールですが、ループ用変数の命名規則として
・3文字以上
・ソースコード中の他単語と被らない名前にする
・小文字のみ使用

というのを独自に設けています。
これは単純に、検索のデフォルト設定が
プログラミング基礎

「大文字/小文字の区別」をOFF
「単語の検索」をOFF
「正規表現」をOFF

にしている為、この検索条件で意図しない単語にヒットする事を避ける為に意識して変数名を決めています。

条件分岐

プログラムの基本動作の「処理」「繰り返し」「条件分岐」の最後の「条件分岐」の説明です。

条件分岐は簡単に言うと、処理の分かれ道です。
プログラミング基礎

フローチャートの菱形の部分が条件分岐です。
条件の内容がTrueなら処理Aに進み、Falseなら処理Aを回避します。


ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{

    int      test_no = 0;          // int型の変数を宣言・初期化

    if ( test_no == 0 ) {          // 条件分岐 
        // trueの場合 

        Print( "処理A" );         // 確認用ログ出力

    }

    Print( "処理B" );             // 確認用ログ出力

}


結果:
TestProgram EURUSD,H1: 処理A
TestProgram EURUSD,H1: 処理B



まず最初にint型の変数宣言と初期化を同時に行っていますが、こういう事も出来ます。

if文の処理の中で「==」という演算子が登場しました。
前回「=」は値を代入する為の説明しました。
今回の「==」は値が等しいか比較するための比較演算子です。
「==」は左辺と右辺を比較して、内容が一致していればtrueを返し、不一致ならfalseを返します。

演算子 使用例 意味
== a == b aとbが等しければtrue
!= a != b aとbが等しくなければtrue
< a < b aがbより小さければtrue
> a > b aがbより大きければtrue
<= a <= b aがb以下であればtrue
>= a >= b aがb以上であればtrue


フローチャートにすると
プログラミング基礎

test_noの値が0なので、「test_no == 0」の結果はtrueになります。
なのでif文はtrueのルートを通ります。
今回はfalseのルートを通っていないので分かり難いかもしれません。




次はfalseのルートを通らせる為に、test_noの初期値を1に変更して下さい。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{

    int      test_no = 1;          // int型の変数を宣言・初期化

    if ( test_no == 0 )           // 条件分岐 
    {
        // trueの場合 

        Print( "処理A" );         // 確認用ログ出力

    }

    Print( "処理B" );             // 確認用ログ出力

}


結果:
TestProgram EURUSD,H1: 処理B



プログラミング基礎

test_noの値が1なので、「test_no == 1」の結果はfalseになります。
今回はfalseのルートを通って trueのルートを回避した事が分かります。




次は条件分岐でそれぞれ違う処理を行わせる方法です。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{

    int      test_no = 1;          // int型の変数を宣言・初期化

    if ( test_no == 0 )           // 条件分岐 
    {
        // trueの場合 

        Print( "処理A" );         // 確認用ログ出力

    } 
    else 
    {
        // falseの場合 

        Print( "処理B" );         // 確認用ログ出力

    }

    Print( "処理C" );             // 確認用ログ出力

}


結果:
TestProgram EURUSD,H1: 処理B
TestProgram EURUSD,H1: 処理C



プログラミング基礎

if文でfalseの処理を行いたい場合は、 else文を使う必要があります。

気が付かれたと思いますが、for文の時のように重文処理(中括弧{}で囲まれた部分だけが処理)が使われます。
プログラミング基礎



ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
MQL未経験者向け

3つ以上の条件分岐

ルートを2つに分岐する方法は分かったと思いますので、次は3つ以上の条件分岐を体得しましょう。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{

    int      test_no = 2;          // int型の変数を宣言・初期化

    if ( test_no == 0 )           // 条件分岐 
    {
        // trueの場合 

        Print( "処理A" );         // 確認用ログ出力

    } 
    else if ( test_no == 1 ) 
    {
        // falseの場合、違う条件で判定 

        Print( "処理B" );         // 確認用ログ出力

    }
    else 
    {
        // 全てfalseの場合 

        Print( "処理C" );         // 確認用ログ出力

    }

    Print( "処理D" );             // 確認用ログ出力

}


結果:
TestProgram EURUSD,H1: 処理C
TestProgram EURUSD,H1: 処理D



プログラミング基礎

3つ以上の条件分岐の場合は、if文と else文の間に、
else if文を追加します。

まず最初にif文で判定を行いfalseであれば、 次のelse if文の判定を行います。
そのelse if文の判定結果もfalseであれば、 最後のelseの処理が行われます。


更に条件分岐を増やしたいのであれば、else if文の判定処理を追加します。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{

    int      test_no = 3;          // int型の変数を宣言・初期化

    if ( test_no == 0 )           // 条件分岐 
    {
        // trueの場合 

        Print( "処理A" );         // 確認用ログ出力

    } 
    else if ( test_no == 1 ) 
    {
        // falseの場合、違う条件で判定 

        Print( "処理B" );         // 確認用ログ出力

    }
    else if ( test_no == 2 ) 
    {
        // falseの場合、違う条件で判定 

        Print( "処理C" );         // 確認用ログ出力

    }
    else 
    {
        // 全てfalseの場合 

        Print( "処理D" );         // 確認用ログ出力

    }

    Print( "処理E" );             // 確認用ログ出力

}


プログラミング基礎



ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
MQL未経験者向け

判定条件が複数の条件分岐

最後に判定条件が複数存在する場合の条件分岐を体得しましょう。
どういう事かと言うと、フラグAとフラグBの2つの条件を見て条件分岐をする状況の事です。


ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    bool      flag_A = true;      // bool型の変数を宣言・初期化
    bool      flag_B = true;      // bool型の変数を宣言・初期化

    bool      result = false;     // bool型の変数を宣言・初期化

    result = flag_A && flag_B;    // 論理演算

    Print( result );              // 確認用ログ出力

}


結果:
TestProgram EURUSD,H1: true



突然bool型という変数が登場しましたが、これはtrue/falseの値を入れる為の変数です。
注目して欲しい部分は

    result = flag_A && flag_B;    // 論理演算


「&&」という論理演算子です。
「&&」は論理積またはAndと呼ばれ、
左辺と右辺の両方がtrueの場合に、trueを返します。
左辺と右辺のいずれかがfalseの場合は、falseを返します。


■「&&」論理積(And)のパターン
左辺 右辺 結果
false false false
false true false
true false false
true true true



もう一つよく使われる論理演算子で「||」があります。
「||」は論理和またはOrと呼ばれ、
左辺と右辺のいずれかがtrueの場合は、trueを返します。
左辺と右辺の両方がfalseの場合に、falseを返します。

■「||」論理和(Or)のパターン
左辺 右辺 結果
false false false
false true true
true false true
true true true


論理積(&&)を用いたif文判定


それでは実際にif文判定で論理積(&&)を使ってみましょう。
変数の値が20以上且つ80以下かどうかを判定します。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    int      temp_value = 50;     // int型の変数を宣言・初期化

    if ( 20 <= temp_value && temp_value <= 80 ) {

        Print( "●範囲内" );         // 確認用ログ出力

    } else {

        Print( "範囲外" );         // 確認用ログ出力
    }

    Print( temp_value );        // 確認用ログ出力
}


結果:
TestProgram EURUSD,H1: ●範囲内
TestProgram EURUSD,H1: 50



プログラミング基礎

temp_valueの値を変化させると結果は以下の通りになります。

■結果一覧
temp_valueの値 結果
19 範囲外
20 ●範囲内
21 ●範囲内
79 ●範囲内
80 ●範囲内
81 範囲外


重要な閾値付近のみ確認しました。
見ての通りtemp_valueの値が20以上 且つ 80以下の場合に、trueのルートを通っています。

理由は、まず左辺と右辺がそれぞれ比較演算子で判定を行っていて、それぞれが判定結果を返します。
もう忘れてしまったかもしれませんが、比較演算子はtrue/falseの結果を返します。
プログラミング基礎

比較演算子の結果を「&&」論理積演算子で判定し、両辺がtrueなのでtrueを返します。
プログラミング基礎

if文は、最後の論理積の判定結果を判定します。
プログラミング基礎


細かい説明をするとこんな感じです。
これもよく使われる演算子なので体得して欲しいのですが、この説明が難しいと感じるのであれば、
ソースコードと結果一覧を眺めて、なんとなく動作を感じ取って下さい。
早い話が、左辺と右辺の両方ともtrueならtrue、それ以外ならfalseという事です。
難しく考える必要はありません。


ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
MQL未経験者向け

論理和(||)を用いたif文判定

今度は逆の論理和(||)を使ってみましょう。
変数の値が20未満又は80より大きいかを判定します。

ソースコード:
#property strict // strictは絶対に削除しない事

//+------------------------------------------------------------------+
//| プログラムスタート
//+------------------------------------------------------------------+
void OnStart()
{
    int      temp_value = 50;     // int型の変数を宣言・初期化

    if ( 20 > temp_value || temp_value > 80 ) {

        Print( "●範囲内" );         // 確認用ログ出力

    } else {

        Print( "範囲外" );         // 確認用ログ出力
    }

    Print( temp_value );        // 確認用ログ出力
}


結果:
TestProgram EURUSD,H1: 範囲外
TestProgram EURUSD,H1: 50




temp_valueの値を変化させると結果は以下の通りになります。

■結果一覧
temp_valueの値 結果
19 ●範囲内
20 範囲外
21 範囲外
79 範囲外
80 範囲外
81 ●範囲内


こちらの場合は 早い話が、左辺と右辺のいずれかがtrueならtrue、それ以外ならfalseという事です。
難しく考える必要はありません。

ところでプログラミング未経験者の人はちゃんと手を動かして説明した通りにプログラムを作成して動作させていますよね?
ただ見ているだけでは全く役に立たないので、面倒でも実際に手を動かして下さい。
MQL未経験者向け


スポンサーリンク


Copyright ©2015 MT4でEA自作しちゃお~ All Rights Reserved.


Top

inserted by FC2 system