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

FXとビットコインのシステムトレードの開発録、オプション取引の履歴を書き連ねています。MT4, Pythonで開発しています。

MQL4ブック MT4

演算子 'break'

スポンサードリンク

演算子 'break'

 

たとえば、いくつかのサイクル操作をプログラミングする場合、条件が偽になる前にサイクルの実行を中断する必要が生じることがあります。 このような問題を解決するには、演算子 'break'を使用する必要があります。

演算子 'break'の形式

 

演算子 'break'は1つの単語のみで構成され、文字「;」で終わります。 (セミコロン)。

オペレータブレークの実行ルール

 

  演算子 'break'は、 'while'、 'for'または 'switch'型の最も近い外部演算子の実行を停止します。 演算子 'break'の実行は、 'while'、 'for'または 'switch'型の複合演算子の外にあるコントロールを最も近い後続の演算子に渡すことにあります。 演算子 'break'は、上記の演算子の実行を中断するためにのみ使用できます。

次の例では、演算子 'break'の実行を視覚化することができます。

問題14. 1メートルの長さのスレッドを作ってみましょう。 可能な限り最大の面積を持つ矩形の形でスレッドを配置する必要があります。 また、この矩形の面積と辺の長さを1ミリメートルの精度で求めることが必要である。

 

ユニタリスレッドのスレッドで作られた異なるサイズの長方形の無制限の量が存在することがあります。 問題文で要求される精度は1mmなので、499種類しか考慮できません。 最初の「最も薄い」矩形は1×499mmの寸法を有し、2番目の矩形は2×498mm等であり、最後の矩形の寸法は499×1mmである。 これらの矩形をすべて検索し、最も面積の大きい矩形を見つけなければなりません。

容易に観察されるように、我々が検討している矩形のセットには、繰り返される次元がある。 たとえば、最初の矩形と最後の矩形は同じサイズ(1×499 mm(499×1 mmと同じ))です。 同様に、2番目の矩形の大きさは最後の1つの矩形と同じになります。すべてのユニークなバリエーションを検索するアルゴリズムを作成する必要がありますが、繰り返しの検索は必要ありません。

まず、領域と矩形内の辺の長さの関係を見積もりましょう。 分かりやすいように、最初の矩形は、1x499のサイズで最小の領域を持ちます。 そして、短辺の増加に伴い、矩形の面積も増加する。 特定の値に達するとすぐに、長方形の領域が再び減少し始めます。 この関係を図8に示す。 以下の44

イチジク。 44.矩形領域と、その辺の1つの長さとの間の関係。

図1を見る。 図44に示すように、計算中に面積が増加する限り、最初のものから変化を探索することによって最大面積を見つけなければならないという結論に容易に到達することができる。 減少が始まるとすぐに、検索を中断して検索サイクルを終了します。 以下はそのようなアルゴリズムを実装するスクリプトrectangle.mq4です。

このプログラムの仕組みを見てみましょう。 変数は、プログラムの先頭で宣言され、コメントされます。 問題解決のアルゴリズムは、 'for'サイクル内で実現される。 Expression_1では、矩形の辺aの初期値が1に指定されています。 条件に従って、長方形の側面aのサイズがスレッドの長さの半分よりも小さいままである限り、値が検索されます。 Expression_2は、各繰り返しステップで現在の矩形の辺の長さaを増やすように規定しています。

変数a、b、およびsは現在の変数であり、その値は検索されます。変数A、BおよびSは検索値です。 矩形の第2の面bおよび領域sは、サイクルの始めに計算される。

サイクルを終了する条件は、演算子 'if'でテストされます。

新たに計算された現在の矩形の面積sが、前の繰り返しで計算された面積Sよりも大きい場合は、この新しい値sが最良の結果となる。 この場合、演算子 'if'の条件が満たされず、演算子 'if'に続く最も近い演算子に制御が渡されます。 以下は、最良の結果を保存する行です。

プログラムが最も近い閉じ括弧に到達するとすぐに、反復は終了し、式2を実行し条件をテストするために、制御は演算子 'for'のヘッダーに渡されます。 側面aの長さが試験の時点で指定された限界に達していない場合、サイクルは実行され続けます。

繰り返しサイクリック計算は、次のイベントのいずれかが発生するまで続けられます。サイドaの長さが(operator 'for'の条件に従って)事前定義されたリミットを超えるか、計算されたエリアsのサイズが変数Sに格納されている以前に発見された値よりも小さい。 演算子 'if'の条件に応じたループの終了がより早く行われると信じるべき十分な理由があります:

実際、 'for'のサイクル演算子は、例外なくすべてのバリエーションを検索するように構成されています(スレッド長の半分L / 2は長方形の2辺の合計です)。 同時に、矩形の最大面積は、検索されたバリエーションの中央のどこかに到達します。 したがって、直ちに(現在の矩形sの面積が以前に到達した値Sよりも小さいか等しい)、演算子 'if'の実行内の制御は演算子 'break'に渡されますそれは順番に、演算子 'のために'外のコントロールを次の行に渡します:

標準関数Alert()の実行の結果、次の行が出力されます。

最大面積 = 62500 А=250 В=250

その後、コントロールは演算子 'return'に渡され、特殊関数start()が終了します。 これにより、スクリプトが終了し、クライアント端末によってシンボルウィンドウからアンロードされます。

この例では、演算子 'break'は、サイクル演算子 'for'、つまりそのサイクル演算子を停止します(外に制御を渡します)。以下は、特別な終了を伴う 'for'サイクルのブロック図です。

イチジク。 45.演算子 'break'( rectangle.mq4 )を使用して 'for'サイクルのブロック図。

この図からわかるように、通常の出口(サイクルオペレータヘッダで指定された条件のトリガに起因するサイクル出口)と特別な出口(追加の条件によるサイクルボディ出口とオペレータ'ブレーク')。

1つのサイクルで特別な出口を使用する可能性を過大評価することは困難です。 この例では、演算子 'break'を使用すると、必要な計算だけを実行するアルゴリズムを作成できます。特別な出口を持たないアルゴリズムは非効率的である。この場合、繰り返し計算が実行され、時間と計算資源の無駄な浪費となる。 図2のクロスハッチ領域は、 44は、上記のプログラムで処理されなかったパラメータの領域(すべての計算のほぼ半分)を視覚化します。これは正しい結果を得ることを妨げませんでした。

効果的なアルゴリズムを使用する必要性は、プログラムの実行時間が数秒から数分に及ぶ場合に特に顕著になり、ティック間の時間間隔を超える可能性があります。 この場合、有益なダニの処理を省略し、その結果、取引のコントロールを失うリスクがあります。 また、戦略テスターでプログラムをテストすると、計算時間の短縮が特に深く感じられます。 長い歴史の中で洗練されたプログラムをテストするには、数時間から数日かかることがあります。 この場合、テストの半分の時間は非常に重要な機能です。

ルールは、演算子 'break'が最も近い外部演算子を停止することを示します。 入れ子にされたサイクルを使用するプログラムの仕組みを見てみましょう。

問題15.問題14のアルゴリズムを用いて、1メートルの倍数の最短スレッドを探索し、1.5平方メートルの面積を有する長方形を形成するのに十分である。

この問題では、使用可能なスレッドの長さを直線的に検索し、各スレッドの長さの最大領域を計算する必要があります。 問題15の解は、 area.mq4という名前のスクリプトで実現されています。 ソリューションのバリエーションは、内部および外部の2つのサイクルで検索されます。 外部サイクルは、1000mmのステップでスレッド長を検索しますが、内部スレッドは現在のスレッド長の最大領域を検出します。 この場合、演算子 'break'は、外部サイクルと内部サイクルの両方を終了するために使用されます。

これまでの問題の解決法と同様に、内部サイクルがここで機能します。 指定されたスレッドの長さに対して最大面積が見つかった場合、演算子 'break'を使用して 'for'サイクルを終了します。 内部サイクル 'for'で指定されたオペレータ 'break'は、 'for'サイクルを閉じるブレースに続くオペレータに制御を渡し、このようにサイクルを停止することに注意する必要があります。 この現象は、何らかの形で外部サイクル演算子 'while'の実行に影響を与えません。

オペレータ 'ブレーク'が内部サイクル 'for'でトリガされるとすぐに、制御はオペレータ 'if'に与えられます。

演算子 'if'では、見つかった領域が1.5m²以上であるかどうかを確認します。問題のステートメントで許容される最小値です。 「はい」の場合、解が見つかり、計算を続行する意味がありません。 コントロールは演算子 'if'の本体に渡されます。 演算子 'if'の実行可能部分は2つの演算子で構成され、最初のものは見つかった解についてのメッセージを画面に表示します。

糸の長さは5mでなければなりません。

第2演算子 'break'は、外部サイクル 'while'を終了し、その後プログラムを終了するために使用されます。 プログラムarea.mq4で実現されるアルゴリズムのブロック図を以下に示します。

イチジク。 46.内部および外部サイクル( area.mq4 )からの特別な終了の可能性を実現するプログラムのブロック図。

この図からわかるように、各サイクルには正常終了と特別終了があります。 各演算子 'ブレーク'は、対応するサイクルを停止しますが、他のサイクルには影響しません。 それぞれの特殊出口は、それ自身の演算子 'break'に対応しています。 両方のサイクルで同じ演算子 'break'を特別な終了として使用することはできません。 この場合、各サイクルには特別な出口が1つしかありません。 しかし、一般に、複数の演算子 'break'を使用して、1つのサイクルで複数の特殊な終了を行うことは可能です。

外部サイクル 'while'のヘッダーのConditionは(true)です。つまり、プログラムの実行中に値が変更される変数を含まないテキストです。 これは、ヘッダに指定された条件の下でプログラムが決してサイクルを終了しないことを意味します。 この場合、サイクルを終了する唯一の可能性は演算子 'ブレーク'を使用することです。

この例では、アルゴリズムは、実際にはプログラムが内部サイクルと外部サイクルの両方を終了するために特別な出口のみを使用するように構成されています。 しかし、演算子 'break'を使用すると、常に特別な終了を意味するアルゴリズムが構築されるとは考えないでください。 他のプログラムのアルゴリズムでは、プログラムが条件に達し、通常の終了を使用してそのサイクルを終了する可能性があります。

オペレータ 'スイッチ'の外にコントロールを渡すためにオペレータ 'ブレーク'を使用する方法は、オペレータ 'スイッチ'セクションで考慮されます。

スポンサードリンク
スポンサードリンク

-MQL4ブック, MT4
-,