Contents
プログラムの構造
最初のセクションでは、プログラミング言語MQL4のいくつかの基本的な概念について説明します。 さて、どのようにプログラムが一般的にどのように組織されているのかを考えてみましょう。 この問題を解決するために、我々はその構造スキームを研究する。
前述したように、プログラマによって書かれたメインプログラムコードは、ユーザが定義した特別な機能の中に置かれます。 関数では、組み込み関数とユーザー定義関数の概念とプロパティについて説明します。 簡単に言えば、ユーザー定義関数には説明があり、関数呼び出しはプログラムでの実行を開始するために使用されます。 組み込み関数またはユーザー定義関数は、呼び出された後にのみ実行できます。 そのような場合、その関数はプログラムによる実行のために呼び出されると言われます。
特殊関数のプロパティについては、「特殊関数」で詳しく説明しています。 ここでは、それらの主な情報のみを調べます。 特殊機能とは、クライアント端末が実行するために呼び出される関数である。 共通関数とは異なり、特殊関数は説明のみを持ち、特殊関数はプログラム内から呼び出されません。 特別な関数がクライアント端末によって実行されるように呼び出されます。 (プログラム内から特別な関数を呼び出す技術的な可能性がありますが、この方法は間違っていると考えられますので、ここでは説明しません)。セキュリティウィンドウでプログラムの実行を開始すると、特別な機能 その結果、この関数が実行されます。
MQL4でのプログラミングのルールは次のとおりです。
プログラムコードは関数内に記述する必要があります。 |
これは、特別な機能の外にあるプログラム行(演算子と関数呼び出し)は実行できないことを意味します。 このようなプログラムをコンパイルしようとすると、MetaEditorは対応するエラーメッセージを表示し、実行ファイル* .exeはコンパイルの結果として表示されません。
共通のプログラムであるEAの機能スキームを考えてみましょう。
図31 プログラムの機能図(EA)。
MQL4で書かれたプログラムの最大ブロックは次のとおりです。
- プログラムの先頭部分。
- 特別なinit()関数。
- 特別なstart()関数。
- 特別なdeinit()関数。
- ユーザー定義関数。
さらに、プログラムのこれらの機能ブロック(インテグラルパーツ)の内部コンテンツのみを分析し、すべての外部オブジェクト(クライアント端末の情報領域やハードウェアなど)は対象外となります。
MetaTrader 4クライアント端末の情報環境
MT4の情報環境はプログラムの構成要素ではありません。 情報環境は、プログラムによって処理できるパラメータのセットです。 たとえば、新しいダニ、新しいダニごとに蓄積されたボリューム、ヒストリバーの最大値と最小値に関する情報、取引センターによって提供される取引条件を特徴付けるパラメータなどのセキュリティ価格があります。 情報環境は常に保存され、新しい目盛りごとに、サーバーに接続されたクライアント端末によって更新されます。
プログラムの構造
頭部
ヘッド部分は、プログラムの最初の行で構成され、プログラムの一般的な情報が入っています。 たとえば、この部分には、グローバル変数の宣言と初期化の行が含まれています。(頭部部分にこれまたはその情報を含める必要性については後述する。)頭部部分の符号は、機能記述(ユーザ定義または特殊機能)を含む次の行であってもよい。
特別な機能
通常、頭部の後に特殊な機能が記述されています。 特別な関数の記述は、ユーザ定義関数の記述に似ていますが、特殊関数にはinit()、start()、deinit()という名前があらかじめ定義されています。 特殊関数は計算のブロックであり、クライアント端末の情報環境およびユーザ定義関数に関連しています。 特殊機能については、 特殊機能で詳しく説明しています。
ユーザー定義関数
ユーザ定義関数の記述は、通常、特殊関数の記述の後に与えられます。 プログラム内のユーザー定義関数の数は無制限です。 前の図31では、この例には2つのユーザー定義関数しか含まれていませんが、プログラムには10または500が含まれていても、全く含まれていなくてもかまいません。 プログラムでユーザー定義関数が使用されていない場合、プログラムは単純な構造をとります:先頭部分と特殊関数の説明。
標準機能
前述のように、標準関数は関数呼び出しとしてのみ提示することができます。 特殊関数やカスタム関数などの各標準関数には説明がありますが、この説明はプログラムには記載されていません(スキームには含まれていません)。 標準関数の記述はプログラマから隠されているため、変更することはできません。 ただし、MetaEditorで利用できます。 プログラムのコンパイル中、MetaEditorは実行可能ファイルを作成します。このファイルでは、すべての標準関数がすべて正しく実行されます。
プログラム内の部品の配置
ヘッド部分は、最初の行に配置する必要があります。 特殊関数記述とユーザー定義関数記述の配置は関係ありません。 図32は、機能ブロックの一般的な配置、すなわちヘッド部分、特殊機能、およびユーザ定義機能を示す。 図33は、他のプログラム構造変形を示す。 すべての例では、先頭部分が先頭になり、関数はランダムな順序で記述することができます。
図33 機能ブロックをプログラムに配置する方法(ランダムな順序)。
他の関数の中に記述することはできません。 他の機能の中にあるプログラムの機能記述を使用することは禁じられています。 |
以下は、機能記述の誤った配置の例です。
図34 プログラム内の関数の誤った配置の例
プログラマーが誤って他の関数の記述内にその関数の記述があるプログラムを作成すると、コンパイル段階でMetaEditorにエラーメッセージが表示され、そのようなプログラムの実行ファイルは作成されません。
コード実行シーケンス
ヘッドパーツと特殊機能
プログラムがセキュリティウィンドウで起動されると、プログラムヘッド部分の行が実行されます。
頭部に記述されている準備が完了すると、クライアント端末は制御を特別なinit()関数に渡し、その関数が実行されます(制御の受け渡しは構造スキームで大きな黄色の矢印で示されます)。 特殊なinit()関数は、プログラム操作の開始時に1回だけ呼び出されます。 この関数には通常、プログラムのメイン操作が開始される前に一度だけ実行されるコードが含まれています。 たとえば、init()が実行されると、いくつかのグローバル変数が初期化され、グラフオブジェクトがグラフウィンドウに表示されるか、メッセージが表示されます。init()内のすべてのプログラム行が実行されると、関数は実行を終了し、制御はクライアント端末に返されます。
メインプログラムの動作時間は、特別なstart()関数の動作期間です。 サーバーからのクライアント端末による新しいティックの受信を含むいくつかの条件(特殊機能の特殊機能の機能を参照)では、クライアント端末はstart()の実行を呼び出します。 この機能(他の機能と同様)は、クライアント端末の情報環境を参照し、必要な計算を行い、注文を開閉することができます。 つまり、MQL4で許可されているアクションを実行できます。 start()が実行されると、通常は制御アクションとして実装されるソリューションが生成されます(図31の赤い矢印を参照)。 このコントロールは、プログラムによって形成された注文をオープン、クローズ、または変更する取引要求として実装することができます。
EAの特別なstart()関数のコード全体が実行された後、start()は操作を終了し、クライアント端末に制御を返します。 端末は、特別な機能を開始するのではなく、しばらくの間、コントロールを保持します。 一時停止が表示され、その間にプログラムが機能しません。 その後、新しいチックが来ると、クライアント端末はstart()に制御をもう一度渡し、その結果、関数は再び実行されます。
このプロセスは、プログラムがチャートに添付されている間に繰り返され、数週間および数ヶ月間継続することができます。 この期間中、EAは自動取引を行うことができます。つまり、EAは主な課題を実行することができます。 図31では、start()の繰り返し呼び出しは、特別なstart()関数を囲むいくつかの黄色の矢印で示されています。
トレーダーがチャートからEAを取り除くと、クライアント端末は特別なdeinit()関数を1回実行します。 この機能の実行は、EAの操作が正しく終了するために必要です。 動作中、プログラムは、例えば、クライアント端末のグラフィカルオブジェクトおよびグローバル変数を作成することができる。 deinit()関数には、不要なオブジェクトや変数を削除するコードを含めることができます。 deinit()の実行が完了すると、制御はクライアント端末に返されます。
実行された特殊機能は、情報環境を参照することができます(前の図31の青色の矢印を参照)。ユーザー定義関数の実行を呼び出します(前の図31の薄い黄色の矢印を参照)。 特別な関数は、クライアント端末があらかじめ定義した順序で呼び出された後に実行されることに注意してください。最初のinit()、次にstart()とdeinit()の呼び出しの回数。 クライアント端末が特殊機能を呼び出す条件については、「 特殊機能」を参照してください。
ユーザー定義関数
ユーザ定義関数は、その関数への呼び出しがある関数内に含まれているときに実行されます。 この場合、コントロールはタイムリーにユーザー定義関数に渡され、関数の実行が終了すると、制御は呼び出しの場所に戻されます(図31の薄いオレンジの矢印を参照)。 ユーザー定義関数の呼び出しは、特殊関数の説明だけでなく、他のユーザー定義関数の記述にも含めることができます。 1つのユーザー定義関数が他のユーザー定義関数を呼び出すことがあります。 これはプログラミングで広く使用されています。
ユーザー定義関数は、クライアント端末によって実行されるために呼び出されません。 ユーザ定義関数は、クライアント端末に制御を返す特別な関数の実行の中で実行されます。 ユーザー定義関数は、クライアント端末情報環境の変数値の使用を要求することもできます(前の図31の薄い青の矢印を参照)。
プログラムにユーザー定義関数の説明が含まれていても、この関数の呼び出しがない場合、このユーザー定義関数はコンパイル段階の準備プログラムから除外され、プログラムの操作には使用されません。
注意:特別な関数は、クライアント端末で実行するために呼び出されます。 ユーザー定義関数は、特別な関数や他のユーザー定義関数から呼び出された場合に実行されますが、クライアント端末から呼び出されることはありません。 コントロールアクション(取引注文など)は、特殊機能とユーザ定義機能の両方で実行することができます。 |