プログラムの実行
プログラミング技能は、プログラマーが小さな操作プログラムを持っていれば、より良く開発されます。 プログラム全体を理解するには、すべてのコンポーネントを徹底的に調べ、その動作を段階的に追跡する必要があります。 異なるアプリケーションプログラム(EA、スクリプト、インジケータ)の特殊機能プロパティは異なります。 ここでは、EAがどのように動作するかを分析します。
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">// simple.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">// Spec。</span></span> <span class="notranslate"> <span class="comment">funct。</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">// Spec。</span></span> <span class="notranslate"> <span class="comment">funct。</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="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">// Spec。</span></span> <span class="notranslate"> <span class="comment">funct。</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は次のように動作します:
1.プログラムがチャートに添付される瞬間、クライアント端末はプログラムに制御を渡し、その結果、プログラムはその実行を開始する。 プログラムの実行は頭部から始まります。ヘッド部分には1行しか含まれていません。
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 が宣言され、値0で初期化されます。 (ローカル変数 とグローバル 変数は変数の型で詳細に解析されますが、前のサンプルプログラムで使用されているアルゴリズムでは変数 Count をglobalとして宣言する必要があることに注意してください。関数の記述の外で、つまり頭部に宣言されているため、結果として、グローバル変数Countの 値は 任意のプログラム部分から利用可能になります。
2.プログラム先頭部分の実行後、実行のためにinit()が開始されます。 この関数呼び出しは、プログラムコードに含まれていないことに注意してください。 EAがチャートにアタッチされているときのinit()の実行の開始は、関数自身のプロパティです。 クライアント端末は、プログラムコードにその記述が含まれているからといって実行のためにinit()を呼び出す。 解析されたプログラムでは、init()の記述は次のとおりです。
1 2 3 4 5 |
<span class="notranslate"> <span class="keyword">int</span> init() <span class="comment">// Spec。</span></span> <span class="notranslate"> <span class="comment">funct。</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> |
関数本体には2つの演算子しか含まれていません。
2.1機能アラート()は、アラートウィンドウを表示します。
開始時にトリガーされる関数init()
2.2オペレータの戻り値は、init()の操作を終了します。
init()の実行の結果、アラートが書き込まれます。 一般的に使用されるプログラムでは、そのようなinit()の使用法はほとんど役に立たないので、このようなアルゴリズムは非常にまれです。 実際、トレーダーに実行中であることを知らせる関数を使用する意味はありません。 ここでは、アルゴリズムはinit()の実行を視覚化するためにのみ使用されます。init()がプログラム内で一度だけ実行されるという事実に注意してください。 この機能の実行は、ヘッド部が処理された後のプログラム動作の開始時に行われる。 特別なinit()関数でオペレータリターンが実行されると、プログラムはクライアント端末に制御を返します。
クライアント端末は、プログラム中のstart()の記述を検出する。
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">カウント++;</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> |
3.1。 制御はクライアント端末によって保持される。 クライアント端末は新しいティックを待っており、新しいティックが来るまでプログラム機能を起動しません。 つまり、プログラムがしばらく動かない、つまり何も実行されていないということです。 一時停止は表示されますが、この一時停止を実行するための直接的または間接的なプロンプトはありません。 tickを待つ必要性は、start()関数自身のプロパティであり、このプロパティに影響を与えるプログラムの影響はありません(たとえば、無効にするなど)。 新しい目盛りが来るまで、プログラムは制御を待機します。 新しいチックが来ると、クライアント端末はプログラムに制御を渡します。つまり、start()(この場合はEAの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.2744に等しくなります)。
3.3。 そして、次の行が実行されます。
1 |
<span class="notranslate">カウント++;</span> |
カウント=カウント+ 1; これを書く別の方法です。
制御をこの行に渡す瞬間に、 Count はゼロに等しい。 Count ++の 実行の 結果、 Countの 値が 1増加します。 したがって、制御を次の行に渡す瞬間に、 Count は1に等しくなります。
3.4。 次の行には、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> |
この関数は、大括弧で囲まれたすべての定数と変数を記述します。
start()の最初の実行時に、プログラムは "New tick"と書いて、 Count を 参照して 値 を取得し(最初の実行時にはこの値は1)、この値を書いてから "Price ="と書いて Price (その値は1.2744です)を取得し、最後にその値を書き込みます。
結果として、次の行が書き込まれます。
新しいチック1価格= 1.2744
3.5。 'return'演算子はstart()の操作を終了します。
1 |
<span class="notranslate"> <span class="keyword">return</span> ;</span> <span class="notranslate"> <span class="comment">// Exit start()</span></span> |
3.6。 新しいチックが来るまで、制御はクライアント端末に返されます。
これがEAのstart()関数がどのように実行されるかです。 実行が終了すると、start()はクライアント端末に制御を返し、新しいティックが来たら、クライアント端末はstart()をもう一度呼び出します。 このプロセス(start()関数の実行を開始し、クライアント端末に制御を戻す)は、数日または数週間の長時間にわたり継続することができます。 この間、特別なstart()関数が時々実行されます。 start()は、環境パラメータ(新しい価格、時間、取引条件など)に応じて、注文のオープンや変更などのさまざまなアクションを実行できます。
3.7。 新しい目盛りを受け取った瞬間から、ポイント3.2から3.6の動作が繰り返されます。 しかし、実行された演算子のシーケンスだけが繰り返されますが、変数は毎回新しい値を取得します。 start()の1回目と2回目の実行の違いを見てみましょう。
3.2.1(2)。
1 |
<span class="notranslate"> <span class="keyword">ダブル</span>価格=単価;</span> <span class="notranslate"> <span class="comment">//ローカル変数</span></span> |
以下のアクションが実行されます
3.2.1.1(2)。 ローカル変数の宣言 (変更なし)。
3.2.2(2)。 代入演算子の実行。 現在の入札 価格が価格 に割り当てられ ます 。 新しいティックが来るたびに新しい価格値が表示されます。 たとえば、2番目のティックでは、セキュリティ価格は1.2745です。
3.3(2)。 次の行が実行されます。
1 |
<span class="notranslate">カウント++;</span> |
この行に制御を渡す前の瞬間、 Count (start()関数の最初の実行後)の値は1に等しくなります。 Count ++の 実行の 結果、 Countが 1つ増加します。 したがって、2回目の実行では、 Count は(変更された)と等しくなります。
3.4(2)。 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> |
2回目のstart()の実行では、プログラムは "New tick"と書いて Count を 参照して その値を取得し(2回目の実行では2に等しい)、この値を書き込み、 "Price =" 価格 (この例では1.2745)を取得し、その値を書き込んだ(変更した)価格。
結果として、次の行が書き込まれます。
新しいチック2価格= 1.2745
3.5(2)。 'return'演算子は、start()(変更なし)の操作を終了します。
1 |
<span class="notranslate"> <span class="keyword">return</span> ;</span> <span class="notranslate"> <span class="comment">// Exitизstart()</span></span> |
3.6(2)。 新しいチックを待つために制御がクライアント端末に戻される。
3.7(2)。 その後再び繰り返されます。 3回目のstart()の実行では、変数は新しい値を取得し、Alert()によって書き込まれます。 すなわち、プログラムは点3.2から3.6を繰り返す(3)。 そして、何度も繰り返します:3.2-3.6(4)、3.2-3.6(5)、..(6)..(7)..(8)無限に繰り返されます。 このプログラムのstart()操作の結果、価格変更のチック履歴が表示されます。
次のイベントは、ユーザーがプログラムを終了し、強制的にプログラムをチャートから手動で切り離すことを決定した場合にのみ発生します。
4.クライアント端末は(そのプロパティに従って)制御を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> |
関数本体には2つの演算子しかありません。
4.1。 Alert()は次のように書く:
1 |
<span class="notranslate">初期化時に起動される関数deinit()</span> |
4.2。 'return'演算子は、deinit()の操作を終了します。
deinit()関数は、クライアント端末による実行のために一度だけ開始されます。 その後、以前のアラートが表示され、プログラムはチャートから削除されます。
5.ここでEAの実行の話が終わります。
このサンプルプログラムを任意のチャートに添付して起動します。 操作プログラムは、Alert()によって生成されたすべてのアラートを含むウィンドウを表示します。 アラートの内容によって、このエントリまたはそのエントリに接続されている特別な機能を理解することは容易です。
図35 プログラムsimple.mq4の操作結果
この例から、特殊関数で説明している特殊関数のプロパティに従ってプログラムが実行されていることを簡単に確認できます。 プログラムを終了し、再度起動してください。 これを何度かやり終えたら、最初のプログラムを使った経験が得られます。 それは今と次回の両方で機能します。 あなたが書いたプログラムは、記述された構造に従って作成され、実行を開始するには、それをグラフに添付する必要があります。
すべての概念とルールを理解していれば、MQL4でプログラムを作成するプロセスは簡単で快適です。