Contents
実装の例
前のセクションでは、単純なEA simple.mq4での 特殊な関数の実行の例を分析しました。 より良い実践のために、このプログラムのいくつかの変更点を分析してみましょう。
原則として、関数の説明は、クライアント端末が実行するために呼び出されるのと同じ順序で示されます。 つまり、最初にinit()、次にstart()の説明に行き、最後のものはdeinit()です。 しかし、クライアント端末が独自のプロパティに従って実行するために特別な関数が呼び出される。 そのため、プログラム内の記述の場所は重要ではありません。 説明の順序を変更し、その結果を見てみましょう(EA possible.mq4 )。
// ----------------------------------------------------- -------------------- // possible.mq4 // MQL4ブックの例として使用する。 // ----------------------------------------------------- -------------------- int Count = 0 ; //グローバル変数 // ----------------------------------------------------- -------------------- int start() //特別な機能です。 開始() { ダブル価格=単価; //ローカル変数 カウント++; アラート ( "New tick" 、Count、 "Price =" 、Price); //アラート return ; // exit start() } // ----------------------------------------------------- -------------------- int init() //特別な機能です。 その中に() { アラート ( 「開始時にトリガされる関数init()」 ); //アラート return ; // init()を終了する } // ----------------------------------------------------- -------------------- int deinit() //特別な機能です。 deinit() { アラート ( 「終了時にトリガされる関数deinit()」 ); //アラート return ; // exit deinit() } // ----------------------------------------------------- --------------------
このEAを起動すると、プログラム内の特殊関数の実行順序は 、プログラム内の記述の順序に依存しないことがわかります。 ソースコード中の関数記述の位置を変更することができ、 結果はEA simple.mq4の実行時と同じになります。
しかし、頭部の位置を変えれば、プログラムは異なった動作をします。 この例では、頭部より早くstart()を示します(EA incorrect.mq4 )。
//-------------------------------------------------------------------- // incorrect.mq4 // To be used as an example in MQL4 book. //-------------------------------------------------------------------- int start() // Special funct. start() { double Price = Bid; // Local variable Count++; Alert ("New tick ",Count," Price = ",Price);// Alert return; // Exit start() } //-------------------------------------------------------------------- int Count=0; // Global variable //-------------------------------------------------------------------- int init() // Special funct. init() { Alert ("Function init() triggered at start");// Alert return; // Exit init() } //-------------------------------------------------------------------- int deinit() // Special funct. deinit() { Alert ("Function deinit() triggered at exit");// Alert return; // Exit deinit() } //--------------------------------------------------------------------
このEAをコンパイルしようとすると、MetaEditorはエラーメッセージを表示します。
図36 wrong.mq4プログラムのコンパイル中のエラーメッセージ。
この場合、行はすべての関数の外側に書かれていますが、プログラムの最初の部分ではなく、途中のどこかにあります。
int Count = 0 ; //グローバル変数
プログラム構造の決定的な瞬間は、グローバル変数 Countの 宣言 が関数宣言(この場合はstart())の後に行われることです。 この節では、グローバル変数の使用の詳細については説明しません。 変数の種類と使用規則は変数に記述されています。 グローバル変数は、最初の呼び出しより早く(テキストの前に)宣言しなければならないことに注意してください(ここではstart()にあります)。 解析されたプログラムでは、この規則に違反し、コンパイラにエラーメッセージが表示されました。
ここで、カスタム関数との関係でプログラムがどのように動作するかを見てみましょう。 この目的のために、単純なEA simple.mq4の 例で説明されているコードをアップグレードし、分析してみましょう。 カスタム関数を持つプログラムは、次の例のようになります(EA userfunction.mq4 )。
// ----------------------------------------------------- -------------------- // userfunction.mq4 // MQL4ブックの例として使用する。 // ----------------------------------------------------- -------------------- int Count = 0 ; //グローバル変数 // ----------------------------------------------------- -------------------- int init() //特別な機能です。 その中に() { アラート ( 「開始時にトリガされる関数init()」 ); //アラート return ; // init()を終了する } // ----------------------------------------------------- -------------------- int start() //特別な機能です。 開始() { ダブル価格=単価; //ローカル変数 My_Function(); //カスタムファンクション。 コール アラート ( "New tick" 、Count、 "Price =" 、Price); //アラート return ; // Exit start() } // ----------------------------------------------------- -------------------- int deinit() //特別な機能です。 deinit() { アラート ( 「終了時にトリガされる関数deinit()」 ); //アラート return ; // exit deinit() } // ----------------------------------------------------- -------------------- int My_Function() //カスタム関数。 説明 { カウント++; //呼び出しのカウンター } // ----------------------------------------------------- --------------------
まず第一に、何が変わったのか、何が変わっていないのかを見てみましょう。
変更されていない部品
頭部は変わらない。
// userfunction.mq4 // MQL4ブックの例として使用する。 // ----------------------------------------------------- -------------------- int Count = 0 ; //グローバル変数
2.特別なinit()関数は変更されていません。
int init() //特別な機能です。 その中に() { アラート ( 「開始時にトリガされる関数init()」 ); // Aler return ; // init()を終了する }
3.特別なdeinit()関数は変更されていません。
int deinit() //特別な機能です。 deinit() { アラート ( 「終了時にトリガされる関数deinit()」 ); //アラート return ; // exit deinit() }
変更点
1.カスタム関数My_Function()が追加されました。
int My_Function() //カスタム関数の説明 { カウント++; //呼び出しのカウンター }
2. start()のコードも変更されました。 さて、それはカスタム関数呼び出しを含み、 Count 変数の計算行 はありません 。
int start() //特別な機能です。 開始() { ダブル価格=単価; //ローカル変数 My_Function(); //カスタム関数呼び出し アラート ( "New tick" 、Count、 "Price =" 、Price); //アラート return ; // Exit start() }
プログラムの実行では、init()とdeinit()の実行順序を分析しました。 この例では、これらの関数は同じ方法で実行されるため、その操作については説明しません。 start()とMy_Function()の実行を分析しましょう。 カスタム関数の説明は、必要に応じてすべての特殊関数の外にあります。 カスタム関数呼び出しはstart()内に示されていますが、これも正しいです。
init()を実行すると、次のようにプログラムが実行されます。
3.1。特別なstart()関数は、クライアント端末によって開始されるのを待っています。 新しいティックが来たら、ターミナルはこの機能を実行するために起動します。 その結果、以下のアクションが実行されます。
3.2(1)。
ダブル価格=単価; //ローカル変数
同じ行がこの行で実行されます。
3.2.1(1)。 ローカル変数 Price が初期化されます( 変数の 種類を参照 )。 このローカル変数の値は、start()の任意の部分から取得できます。
3.2.2(1)。 代入演算子が実行されます。 最後に利用可能な入札単価が 価格 に割り当てられ ます (たとえば、最初のティックでは1.2744になります)。
3.3(1)。 次にMy_Function()を呼び出します。
My_Function(); //カスタム関数呼び出し
この行は、start()操作内で実行されます。 この関数呼び出しの結果は、関数本体(記述)に制御を渡し、後でそれを呼び出し場所に戻すことです。
3.4(1)。 カスタム関数の説明には1つの演算子しかありません。
カウント++;
最初のカスタム関数呼び出しでは、 Count はゼロに等しくなります。 Count ++ 演算子の 結果、 Countが 1つ増加します。 この演算子(唯一と最後のもの)を実行すると、カスタム関数は演算を終了し、呼び出し元の場所に制御を返します。
カスタム関数は特殊関数からのみ、または特殊関数から呼び出される他のカスタム関数からのみ呼び出すことができます。 そのため、現時点で特別な関数の1つが動作している(またはstart()が新しいティックを待っている)ため、カスタム関数は特別な関数の中でのみ実行されます。
この場合、制御は実行中のstart()に戻ります。 つまり、関数呼び出しに続く行に制御が戻されます。
3.5(1)。 この行には、Alert()呼び出しが含まれています。
アラート ( "New tick" 、Count、 "Price =" 、Price); //アラート
Alert()は、角括弧内に列挙されたすべての定数と変数をウィンドウに表示します。
新しいチック1価格= 1.2744
3.6(1)。 'return'演算子はstart()操作を終了します。
return ; // Exit start()
3.7。 新しいチックを待つ制御がクライアント端末に渡される。
さらにstart()を実行すると、変数に新しい値が設定され、Alert()によるメッセージが表示されます。 つまり、プログラムはポイント3.2から3.6を実行します。 各開始()実行(各ティック)で、My_Function()の呼び出しが実行され、この関数が実行されます。 start()の実行は、ユーザーがプログラム操作を終了することを決定するまで続きます。 この場合、特別なdeinit()関数が実行され、プログラムは動作を停止します。
実行のために起動され たuserfunction.uх4 プログラム は、Alert()によるメッセージを含むウィンドウを表示します。 メモ:プログラムの操作の結果は、 単純な EA simple.mq4操作の結果と同じになります。 userfunction.mq4の構造は、機能ブロックの通常の順序に従って構成されていることは明らかです。 別の受け入れ可能な注文が使用される場合、結果は同じになります。