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

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

MQL4ブック MT4

変数の種類

変数の種類

 

MQL4のアプリケーションプログラムには、数十、数百の変数が含まれています。 各変数の非常に重要な特性は、プログラムでその価値を使用する可能性です。 この可能性の制限は可変スコープと関連しています。

変数スコープは、 変数の値が使用可能なプログラム内の場所です。 すべての変数に範囲があります。 スコープによると、MQL4にはローカルとグローバルの2種類の変数があります。

ローカル変数とグローバル変数

 

ローカル変数は、関数内で宣言された変数です。 ローカル変数のスコープは、変数が宣言されている関数の本体です。 ローカル変数は、その型に対応する定数または式によって初期化することができます。

すべての関数を超えて宣言されたグローバル変数 sa変数。 グローバル変数の範囲はプログラム全体です。 グローバル変数は、型に対応する定数(式ではなく)によってのみ初期化できます。 グローバル変数は、特殊関数の実行を宣言する前に一度だけ初期化されます。

プログラム内の制御が特定の関数内にある場合、別の関数で宣言されたローカル変数の値は使用できません。 任意のグローバル変数の値は、任意の特殊関数およびユーザー定義関数から使用できます。 簡単な例を見てみましょう。

問題22.ダニを数えるプログラムを作成します。

グローバル変数( countticks.mq4 )を使用した問題22の解法アルゴリズム:

このプログラムでは、グローバル変数が1つだけ使用されます。 それはstart()の記述の外側で宣言されているため、グローバルです。 これは、変数がティックからティックまでその値を保持することを意味します。 プログラムの実行の詳細を見てみましょう。

特別機能では、特殊機能の開始基準を分析しました。 簡単に説明すると、Expert Advisorsのstart()は、新しいチックが来たときにクライアント端末によって開始されます。 エキスパートアドバイザーのセキュリティウインドウへの添付の瞬間に、以下のアクションが実行されます。

1.グローバル変数Tickの宣言。 この変数は定数では初期化されません。そのため、この段階での値はゼロになります。

2.制御は、新しい目盛りが来るまでクライアント端末によって保持される。

3.ダニを受け取る。 コントロールは特殊な関数start()に渡されます。

3.1。 start()実行制御の内部は、オペレータに渡されます。

オペレータが実行した結果、Tickの値は1ずつ増加します。

3.2 制御はオペレータに渡されます。

標準機能のComment()を実行すると、アラートが表示されます。

Received: tick No 1

3.3。 制御はオペレータに渡されます。

start()の実行が終了すると、制御はクライアント端末に返されます。 大域変数は存在し続け、その値は1に等しい。

他のアクションはポイント2から繰り返されます。変数の目盛りが再び計算に使用されますが、特殊関数start()の開始時の2番目のティックでは、その値は1に等しいので、演算子の結果

実行は変数Tickの新しい値になります - それは1だけ増加し、今は2に等しくなり、Comment()を実行すると警告が表示されます:

Received: tick No 2

したがって、Tickの値は、特殊関数start()の各開始時、つまり各ティックごとに1ずつ増加します。 そのような問題の解決策は、関数を終了した後に値を保持する変数を使用する場合(この場合はグローバル変数が使用される場合)のみ可能です。 この目的のためにローカル変数を使用することは無理です。ローカル変数がその値を失います。宣言された関数が終了します。

Tickがローカル変数として開かれたExpert Advisorを起動すると、簡単に見ることができます(つまり、プログラムにアルゴリズムエラーが含まれています)。

構文の観点からは、コードにエラーはありません。 このプログラムを正常にコンパイルして開始することができます。 それは動作しますが、結果が同じになるたびに:

received tick No 1

変数Tickは特殊関数start()の開始時に0で初期化されるので、当然です。 それがさらに1つ増えると、次のような結果になります:警告の瞬間までに、Tickの値は常に1に等しくなります。

静的変数

 

物理レベルでは、ローカル変数は対応する関数の一時メモリ部分に表示されます。 永続的なプログラムの中で関数の中で宣言された変数を見つける方法がありますmemory - 修飾子 'static'は宣言時に変数型の前に表示されるべきです:

以下は、問題22を静的変数(Expert Advisor staticvar.mq4 )を使って解いたものです。

静的変数は一度初期化されます。 各静的変数は、対応する定数(任意の式で初期化できる単純なローカル変数とは異なる)によって初期化できます。 明示的な初期化がない場合、静的変数はゼロで初期化されます。 静的変数は永続メモリ部分に格納され、その値は関数を終了するときに失われません。 しかし、静的変数にはローカル変数に特有の制限があります。変数のスコープは、変数が宣言されている関数で、プログラム部分から値を取得できるグローバル変数とは異なります。 ご覧のように、 countticks.mq4staticvar.mq4のプログラムは同じ結果を返します。

すべての配列は、最初は静的です。つまり、明示的に指定されていない場合でも、静的型です(「 配列 」を参照)。

外部変数

 

外部変数は変数であり、その値はプログラムプロパティウィンドウから使用できます。 外部変数はすべての関数の外で宣言され、グローバル変数です。そのスコープはプログラム全体です。 外部変数を宣言するときは、修飾子 'extern'をその値の型の前に指定する必要があります。

外部変数は、プログラムの先頭部分、つまり外部関数呼び出しを含む関数の前に指定されます。 外部変数の使用は、他の変数値を持つプログラムを開始するために必要とされる場合に非常に便利です。

問題23次の条件が適用されるプログラムを作成します。価格が一定のレベルに達し、このレベルをnポイント下回った場合、この事実は一度トレーダーに報告されるべきです。

明らかに、この問題は、今日の価格が昨日と異なるため、設定を変更する必要があることを意味します。 明日は別の価格を持つことになります。 エキスパートアドバイザーの設定を変更するオプションを提供するには、 externvar.mq4の外部変数を使用します。

このプログラムでは、外部変数は次の行に設定されています。

外部変数の値は、プログラムパラメータウィンドウから使用できます。 これらの変数の資産は、プログラムをセキュリティウィンドウに接続する段階とプログラムの操作中にいつでも変更することができるということです。

イチジク。 プログラムプロパティウィンドウ。 ここでは変数の値を変更することができます。

プログラムをセキュリティウィンドウに添付すると、プログラムコードに含まれる変数値がプログラムパラメータウィンドウに表示されます。 ユーザーはこれらの値を変更できます。 ユーザーが[OK]をクリックすると、プログラムはクライアント端末によって開始されます。 外部変数の値は、ユーザーが指定した値になります。 操作プロセスでは、これらの値は実行されたプログラムによって変更できます。

プログラムの動作中に外部変数の値を変更する必要がある場合は、セットアップウィンドウを開き、変更を行う必要があります。 プログラムプロパティツールバーは、プログラム(エキスパートアドバイザーまたはインジケータ)が新しいティックを待っている間、つまり特別な機能が実行されていない期間にのみ開くことができることを覚えておく必要があります。 プログラムの実行期間中、この通行料を開くことはできません。 そのため、長い時間(数秒または数十秒)実行されるようにプログラムを書くと、ユーザーはパラメータウィンドウにアクセスしようとする際に困難に直面することがあります。 スクリプトの外部変数の値は、プログラムをチャートに添付する瞬間にのみ利用可能ですが、操作中は変更できません。パラメータウィンドウが開いていると、エキスパートアドバイザーが機能せず、制御がクライアント端末によって行われ、特殊機能を起動するためのプログラム

EAプロパティウィンドウが開いているときに、ユーザーが外部変数値を決定しているときは、EA(またはインジケータ)は機能しません。 外部変数の値を設定してOKをクリックすると、ユーザーはもう一度プログラムを開始します。

クライアント端末は特殊関数deinit()を実行した後、特別な関数init()を実行し、その後に新しいtickが来るとstart()を開始します。 プログラムを終了するdeinit()の実行時に、外部変数は前回のセッションから得られた値、つまりEA設定のドル記号が開かれる前に利用可能な値を持ちます。 init()を実行する前に、外部変数は設定ツールバーのユーザーによって設定された値を取得し、init()の実行時に外部変数はユーザーによって設定された新しい値を持ちます。 したがって、外部変数の新しい値は、init()の実行から始まるエキスパートアドバイザーの新しいセッション(init-start-deinit)の瞬間から有効になります。

セットアップウィンドウを開くという事実は、グローバル変数の値に影響しません。 ウィンドウが開いているときと閉じた後の間は、グローバル変数はツールバーを開く前の時点で有効な値を保持します。

externvar.mq4プログラムでは、1つのローカル変数と2つのグローバル変数も使用されます。

アルゴリズム的には、問題解決は次のようになります。 2つのイベントが識別されます。最初のレベルはLevelに到達したこと、2番目はアラート(レベルがnポイントを下回ったこと)が表示されていることです。 これらのイベントは、変数Fact_1とFact_2の値に反映されます。イベントが発生しなかった場合、対応する値の値はfalseになります。そうでない場合はtrueです。 行の中で:

最初の出来事の事実が定義されています。 標準関数NormalizeDouble()は、実際の変数の値を設定された精度(セキュリティ価格の精度に相当)で計算することを可能にします。価格が表示されたレベル以上の場合、最初のイベントの事実が満たされたとみなされ、グローバル変数Fact_1が真の値を取得します。 このプログラムは、Fact_1が一度真の値を取得した場合、決してfalseに変更されないように構成されています。プログラムに対応するコードはありません。

行の中で:

アラートを表示する必要性が定義されています。 最初の事実が完了し、指摘されたレベルからnポイント(それ以下)で価格が下がった場合は、ユーザー定義関数My_Alert()が呼び出されます。 アラート後のユーザー定義関数では、変数Fact2に 'true'を代入することで、すでに表示されているアラートのファクトが示されます。 その後、ユーザー定義関数とその後に特殊関数start()が処理を終了します。

変数Fact_2が真の値を取得した後、プログラムはその操作が終了するたびに表示されます。そのため、一度表示されたアラートはこのプログラムセッション中に繰り返されません。

このプログラムでは、グローバル変数の値は、(特別関数とユーザー定義関数の両方の)任意の場所で変更でき、プログラム操作の全期間内に保持されるという事実があります - ティック間、または時間枠を変更した後。

通常、グローバル変数の値は、特別な関数で変更することができます。 そのため、init()とdeinit()のグローバル変数の値を変更する演算子を示すときは、非常に注意が必要です。 たとえば、init()のグローバル変数の値をゼロにすると、最初のstart()の実行時にこの変数の値はゼロになります。つまり、前回のstart()の実行中に取得された値が失われますすなわち外部プログラム設定を変更した後)。

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

-MQL4ブック, MT4
-,