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

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

MQL4ブック MT4

定義済みの変数とリフレッシュレート関数

定義済みの変数とリフレッシュレート関数

 

MQL4言語で定義済みの名前を持つ変数があります。

あらかじめ定義された変数は、定義済みの名前を持つ変数であり、その値はクライアント端末によって定義され、プログラムメソッドによって変更することはできません。 定義済みの変数は、プログラムの開始時(エキスパートアドバイザー、スクリプトまたはカスタムインジケータ)またはRefreshRates()実装の結果として、現在のチャートの状態を反映します。

単純定義済み変数名のリスト

 

Ask -現在の証券の最後に知られている売値。

Bid 現在の証券の最後の既知の買い価格。

Bars - 現在のチャートの棒の数。

Point - 現在のセキュリティのポイントサイズ。

Digits - 現在のセキュリティの価格の小数点以下の桁数。

配列の事前定義された名前のリスト - Timeseries

 

Time - 現在のチャート上の各バーの時間。

Open - 現在のチャートの各バーのオープン価格。

Close - 現在のチャートの各バーのクローズ価格。

High - 現在のチャートの各バーの最高値。

Low - 現在のチャートの各バーの最低価格。

Volume - 現在のグラフ上の各バーのティックボリューム。

(「配列」と「配列 - 時系列」の概念については配列の節で説明しています )。

 

定義済み変数のプロパティ

 

事前定義された変数名は、ユーザー定義変数の識別には使用できません。 事前定義済みの変数は、同じルールに従って他の変数と同じように式で使用できますが、事前定義済みの変数の値は変更できません。 代入演算子を含むプログラムをコンパイルしようとすると、あらかじめ定義された変数が等号の右側に置かれ、MetaEditorはエラーメッセージを表示します。 可視性の観点からは、事前定義された変数はグローバルを参照します。つまり、それらは任意のプログラム部分から利用できます( 変数の種類を参照 )。

事前定義された変数の最も重要な特性は次のとおりです。

事前定義されたすべての変数の値は、実行のために特別な機能が開始された瞬間にクライアント端末によって自動的に更新されます。

あらかじめ定義された変数の前の値と現在の値は等しいかもしれませんが、値自体は更新されます。 特殊関数の開始時には、これらの変数の値はすでに更新されており、最初のプログラム行から利用可能です。 次の例では、定義済みの変数の更新について説明します(Expert Advisorのpredefined.mq4 )。

このプログラムを起動すると、アラートに表示される変数Bidの値が毎回現在の価格と等しいことがわかります。 現在の状況に応じて他の変数の値をチェックするのと同じ方法です。 たとえば、変数Askは現在の価格にも依存します。 バーの数が変更されると、変数バーの値も変更されます。 これは、チャートウィンドウに新しいバーが形成される目盛りで発生することがあります。 Pointの値はセキュリティ仕様に依存します。 たとえば、EUR / USDの場合は0.0001、USD / JPYの場合は0.01です。 これらの有価証券の桁数はそれぞれ4と2です。

定義済みの変数のもう一つの重要な特性は次のとおりです。

クライアント端末は、起動されたプログラムごとに事前に定義された変数のローカルコピーのセットを作成します。 起動された各プログラムは、独自の履歴データセットを使用して動作します。

あるクライアント端末では、いくつかのアプリケーションプログラム(エキスパートアドバイザー、スクリプト、インジケータ)を同時に実行することができ、それぞれのクライアント端末は、事前定義されたすべての変数値 - 履歴データの個別のコピーセットを作成します。 この必要性の詳細な理由を分析しましょう。 イチジク。 図52は、特別機能start()の実行長の異なるエキスパート・アドバイザの可能な動作を示す。 簡単にするため、分析されたエキスパートアドバイザーには他の特別な機能はなく、両方のエキスパートアドバイザーが同じセキュリティの同じ時間枠で動作しているとします。

 

イチジク。 start()の動作時間は、ティック間の時間間隔よりも長くても小さくてもよい。

 

エキスパートアドバイザーはstart()の実行時間が異なります。 一般的なミドルレベルのエキスパートアドバイザーの場合、今回は約1〜100ミリ秒に相当します。 他のエキスパートアドバイザーは、数秒または数十秒といったようにずっと長く実行することができます。 ダニ間の時間間隔も異なります。数ミリ秒から数分、時には数十分です。 ここでは、tick()の頻度がstart()の実行時間が異なるExpert Advisor 1とExpert Advisor 2の動作にどのように影響するかを例に挙げて分析します。

時点t 0で、エキスパートアドバイザー1がクライアント端末に接続され、ティック待ちモードに切り替わる。 瞬間t 1にティックが来て、ターミナルは特殊機能のstart()を開始します。 それと一緒に、プログラムは事前定義された変数の更新されたセットにアクセスします。 実行中、プログラムはこれらの値を参照することができ、start()操作時間内に変更されません。 start()が操作を終えると、プログラムはtick-waitingモードに入ります。

事前定義された変数が新しい値を取得する可能性が最も近いイベントは、新しいティックです。 エキスパート・アドバイザ1のStart()実行時間T1は、ティック間の待ち時間、例えば間隔t1~t2またはt2~t3などよりもかなり短い。したがって、分析されたExpert Advisor1実行期間中、事前定義された変数の値が古くなる、すなわち現在の瞬間の真の(最後に知られている)値とは異なる状況はない。

エキスパートアドバイザー2の操作では、start()実行期間T2がティック間の間隔を超えることがあるため、別の状況があります。 エキスパートアドバイザー2の関数stat()も瞬間t 1で開始される。 図52は、ティック間の間隔t1-t2がstart()実行時間T2よりも大きいことを示している。その理由は、プログラム動作のこの期間中、事前定義された変数は更新されない(この期間では新しい値はサーバから来ない。それらの真の値は、瞬間t 1に現れる値とみなされるべきである)。

エキスパートアドバイザー2の次回の開始は、2番目のティックが受信された時点t 2で開始される。 あらかじめ定義された値のコピーセットも一緒に更新されます。 Fig。 start()がまだ実行されている期間内であることがわかります。 start()が操作を終了したときに3番目のティックがt 32になったt 3からExpert Advisor 2が使用できる事前定義された変数の値はどのようになりますか? その答えは、以下の規則に従って見つけることができます:

あらかじめ定義された変数のコピーの値は、特殊関数の操作の全期間中保存されます。 これらの値は、標準関数RefreshRates()を使用して強制的に更新することができます。

したがって、Start()実行の全期間中にRefreshRates()が実行されなかった場合、Expert Advisor 2は、2番目のティックを受け取ったときに作成されたローカルコピーの事前定義された変数セットにアクセスできます。 エキスパートアドバイザーは同じウィンドウで操作しますが、チケットを受け取った時点から、各EAは事前定義された変数の異なる値で動作します。 エキスパートアドバイザー1は、それ自身のローカルコピーセットで動作し、その値は時点t 3で定義され、エキスパートアドバイザー2はそれ自身のデータコピーで動作し、その値はt 2に等しい。

アプリケーションプログラムの実行時間が長いほど、また、ティック間の間隔が短いほど、プログラム実行期間中に次のティックが来る可能性が高くなります。 履歴データのローカルコピーのセットは、特定の関数の実行時間全体を通して事前定義された変数の不変性を保証する各プログラムの条件を提供します。

次のティックが来る瞬間t4から開始して、両方のEAが再び開始され、それぞれが自身のコピーセットにアクセスし、4番目のティックが来る瞬間t4に値が形成される。

RefreshRates()関数

標準関数RefreshRates()は、ローカル履歴データコピーの値を更新することを可能にします。 すなわち、現在の市場環境(Volume、最後の引用時刻Time [0]、Bid、Askなどのサーバ時刻)に関するデータを強制的に更新する機能であり、プログラムが長時間の計算を行う場合や、更新されたデータが必要です。

RefreshRates()は、実行時に端末の新しい履歴データに関する情報がある場合(つまり、プログラムの実行中に新しいティックが来た場合)TRUEを返します。 このような場合、事前定義された変数のローカルコピーのセットが更新されます。

RefreshRates()は、特別な関数の実行開始時から、クライアント端末の履歴データが更新されていない場合はFALSEを返します。 このような場合、事前定義された変数のローカルコピーは変更されません。

RefreshRates()は、起動されたプログラムにのみ影響します(同時にクライアント端末で動作するすべてのプログラムには影響しません)。

例でRefreshRates()の実行を説明しましょう。

問題21.サイクル演算子がティック間で実行できる反復回数をカウントします(最も近い5ティック)。

この問題はRefreshRates()(スクリプトcountiter.mq4 )を使用して解決することができます:

問題の状況によれば、計算は最も近い5つのティックについてのみ行う必要があります。そのため、スクリプトを使用することができます。 プログラムでは2つの変数が使用されます。i - ティック数をカウントする場合はCount - 繰り返しをカウントする場合。 の外部サイクルは、処理されたダニの数(1〜5)に従って構成されます。 for-cycleの開始時に、反復のカウンタ(サイクル中に実行される)がクリアされ、最後にティック番号と反復の量のアラートが表示されます。

Internal cycle 'while'はRefreshRates()によって返された値がfalseに等しい間、つまり新しいティックが来るまで動作します。 'while'(ティック間の間隔)の操作中、Countの値は常に増加します。 したがって、 'while'サイクルで必要な反復回数がカウントされます。 RefreshRates()によって返された 'while'の条件チェックが 'true'である場合、クライアント端末に新しい変数が定義されていることを意味します。 結果として、制御は 'while'の外に戻され、繰り返しカウントが終了する。

countiter.mq4スクリプト実行の結果、MQL4のパフォーマンスを特徴付ける多くのアラートがセキュリティウィンドウに表示されます。

イチジク。 53. EUR / USDウィンドウでのcountiter.mq4操作の結果。

1秒間(4番目と5番目のティックの間の間隔)、スクリプトは300万回を超える反復を実行しています。 類似の結果は、他のティックについての単純な計算によっても獲得することができる。

前の例に戻ってみましょう(Expert Advisor predefined.mq4 )。 先に、Expert Advisor 2でRefreshRates()が実行されない場合、事前定義済み変数のローカルコピーの値は、start()実行の全期間中、たとえば期間t 2〜t 32の間は変更されないことがわかりました。 3番目のティック(start()が実行されているときに来る)関数RefreshRates()が実行されます。たとえば、時刻t 31でローカルコピーの値が更新されます。 したがって、t 31(RefreshRates()の実行)からt 32(開始()の終了)までの残りの時間の間に、t 3でクライアント端末によって定義された値に等しい所定の変数のローカルコピーの新しい値が利用可能になるエキスパートアドバイザー2へ。

エキスパートアドバイザー2 RefreshRatesが時刻t 11またはt 21(つまり、最後の既知のティックがstart()の実行を開始した時点)で実行される場合、事前定義された変数のローカルコピーは変更されません。 このような場合、事前定義された変数のローカルコピーの現在の値は、最後に知られている値、すなわち特殊関数start()の最後の開始時にクライアント端末によって定義された値に等しくなります。

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

-MQL4ブック, MT4
-,