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