MQL5で学び、共に書く - ページ 17

 
Yedelkin:

Sleep()関数について 質問です。Expert Advisor でこの関数を使用すると、この EA のみの実行を停止し、このカーネルのタスクリストの次のタスクに CPU リソース(カーネル)を転送するという理解で合っていますか?つまり、Sleep()関数はExpert Advisorを処理しているスレッド自体を遅くするのではなく、現在のExpert Advisorと特定のカーネルが拾った他のプログラムとの切り替えとして機能するということでよろしいでしょうか?

私の理解では、Sleep(0)を設定すれば切り替わり、Sleep(milliseconds)を設定すれば指定したミリ秒数だけEAを停止させるということです。

同時に、私が理解する限り、各Expert Advisorは独立したスレッドであり、それらのスレッドのそれぞれがプロセッサ時間を主張します(ヘルプによると、スレッドの状態のチェックは100ミリ秒ごとに実行されます)。

そのため、あるスレッドが非アクティブになった場合、理由が何であれ、CPU時間は他のスレッドに渡され、100ミリ秒後に「スリープを決めた」スレッドの状態がチェックされる。

追記

スレッド間のコアの配分については、開発者に一任しています。

 
Yedelkin:

Sleep()関数について 質問です。Expert Advisor でこの機能を使用すると、この EA のみの実行を中断し、このカーネルのタスクリストにある次のタスクに CPU リソース(カーネル)を転送するという理解で合っていますか?つまり、Sleep()関数はExpert Advisorを処理しているスレッド自体を遅くするのではなく、現在のExpert Advisorと特定のカーネルで拾った他のプログラムとの切り替えとして機能するということでよろしいでしょうか?

各エキスパートはそれぞれ独立したスレッドで実行されます。Sleep()はこのスレッドを遅くする。コア(アフィニティーマスク)へのバインディングはございません。
 
Yedelkin:

MqlTradeResultの構造について 質問です。MqlTradeResultの構造体に時間フィールドを追加する質問があったかどうか、どなたか覚えていらっしゃいますか?保留中の注文が突然履歴になった場合に引き出すために必要です。

要望が明確でない。注文が開封されている場合は、開封時刻が格納されます。なぜサーバーの応答速度が 必要なのですか?
 
sergeev:
要望が明確でない。注文が開封された場合は、開封時刻が格納される。なぜサーバーの応答速度が 必要なのですか?

注文の行方は、チケットで追跡するのですね。ただし、OrderSend()関数によるチケットの返却は、取引操作の正常な実行を保証するものではありません。プログラムのロジックでは、自分のチケットが過去の注文の中に出てきているか、その後にどのような取引が行われたかを確認すればよいことになっています。そのためには、履歴キャッシュに最小限の履歴をアップロードしたいと思います。 つまり、最初のリクエストに対するサーバーの応答時間から、それ以上の履歴はアップロードしないでください。注文が開けないこともある。このように、HistorySelect()関数を使って、新しい履歴を最適なサイズ(量)でダウンロードするためには、サーバーの応答時間が必要です。では、「履歴から注文を取り出す」ことについては、明確なのでしょうか?

私の理解では、MqlTradeResultの構造 体に追加の時間フィールドを導入する問題はまだ提起されていません。

 

Sleep() について Expert Advisor のスレッド遅延が他のプログラムの実行に影響を与えないことは理解できたのですが。ありがとうございます。

 

Sleep()についてもう一つ質問です。コメントには、「インジケータはインターフェーススレッドで実行されるため、遅くならないはず なので、 カスタムインジケータから Sleep()関数を呼び出すことはできません」と書かれています。フォーラムを読みましたが、まだ次のことがわかりません。「インジケータから呼び出すことはできない」というのは、あらかじめ禁止されているのか、プログラマに勧められているのか?

 
Yedelkin:

注文の行方は、チケットで追跡するのですね。ただし、OrderSend() チケットの返送は、取引の成立を保証するものではありません。

えへん注文の出し方については、教科書をご覧ください。
 
Yedelkin:

Sleep()についてもう一つ質問です。コメントには、「インジケータはインターフェーススレッドで実行されるため、遅くならないはず なので、 カスタムインジケータから Sleep()関数を呼び出すことはできません」と書かれています。フォーラムを読みましたが、まだ次のことがわかりません。「インジケータから呼び出すことはできない」というのは、あらかじめ禁止されているのか、プログラマに勧められているのか?

禁止
 
sergeev:
xxm...注文の出し方については、教科書をご覧ください。

まあ、言いたいことはわかりますよね。OrderSend()関 数はブール値を返すので、念入りに確認してください。この場合、リクエストのチェックに成功すると、オーダーチケットがMqlResult構造体の変数に書き込まれます。私自身は「オーダーチケット機能の復活」と呼んでいます。以下はソースへのリンクです。「OrderSend()関数を使って買いリクエストを送信する際、リクエストが正常にチェックされると、作成されたオーダーのチケットをすぐに確認 することができます。

禁止」についての回答について - ありがとう、わかったよ。

 
Yedelkin:

まあ、言いたいことはわかりますよね。

残念ながら、まだ理解できていません。

何らかの理由で、return 構造に「時間」フィールドが必要な場合、表示される順番に時間を使用します。これだけで、ちょっとした歴史をコントロールすることができるのです。