MQL4ブック MT4

条件付き演算子 'if - else'

スポンサードリンク

Contents

条件付き演算子 'if - else'

 

原則として、アプリケーションプログラムを作成する場合は、1つのプログラムに複数のソリューションをコーディングする必要があります。 これらのタスクを解決するには、コードで条件演算子 'if-else'を使用できます。

演算子 'if-else'の書式

 

フルフォーマット

 

フルフォーマット演算子 'if-else'には、条件、本体1、キーワード 'else'、および本文2を含む見出しが含まれます。演算子の本体は、1つまたは複数の演算子で構成されます。 体は中括弧で囲まれています。

  if(条件        //演算子と条件のヘッダー 
  { 
 演算子のブロック1 //条件が真であれば、.. 
 複合体1 //複合体1を構成する演算子が実行される 
  } else //条件がfalseの場合.. 
  { 
 演算子のブロック2 //演算子.. ..演算子.. 
 ボディ2の構成体2 //が実行される 
  }

'else'なしの書式

 

演算子 'if-else'は 'else'部分なしで使用できます。 この場合、演算子 'if-else'には、条件を含むヘッダーと、1つまたは複数の演算子で構成され、中括弧で囲まれた本体1が含まれます。

  if( Condition  //演算子と条件のヘッダー 
  { 
 演算子のブロック1 //条件が真であれば、.. 
 複合体1 //複合体1を構成する演算子が実行される 
  }

ブレースなしの書式

 

'if-else'演算子の本体が1つの演算子のみで構成されている場合、囲み中括弧は省略できます。

  if(条件               //演算子と条件のヘッダー 
 オペレータ;  //条件が真であれば、.. 
  //この演算子が実行されます。

 

オペレータ 'if-else'の実行ルール

 

'if-else'の条件が真であれば、ボディ1の最初の演算子に制御を渡します。ボディ1のすべての演算子が実行された後、演算子 'if-elseに続く演算子に制御を渡します'。 演算子 'if-else'の条件がfalseの場合、次のようになります。
- 演算子 'if-else'にキーワードelseがある場合、body 2の最初の演算子に制御を渡します。body 2のすべての演算子が実行された後、それに続く演算子に制御を渡しますオペレータ 'if-else';
- 演算子 'if-else'にキーワード 'else'がない場合、演算子 'if-else'に続く演算子に制御を渡します。

 

演算子 'if-else'の実行例

 

演算子 'if-else'の使い方を示すいくつかの例を考えてみましょう。

問題9.以下の条件が満たされているプログラムを作成する:シンボルの価格が一定以上の値を超えた場合、プログラムはそのことについてトレーダーに通知しなければならない。 この値を超えていない場合、プログラムは何も実行してはなりません。

この問題の解決策の1つは、例えば以下のようなものである( onelevel.mq4 )。

  // ------------------------------------------------ --------------------------------------- 
  // onelevel.mq4 
  //コードは教育目的でのみ使用する必要があります。 
  // ------------------------------------------------ --------------------------------------- 
  int start () //特別な関数 'start' 
  { 
  ダブル 
  レベル  //アラートレベル 
  価格 ;  //現在の価格 
  レベル = 1.2753 ;  //レベルを設定する 
  価格 = 単価 ;  //価格を請求する 
  // ------------------------------------------------ --------------------------------------- 
  if  Price > Level  //条件付きの演算子 'if' 
  { 
  アラート   価格がプリセットレベルを超えました     //トレーダへのメッセージ 
  } 
  // ------------------------------------------------ --------------------------------------- 
  return ;  // Exit start() 
  } 
  // ------------------------------------------------ ---------------------------------------

まず、プログラムがエキスパートアドバイザーとして作成されていることに注意してください。 これは、プログラムが、価格が予め設定されたレベルを超えるとすぐに画面に必要なメッセージを表示するために、かなり長い時間動作することを意味する。 プログラムにはstart()という特別な関数が1つしかありません。 関数の開始時に、変数が宣言されコメントされます。 次に、価格レベルが数値で設定され、現在の価格が要求されます。

演算子 'if-else'は、プログラムの次の行で使用されます。

 // ------------------------------------------------ --------------------------------------- 
  if  Price > Level  //条件付きの演算子 'if' 
  { 
  アラート   価格がプリセットレベルを超えました     // トレーダへのメッセージ 
  } 
  // ------------------------------------------------ ---------------------------------------

実行中のプログラムの制御がオペレータ 'if-else'に渡されるとすぐに、プログラムはその状態をテストし始めます。 演算子 'if-else'の条件付きテストは、この演算子の固有のプロパティであることに注意してください。 このテストは、演算子 'if-else'の実行中に省略することはできません。すべての場合において、この演算子の "逸脱"であり、実行されます。 その後、このテストの結果に応じて、コントロールはオペレーターの身体またはその外部に、閉鎖ブレースに続くオペレーターに渡されます。

Fig。 以下の図37を参照すると、演算子 'if-else'の実行時に可能なイベントシーケンスを表すブロック図が表示されます。

イチジク。 プログラムonelevel.mq4で演算子 'if-else'を実行するためのブロック図。

このダイアグラムおよび以下のダイアグラムでは、ダイヤモンドが条件付きチェックを表しています。 矢印は、現在のステートメントブロックが実行された後にコントロールが渡されるターゲットコンポーネントを示します(ステートメントブロックの用語は、互いに隣接するあるランダムな一連の演算子を意味します)。 この図をもっと詳しく考えてみましょう。

プログラムonelevel.mq4の "Previous Calculations"ブロック(図の灰色のボックス)には、以下が含まれます。

  ダブル 
  レベル  //アラートレベル 
  価格 ;  //現在の価格 
  レベル = 1.2753 ;  //レベルを設定する 
  価格 = 入札 ;  //価格を請求する

このブロックの最後の演算子が実行された後、演算子 'if-else'のヘッダに制御が渡されます。ここで、価格はプリセットレベルを超えていますか? (図のダイヤモンドボックス、図37)がチェックされます:

  if  Price > Level  //条件付きの 演算子 'if'

言い換えれば、この段階のプログラムが次の質問に対する答えを求めていると言うことができます。括弧で囲まれた文が真であるか? ステートメント自体は、書かれているとおり、文字通り聞こえます。変数Priceの値が変数Levelの値を超えています(価格がプリセットレベルを超えています)。 この声明を真であるか偽であるかをチェックする瞬間に、プログラムはすでに変数PriceとLevelの数値を持っています。 答えは、これらの値の比によって決まります。 価格がプリセットレベルを下回っている場合(Priceの値がLevelの値以下の場合)、ステートメントはfalseです。 価格がこのレベルを超える場合、その陳述書は真です。

したがって、条件付きテスト後のコントロールを渡す場所は、現在の市場状況(!)に依存します。 シンボルの価格がプリセットレベルを下回っている場合(答えはいいえ 、つまり文が偽である )、演算子 ' if-else'の実行ルールに従って、コントロールがオペレータの外に渡されます。この場合は、[ 後続計算]という名前のブロック、つまり次の行に移動します。

  return ;  // Exit start()

見やすくすると、トレーダにはメッセージは表示されません。

シンボルの価格がプログラムで設定されたレベルを超えている場合(答えがYes、つまり文が真である )、コントロールは演算子 'if-else'の本体、つまり次の行に渡されます:

  { 
  アラート   価格がプリセットレベルを超えました     //トレーダへのメッセージ 
  }

関数Alert()を実行すると、次のメッセージを含む小さなボックスが画面に表示されます。

価格が既定のレベルを超えました

関数Alert()は演算子 'if-else'の本体内の唯一の演算子であるため、実行後に演算子 'if-else'が完全に実行されたものとみなされ、制御は演算子に渡されます演算子 'if-else'の後に続く行、つまり、

  return ;  // Exit start()

演算子 'return'を実行すると、関数start()の処理が終了し、プログラムはティック・ウェイティング・モードに切り替わります。 新しいティック(シンボルの新しい価格も含む)では、start()関数が再び実行されます。 したがって、プログラム内でコード化されたメッセージは、新しい価格が予め設定されたレベルを超えているか、または超えていないかに応じて、トレーダに与えられるか、または与えられない。

演算子 'if-else'はネストできます。 ネストした演算子をどのように使用できるかを示すために、次の例を考えてみましょう。 その問題はもう少し洗練されています。

問題10.次の条件が満たされている場合にプログラムを作成する:価格が一定のレベル1を超えて増加した場合、プログラムはそれについてトレーダーに通知しなければならない。 価格が一定のレベル2より低くなるように価格が下がった場合、プログラムはそれについてトレーダに通知しなければならない。 ただし、他の場合には、プログラムは何らかのアクションを実行してはなりません。

この問題を解決するには、現在の価格を2回確認する必要があることは明らかです。

1.価格をレベル1と比較し、

2.価格をレベル2と比較します。

問題10の解決策1

 

形式的に作用して、以下の解法を構成することができる。

イチジク。 プログラムtwolevel.mq4で実行される演算子 'if-else'のブロック図。

このアルゴリズムを実現するプログラムは、 twolevel.mq4 ) :

  // ------------------------------------------------ ----------------------- 
  // twolevel.mq4 
  // コードは教育目的にのみ使用する必要があります 。l  
  // ------------------------------------------------ ----------------------- 
  int start () // 特別な関数 'start' 
  { 
  ダブル 
  Level_1  //アラートレベル1 
  Level_2  // アラートレベル 2 
  価格 ;  //現在の価格 
  Level_1 = 1.2850 ;  //レベル1を設定する 
  Level_2 = 1.2800 ;  //レベル2を設定する 
  価格 = 入札 ;  //価格を請求する 
  // ------------------------------------------------ ----------------------- 
  if  Price > Level_1  //レベル1を確認する 
  { 
  アラート   価格はレベル1を上回っています)  ;  //トレーダへのメッセージ 
  } 
  // ------------------------------------------------ ----------------------- 
  if  Price < Level_2  //レベル2を確認する 
  { 
  アラート  " 価格はレベルを上回っています   2 "  ; // トレーダへのメッセージ 
  } 
  // ------------------------------------------------ ----------------------- 
  return ;  // Exit start() 
  } 
  // ------------------------------------------------ -----------------------

簡単に分かるように、プログラムtwolevel.mq4のコードは、プログラムonelevel.mq4の拡張バージョンです。 以前に計算レベルが1つしかなかった場合、この新しいプログラムには2つのレベルがあります。 各レベルは数値で定義されており、問題を解決するためのプログラムは、価格行動を追跡する2つのブロックを持っています。

プログラムの実行について簡単に説明しましょう。

準備計算が実行された後、制御は最初の演算子 'if-else'に渡されます。

  // ------------------------------------------------ ---------------------------------- 
  if  Price > Level_1  //最初のレベルを確認する 
  { 
  アラート   価格はレベル1を上回っています)  ;  //トレーダへのメッセージ 
  } 
  // ------------------------------------------------ ----------------------------------

この演算子の実行時に(メッセージがトレーダーに与えられているかどうかに関係なく)実行されるイベントは、実行後にコントロールが次の演算子 'if-else'に渡されます。

  // ------------------------------------------------ ---------------------------------- 
  if  Price < Level_2  // 2番目のレベルを確認する 
  { 
  警告   価格はレベル 2 を下回っています )」 ;  // トレーダへのメッセージ 
  } 
  // ------------------------------------------------ ----------------------------------

両方の演算子を連続して実行すると、両方の条件テストを実行し、最後に問題を解決する可能性があります。 プログラムが完全にタスクを解決する間、この解決策は絶対に正しいとはみなされません。 非常に重要な点に注意してください。最初のブロックでテストした結果に関係なく、2番目の条件テストが実行されます。 価格が第1レベルを超える場合でも、第2ブロックが実行されます。

プログラマがプログラムを書くときに追求する重要な目標の1つは、アルゴリズムの最適化であることに注意してください。 上の例は単なるデモンストレーションなので、短く実行されたプログラムを表しています。 通常、実際に使用される予定のプログラムははるかに大きくなります。 何百という変数の値を処理し、複数のテストを使用して、それぞれ一定の時間内に実行することができます。 このすべてが、特殊関数start()の作業時間がティックギャップを超える可能性があります。 これは、いくつかのダニが未処理のままである可​​能性があることを意味します。 これはもちろん、非常に望ましくない状況であり、プログラマはそれを防ぐために自分の最善を尽くす必要があります。 プログラム実行の時間を短縮することを可能にする技術の1つは、アルゴリズムの最適化である。

最新の例をもう一度考えてみましょう。今回は、リソースを節約するという観点から考えてみましょう。 たとえば、「価格がプリセットレベル以下ですか」と尋ねる理由は何ですか? 第2のブロックにおいて、第1のブロックの試験が既に価格が上位レベルを上回っていることを検出した場合、 この場合、価格が下位レベルを下回ることはできないので、2番目のブロックで条件テストを行う必要はありません(このブロックで演算子のセットを実行する必要もありません)。

問題10の解決策2

 

上記の理由を考慮して、以下の最適化アルゴリズムを考えてみましょう。

イチジク。 39. twoleveloptim.mq4プログラムで演算子 'if-else'を実行するためのブロック図。

 

上記のブロック図に示すアルゴリズムによれば、プログラム内で冗長な演算は実行されない。 準備計算の後、プログラムは価格が事前設定レベルを上回っているかどうかをテストします。 はいの場合、プログラムはトレーダに対応するメッセージを表示し、制御を後続計算に渡しますが、2番目の条件( プリセットレベル以下の価格ですか?)はテストされません。 価格が上位レベルを上回っていない場合(答えはいいえ )、コントロールは必要な条件テストが実行される第2ブロックに渡されます。 価格が下位レベルを下回った場合、対応するメッセージが業者に表示されます。 そうでない場合、コントロールは次の計算に渡されます。 プログラムがこのアルゴリズムに従って動作する場合、重複するアクションは実行されず、結果としてリソースが大幅に節約されることは明らかです。

このアルゴリズムのプログラムされた実装は、ネストされた演算子 'if-else'の使用を意味します。 twoleveloptim.mq4 ):

  // ------------------------------------------------ ----------------------- 
  // twoleveloptim.mq4 
  // コードは教育目的のみに使用する必要があります    
  // ------------------------------------------------ ----------------------- 
  int start () // 特別な関数   開始() 
  { 
  ダブル 
  Level_1  //アラートレベル1 
  Level_2  // アラートレベル 2 
  価格 ;  //現在の価格 
  Level_1 = 1.2850 ;  //レベル1を設定する 
  Level_2 = 1.2800 ;  // レベル 2を 設定する 
  価格 = 入札 ;  //価格を請求する 
  // ------------------------------------------------ ----------------------- 
  if  Price > Level_1  // レベル1を確認する 
  { 
  アラート   価格はレベル1を上回っています)  ;  //トレーダへのメッセージ 
  } 
  else 
  { 
  if  Price < Level_2  // レベル2を確認する 
  { 
  アラート  "   価格はレベル 2 を上回っています "  ; // トレーダへのメッセージ 
  } 
  } 
  // ------------------------------------------------ ----------------------- 
  return ;  // Exit start() 
  } 
  // ------------------------------------------------ -----------------------

 

この計算ブロックに注意してください:

  // ----------------------------------------------------- -------------------- 

  if  Price > Level_1  // レベル1を確認する 
  { 
  アラート   価格はレベル1を上回っています)  ;  //トレーダへのメッセージ 
  } 
  else 
  { 
  if  Price < Level_2  // レベル2を確認する 
  { 
  アラート  "   価格はレベル 2 を上回っています "  ; // トレーダへのメッセージ 
  } 
  } 
  // ----------------------------------------------------- --------------------

第2の条件がテストされる演算子 'if-else'は、第1の条件をテストする第1の演算子 'if-else'の構成要素である。 ネストされた演算子はプログラミングの実践において広く使用されています。 これはしばしば妥当であり、場合によっては唯一可能な解決策です。 もちろん、関数Alert()の代わりに、実際のプログラムは、他の関数や演算子を使用してさまざまな有用なアクションを実行することができます。

 

複合式は、演算子 'if-else'の条件としても使用できます。

問題11.次の条件を実現するプログラムを作成する:価格が事前設定された値の範囲内にある場合は、何もしないでください。 価格がこの範囲外の場合、プログラムはそのことについてトレーダーに通知しなければなりません。

この問題の声明は、問題10のそれと似ています。違いは、この場合、事前に定義された範囲よりも高いまたは低い価格動きの方向には関心がないということです。 問題の状況によると、事実だけを知る必要があります。価格は範囲内か範囲外か? メッセージの表示に同じテキストを使用できます。

ここでは、前述の解決策と同様に、上位レベルと下位レベルの2つのレベルに関連して価格ステータスを確認する必要があります。 図1に示す解法を棄却した。 38を非効率的とみなす。 したがって、上記の推論によれば、以下の解決法を提案することができる:

イチジク。 40.問題11の解の1つのブロック図。

ただし、このアルゴリズムを使用する必要はありません。 この図は、アルゴリズムが、プログラムの異なるポイントで同じメッセージブロックを使用することを示していることを示しています。 プログラム行は、それらの実行が同じメッセージを生成することにもかかわらず、繰り返されます。 この場合、唯一の演算子 'if-else'を複雑な条件で使用する方がはるかに効率的です。

イチジク。 プログラムcompoundcondition.mq4の演算子 'if-else'を実行するためのブロック図。

このアルゴリズムを実装するプログラムのコードは、次のとおりです( compoundcondition.mq4 )。

  // ------------------------------------------------ --------------------------------- 
  // compoundcondition.mq4 
  // コードは教育目的でのみ使用する必要があり ます。 
  // ------------------------------------------------ --------------------------------- 
  int start () //特別な関数 'start' 
  { 
  ダブル 
  Level_1  //アラートレベル1 
  Level_2  //アラートレベル2 
  価格 ;  //現在の価格 
  Level_1 = 1.2850 ;  //レベル1を設定する 
  Level_2 = 1.2800 ;  //レベル2を設定する 
  価格 = 入札 ;  //価格を請求する 
  // ------------------------------------------------ -------------------------------- 
  if  Price > Level_1 || Price < Level_2  //複雑な条件をテストする 
  { 
  警告   価格は設定範囲外です   ;  //メッセージ 
  } 
  // ------------------------------------------------ -------------------------------- 
  return ;  // Exit start() 
  } 
  // ------------------------------------------------ --------------------------------

このプログラムソリューションの重要な洞察は、演算子 'if-else'での複雑な条件の使用です。

 if  Price > Level_1 || Price < Level_2  //複雑な条件をテストする 
  { 
  警告   価格は設定範囲外です   ;  //メッセージ 
  }

変数Priceの値が変数Level_1の値を超える 、変数Priceの値が変数Level_2の値よりも小さい場合、プログラムは演算子 'if-else'の本体を実行する必要があります。 演算子 'if-else'の条件を構成するときに論理演算( &&||および )を使用することは許されており、プログラミングの実践で広く使用されています( ブール(論理)演算を参照)。

他の問題を解決するには、より複雑な条件を作成する必要がありますが、これは疑問もありません。 ネストされたものを含むいくつかの式は、かっこで囲むことができます。 たとえば、次の式を演算子 'if-else'の条件として使用できます。

  if  A > B &&  B <= C ||  N != K && F > B + 3 ))  //複雑な条件の例

したがって、MQL4はネストされた構造体を含むことができ、簡単で複雑なテスト条件を使用することができ、分岐を伴う単純で複雑なプログラムを作成する可能性があります。アルゴリズム。

スポンサードリンク

-MQL4ブック, MT4
-,

© 2024 FX・ビットコイン・オプションのシステムトレード開発と取引録 Powered by AFFINGER5