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

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

MQL4ブック MT4

関数

投稿日:

スポンサードリンク

関数

関数の用語

コンピュータエンジニアリングにおける最も重要な技術革新は、問題を解決するためのデータ処理のルールを記述したり、小さなタスクを完了したりするために、別々のコードフラグメントを作成して格納する可能性があります。 このような可能性もMQL4に存在します。

関数 は、データ変換の方法を記述するプログラムの名前付きの特定の部分です。

関数の2つの側面、すなわち関数の説明と関数呼び出しについて検討します。

関数の記述 は、実行を意図したプログラムの特定の名前付き部分です。

関数呼び出し (または関数参照)はレコードであり、その実行によって、その関数が参照する関数が実行されます。

私たちの日常生活では、機能の多くの類似点を見つけることができます。 例えば、自動車のブレーキシステムを取る。 エンジニアが実施するアイデアと同様に、適切に制動を行う作動機構は機能のようなものですが、ブレーキペダルは機能呼び出しのようなものです。 運転者がペダルを押し下げ、作動機構が何らかの動作を行い、車を停止させる。

同様に、プログラム内で関数呼び出しが発生すると、同じ名前の関数が呼び出されて実行されます。 つまり、メッセージの表示や注文の開始など、一連の計算やその他のアクションが実行されます。 関数の一般的な使用は、コードの論理的に完成した部分をプログラムの基本的なテキストから取り出し、コードのこの部分の呼び出しのみで置き換えることです。 このようなプログラムの構築には、いくつかの大きな利点があります。

• まず、このようにして作成されたプログラムテキストは、はるかに読みやすくなります。

• 次に、プログラムの基本コードを変更せずに、関数のテキストを簡単に表示および変更することができます。

• 第3に、関数を1つのファイルとして構成し、他のプログラムで使用することができます。 これにより、プログラマーは、新しく作成された各プログラムにコードの同じ断片を挿入する必要性がなくなります。

MQL4のほとんどのコードは関数の形で書かれています。 このアプローチは広く普及し、今や標準です。

関数の構成

したがって、関数を記述して呼び出すことができます。 例を考えてみましょう。 図18のように、直角三角形とピタゴラス定理の2つの辺を使って斜辺の長さを求める小さなプログラムがあるとします。

このプログラムでは、すべての計算が一緒に配置されています。 演算子は、プログラム内で(上から順に)順に実行されます。

図18 単一のプログラムpifagor.mq4のコード。

問題8 与えられたプログラムコードの一部を関数として作成する。

検索値を見つける2つの行を使用して関数を作成することは合理的です。 関数を使用した同じプログラムを図19に示します。

このプログラムでは、計算の一部が関数として構成されています。 基本コードには、ユーザー定義の関数呼び出しが含まれています。 ユーザー定義関数の説明は、基本コードの外側(後)にあります。

図19 ユーザー定義関数の記述とその呼び出しを含むプログラムのコード。gipo.mq4

両方のバージョンのプログラムで同じ結果が得られます。 ただし、コードは図18の最初のバージョンでは単一のモジュールとして構成されますが、図19の2番目のバージョンでは、計算の一部が基本テキストから呼び出される関数で実行されます。 関数内の計算が完了すると、メインコード内の計算が続行されます。

関数を実行させるには、関数を呼び出す必要があります(参照してください)。 これは、関数が実際に関数(関数の説明)を構成するコード自体と関数を呼び出すために使用される関数呼び出し(関数を参照する)の2つの部分で実際に表される理由です。 関数を呼び出さないと、その関数は実行されません。 同時に、存在しない関数を呼び出すと、何も起こりません。 実際、MetaEditiorはMQL4でこのようなプログラムをコンパイルしようとするとエラーメッセージを表示します。

機能の説明

関数の説明は、関数ヘッダーと関数本体という2つの基本部分で構成されています。

関数の ヘッダー は、戻り値の型、関数名、および仮パラメータのリストで構成されます。 仮パラメータのリストは、カッコで囲まれ、関数名の後に置かれます。 戻り値の型は、すでに知っている int 、 double 、 bool 、 color 、 datetime 、 または stringの いずれかの型にすることができ ます 。 関数が値を返さない場合、その型は void (内容なし、空)またはその他の型として 示すことができ ます。

関数の 本体 は中かっこで囲まれています。 関数本体には、単純な演算子や複合演算子が含まれていてもよく、他の関数の呼び出しを含んでいてもよい。 関数によって返される値は、return()演算子のかっこで与えられます。 return()を使用して返される値の型は、関数ヘッダーで指定された関数型と一致する必要があります。 関数の説明は閉じ中かっこで終わります。

図20 機能の説明。

関数の記述は、プログラム内で、他の関数の外(関数の内部ではなく)に別々に置く必要があります。

関数呼び出し

関数呼び出しに は、関数名と転送されるパラメータのリストが含まれます。 転送されたパラメータのリストは、かっこで囲まれ、コンマで区切られています。 関数呼び出しは、別の演算子として、または演算子の一部として表すことができます。

図21 関数呼び出し(関数への参照)。

関数呼び出しは、常に他の関数内で指定されます(つまり、他の関数の外側ではなく、そのいずれかの内部にあります)。

関数型

関数には、特殊関数、標準(組み込み関数、事前定義済み)関数、ユーザー定義関数の3種類があります。

特別な機能

MQL4には、合計3つの特殊機能があります。 init() 、 start() 、 deinit ()のような 名前があらかじめ 定義されてい ます。 これら は他の関数の名前として使用することはできません。 特殊機能の詳細な考察は、特殊機能に記載されてます。 ここでは、図18と図19のように、プログラムの基本コードがこれらの関数内に配置されているとしか言いません。

特別な機能の特別な特徴は、それらがクライアント端末による実行のために呼び出されるという事実である。 特別な関数は一般的に関数のすべての特性を持っていますが、このプログラムが適切にコーディングされていれば、通常はその関数から呼び出されません。

標準機能

MQL4には、プログラムをコーディングするときに記述する必要のない、多くの便利な機能があります。 たとえば、平方根の計算、システムジャーナルへのメッセージの印刷、その他の多くの標準関数の実行は、あらかじめ定義されたアルゴリズムに従って実行されます。 これらの機能の内容を知る必要はありません。 あなたは、すべての標準機能が専門家によって適切に、そして可能な限り最良のアルゴリズムに従って開発されていることを確かめることができます。

標準機能の特長は、プログラムのテキストに記述されていないことです。 標準関数は、他の関数を使用する場合と同じ方法で、単にプログラム内で呼び出されます。 (コーディング言語の中ではよくあることです。)

この例(図18と図19)では、MathSqrt()とAlert()という2つの標準関数が使用されています。 前者は平方根を計算するためのものであり、後者は画面にメッセージを出力するものです。 標準関数のプロパティは、標準関数でより詳細に検討されます。 ここでは、これらのレコードが標準の関数呼び出しを表しているのに対し、これらの関数の説明はプログラム内には存在しないことに注意してください。 標準関数は、組み込み関数、またはあらかじめ定義された関数に名前を付けることもできます。 これらの用語を使用することができます。

ユーザー定義関数

場合によっては、プログラマーが独自の関数を作成して使用する場合があります。 これらの関数をユーザー定義関数と呼びます。 ユーザー定義関数は、関数の説明と関数呼び出しの両方を持つプログラムで使用されます。

関数型 機能の説明 関数呼び出し
特別 適用可能 適用できません (*)
標準 適用できません 適用可能
ユーザー定義の 適用可能 適用可能

(*)特別な機能は技術的にはプログラムから呼び出すことができますが、そうすることはお勧めしません。

表1 さまざまな種類の関数のプログラムで使用される関数の説明と関数呼び出し。

関数のプロパティ

すべての関数の主な特性は、呼び出された関数が実行されることです。 機能はコードに従って実行されます。

渡されたパラメータと戻り値

受信して返される情報に関して、関数は標準的な電卓のようなものです。 1つずつ入力された複数の値からなる特定の式を(キーボードを使用して)入力すると、1つの値が回答として取得されます。 関数は、実行のためにこの関数を呼び出したプログラムから1つまたは複数のパラメータを取得して処理することができ、その関数を呼び出したプログラムへの応答として1つのパラメータを返す(送信する)。

渡されたパラメーター は、呼び出される関数の名前の後にカッコで囲んで指定します。 渡されたパラメータは通常カンマで区切られます。 関数に渡されるパラメーターの数は、64を超えてはいけません。関数は、渡されたパラメーターを使用しないこともできます。 この場合、パラメータの空のリストが指定されます。つまり、関数名の直後に括弧と括弧を入れます。

関数呼び出しで渡されるパラメーターの数、タイプ、および順序は、関数の説明で指定された仮パラメーターの数、タイプ、および順序と一致しなければなりません。 (デフォルトのパラメータを持つ関数の呼び出しは免除です。 関数呼び出し関数の説明および演算子「return」を参照してください)。 一致しない場合、MetaEditorはエラーメッセージを表示します。 定数、変数、式、および配列は、渡されたパラメータとして使用できます。

戻り値 は、演算子return()のかっこで指定します。 関数の説明と演算子 "return"を参照)。演算子return()を使用して返される値の型は、関数ヘッダで指定された関数の型と一致しなければなりません。 また、関数が値を返さない可能性もあります。 この場合、演算子return()のかっこには何も指定されていません。

図21の例では、渡されたパラメータは変数 A と Bです が、戻り値は変数 cです (図20)。 渡されたパラメータと正式なパラメータのタイプを一致させる要件は、次の図22に示されています。

icon_attention 関数呼び出しで渡されるパラメーターの数、タイプ、および順序は、関数の説明で指定された仮パラメーターの数、タイプ、および順序と一致しなければなりません。 関数記述のヘッダーには、仮パラメーターとして変数のみを使用できます。

図22 渡されたパラメータと仮パラメータの数、型、順序が一致します。 渡されるパラメーターとしては変数のみが使用されます。

変数、式、および定数だけが渡されたパラメーターとして使用できます。

図23 渡されたパラメータと仮パラメータの数、型、順序が一致します。 渡されるパラメーターには、定数、式、および対応する型の変数が使用されます。

形式的パラメータ

関数の主な特徴は、仮パラメータの使用です。

正式なパラメータ は、関数の説明のヘッダに指定された変数のリストです。

これまでに、1つの関数を複数のプログラムで使用できることについて説明しました。 しかし、プログラムによっては変数に異なる名前を使用することがあります。 関数が変数の名前(それに対応してその値も)に厳密に一致する必要がある場合、プログラマーにとっては便利ではありません。 実際には、以前にあなたの関数ですでに使用されていた変数の名前で、新しく開発された各プログラムを作成する必要があります。 しかし、幸いなことに、関数内で使用される変数は、プログラムで使用される変数とは関係ありません。

再び図20と図21を参照してみましょう。 渡されたパラメータの名前( 関数呼び出しのカッコ内に与えられた A と B )は、関数の記述で指定されたパラメータ( a と b )の 名前と一致しないことに注意して ください。 定数と変数では、MQL4では大文字と小文字が区別されていることがわかりました。 したがって、 ここでは A と a と B と b という名前は異なる変数名です。 ただし、このコードにはエラーはありません。

関数記述で使用される変数(仮パラメータ)は、プログラムの基本コードで使用される変数とは関係ありません。 彼らはちょうど異なる変数です。 関数ヘッダーでは、定数ではなく変数のみが仮パラメータとして指定できます。

使い方

• プログラムでは関数呼び出しが発生し、変数 A と B は呼び出しのかっこ内に指定されています。

• プログラムは、 ヘッダに指定された 仮パラメータ a と b を持つ同じ名前の関数を呼び出します 。

• 変数 Aの 値は変数 a に割り当てられ ます。

• 変数 Bの 値は変数 b に代入されます 。

• 実行可能関数は、変数 a および bの 値を使用して計算を実行し ます。

仮パラメータには任意の名前を使用できますが、名前はプログラムで使用されている変数の名前と一致していてはなりません。 この例では、仮パラメータ a と bの 識別子を使用しました 。 ただし、 m 、 n 、 Kat_1 、 Kat_2 など他のものを使用することもできます 。 もちろん、プログラムを書くときには、ヘッダに与えられた変数の名前を使う計算を関数本体で指定するべきです。 ヘッダに a と b を 与えたので 、関数 m と n ではなく 、関数 a と b で使わなければなりません 。

ある関数では、仮引数 a と b を含む が、変数 A と b ではなく 、計算が行われる 。 ある関数では、 これらの変数の値の変更を含む、 仮パラメータ a と b に対して許可されたアクションが実行され ます。 これは変数 A と Bに は何の影響も与えません 。

関数で計算された戻り値は、演算子return()のかっこ内に示されています。 変数の値、式の結果、または定数を戻り値として使用できます。 私たちの場合、これはローカル変数 cの 値 です。(ローカル変数は関数内で宣言された変数です;関数を終了すると、すべてのローカル変数の値は失われます;ローカル変数は変数の種類で詳しく説明します)。関数は、ローカル変数 c (図19のように)。 これは、この値が変数 C に割り当てられることを意味します 。

呼び出し関数内で宣言された変数を使用して、プログラム内のさらなる計算を実行することができます。 私たちの場合、呼び出し関数は特殊なstart()関数で、ユーザー定義関数を呼び出す行が含まれていますが、呼び出し関数内で宣言された変数は A 、 B 、 C です。 したがって、この関数では、仮パラメータを使用して計算が実行されます。これにより、プログラムで実際に使用される値の名前にかかわらず、変数の任意の名前を使用して関数を作成できます。

例:プログラム内の標準関数

まず、図18に示すプログラムの動作を考えてみましょう。プログラムのコード全体が特別なstart()関数の中にあることに注意してください。 このトレーニング段階では、特に注意を払っていません。 (特殊関数とそのプロパティについては、 特殊関数で詳しく説明してます)。

代入演算子で始まるプログラムの実行に従ってみましょう。

1.代入演算子の右部分には、指定された定数が含まれています。 その値は3です。

2. 3の値(右側の部分の値)は、変数 A (代入演算子の等号記号の左側にある )に割り当てられ ます。

制御は次の行に与えられます。

3.代入演算子の右部分には、指定された定数が含まれています。 その値は4です。

4.変数 Bに 4の値が割り当てられ ます。

プログラムは次の行の実行に移ります。

5.この実行は、代入演算子の右部分の計算から開始されます。 計算の結果は25という値になります(プログラムが値を取る変数を参照する方法の詳細は、 定数と変数で考慮されます)。

変数 C_2への 値25の代入 。

次の行は代入演算子を表し、右辺には標準関数の呼び出しが含まれています。

プログラムは、代入演算子を実行しようとします。 この目的のために、最初に等号の右に計算を実行します。

7.プログラムは、平方根を計算する標準関数MathSqrt()の実行を呼び出します。 変数 C_2、25の 値が 渡されたパラメータになります。 プログラムのどこにでもこの標準関数の記述がないことに注意してください。 標準機能の記述は、プログラム内に配置してはいけません。 (プログラムのテキストでは、標準の関数呼び出しをその外観によって簡単に区別することができます;デフォルトでは濃い青でMetaEditorで強調表示されますが、別の色を選択することもできます)。

計算は、標準関数MathSqrt()で行われます。

9.標準関数MathSqrt()の計算が完了しました。 得られた値5(25の平方根)を返します。

関数が返す値は、レコードの内容になりました。

このレコードは、計算が実行される特別な複雑な変数と考えることができます。 これらの計算が完了した後、そのことは価値があります。 関数によって返された値は、別の変数に代入することも、他の計算で何らかの形で考慮することもできます。

10.この場合、値は代入演算子の右部分の値です。 代入演算子の実行を続けると、プログラムは5の値を変数 C に代入し ます。

11.次の行には、標準のAlert()関数を呼び出す演算子が含まれています。

標準のAlert()関数は、渡されたパラメータの値が表示されるダイアログボックスを開きます。 この場合、関数は渡されたパラメータとして2つの値をとります:文字列定数 "Hypotenuse ="と整数変数 C は5です。

すべての関数が値を返さなければならないわけではないことに注意してください。 標準のAlert()関数は、別のタスクを持っているので値を返しません。スクリーン上のテキストを特別なウィンドウに表示する必要があります。

標準のAlert()関数を実行すると、画面に次の行のウィンドウが表示されます。

催眠術= 5

12.このプログラムの最後の演算子は、特殊なstart()関数の処理を完了します。

プログラムの作業はこの時点で終了します。

どの標準関数が値を返すのか、どの標準関数が値を返すのかをどのように知ることができるのでしょうか? この質問に対する答えは明白です:組み込み関数の詳細な説明を見つけるには、MQL4.community、 MetaQuotes Software Corp.が起動したWebサイト、 MetaEditorのヘルプファイルを参照してください。 ユーザー定義関数のプロパティーは、その記述で指定されています。 ユーザー定義関数が値を返すかどうかは、そのアルゴリズムに依存します。 関数のプログラムコードを記述しながら決定します。

例:プログラム内のユーザ定義関数

図19のユーザー定義関数を含むプログラムで同じ計算がどのように行われたかを考えてみましょう。特殊なstart()関数で以前に見つかったコードの一部は現在利用できません。 これは、ユーザー定義関数の呼び出しに置き換えられます。 ただし、特殊なstart()関数の後には、ユーザー定義関数の説明が続きます。

整数変数 A と B が数値をとる 最初の2行は 同じままです。 したがって、実行の変更はありません。

3行目に代入演算子があります。 その右側の部分には、ユーザー定義関数の呼び出しが含まれています。

6.この演算子を実行すると、プログラムはまずユーザー定義関数を呼び出します。

ユーザ定義関数の記述は、プログラム内に存在し、特殊なstart()関数を閉じる(特別な関数の外で)中括弧の直後に置く必要があることに注意してください。

ユーザー定義関数を参照すると、プログラムは以下のステップを実行します。

6.1。 その値を得る ために変数 A を 呼び出す (ここでは3つ)

6.2。 その値を得る ために変数 B を 呼び出す (この場合、4つ)

プログラムがユーザー定義関数を呼び出すとすぐに(この関数はユーザー定義ですが、このルールはすべての関数に適用されます)、プログラムは変数として使用される変数の値のコピーを取得しますこれらの変数自体(この場合は A と B )の値は、ユーザー定義関数の適用によって変更されるものではなく、実際には変更されません。

7.コントロールがユーザー定義関数に渡されます。

ユーザー定義関数が実行されている間は、呼び出しプログラムの変数の値は失われませんが、格納されます。

ユーザー定義関数の説明の最初の行はそのヘッダーです。

ユーザー定義関数を実行すると、プログラムは以下のステップを実行します。

7.1。 3の値(渡されたパラメーターのリストの最初の値)は、変数 a (仮パラメーターのリストの最初の変数 )に割り当てられ ます。

7.2。 4の値(渡されたパラメーターのリストの2番目の値)は、変数 b (仮パラメーターのリストの2番目の変数 )に割り当てられ ます。

その後、制御は関数本体に渡され、そのアルゴリズムが実行されます。

関数本体の最初の演算子は次の行です。

7.3。 この演算子を実行すると、プログラムは代入演算子の右部分の値を計算し、得られた値(ここでは3 * 3 + 4 * 4 = 25)を変数 c2 に代入し ます。

次の演算子は次のコード行です。

7.4。 ここで変数 c2の 値の平方根を求め ます。 操作の順序は前の例と同じです。 標準機能の説明も使用されていません。 代入演算子を実行すると、5の値が変数 c に代入され ます。

7.5。 次の行には、次の演算子があります。

この演算子を実行すると、プログラムはこの演算子のかっこで囲まれた値を(ユーザ定義関数の呼び出しサイトに)返します。 私たちの場合、変数 cの 値は 5です。

この時点で、ユーザ定義関数の実行は終了し、制御はコールサイトに戻されます。

ユーザ定義関数が次の演算子から呼び出されることを思い出してください。

レコード(ユーザー定義関数呼び出し)は、値を返す段階で、関数で計算された値、 5を とり ます。

代入演算子の実行が完了すると、プログラムは 5の 値を 変数 C に代入し ます。

9.次の演算子は、前の例と同じ方法で実行されます。

つまり、特別なウィンドウでメッセージが表示されます。

催眠術= 5

10.このプログラムの最後の演算子は、特殊なstart()関数の処理を完了させ、同時にプログラム全体の作業を完了します。 (特殊関数のプロパティは特殊関数で詳細に検討されています。)

上記のユーザー定義関数のいくつかの実装バージョンを考えてみましょう。 ユーザー定義関数を使用したプログラミングには、わかりやすい利点があることを簡単に検証できます。

ユーザ定義関数Gipo()の以前に考えられた実装は、

この関数では、仮パラメータは基本プログラムで使用される変数に "似ています"。 しかし、 A と a は変数の名前が異なる ため、これは正式な類似点に過ぎません 。

ユーザ定義関数Gipo()の実装:バージョン2

この場合、仮パラメータの名前は、基本プログラムで使用される変数の名前と「類似」しません。 しかし、これはプログラムでこの関数を使用することを妨げるものではありません。

ユーザ定義関数Gipo()の実装:バージョン3

この例では、変数 alpha はプログラムで再利用され、その値が2回変更されます。 この事実は、メインプログラムの関数呼び出しで指定された実際の変数には影響しません。

ユーザ定義関数Gipo()の実装:バージョン4

このユーザー定義関数では、すべての計算が1つの演算子で収集されます。 戻り値は、演算子return()のかっこで直接計算されます。 Subduplicateは、渡されたパラメータが標準関数MathSqrt()で指定されなければならない場所で直接計算されます。この解決法は最初は奇妙で間違っているようです。 ただし、このユーザー定義関数の実装にはエラーはありません。 関数で使用される演算子の数は他の実装よりも少なく、コードはよりコンパクトです。

したがって、ユーザー定義関数のアプリケーションには、プログラミングの実践においていくつかの紛れもない利点があります。

• プログラムの基本テキストの変数の名前は、ユーザー定義関数の仮パラメータの名前とは関係がありません。

• ユーザー定義関数は、さまざまなプログラムで再利用できます。 ユーザー定義関数のコードを変更する必要はありません。

•必要に 応じてライブラリを作成できます。

関数のこれらの非常に有用なプロパティは、例えば、企業内で本当に大きなプログラムを作成することを可能にします。 このプロセスには複数のプログラマーが同時に参加することができ、使用する変数の名前について同意する必要から解放されます。 合意されるべき唯一のことは、ヘッダーと関数呼び出しの変数の順序です。

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

-MQL4ブック, MT4
-,

Copyright© FX・ビットコイン・オプションのシステムトレード開発と取引録 , 2020 All Rights Reserved Powered by AFFINGER5.