MQLによる非同期・マルチスレッドプログラミング - ページ 26

 
Vladimir Simakov:
同期はプログラマの仕事であり、方法がわからなければマルチスレッドを使うことはない。道具を与えるのがクリエイターの仕事であり、そこでは誰もが自分に対して邪悪なピノキオである。同じア・ラ・ミューテックスでも、自分で実装するのは問題ない。

残念ながらそうではありません。MQLのターゲット層は、誰なのか(プログラミングの基本を知っているアプリケーションプログラマーだと思います)。

そして、これはやはりMQL5でしょう(開発者はMQL4ではもうアップデートはないと繰り返し言っています)。

MQL5自体は、最初は非同期モードで動作します。履歴データの要求(例えば、データを返すか、バックグラウンドでページングを開始してエラーを返すか)。 この方法で、端末とMQLプログラム間のデータ交換に関してすべてが機能します。

というのも、値を返す 代わりにデータの準備状態を常にチェックする必要があるなど、この瞬間がすでに困惑しているのです......。MQL4からコンバートする場合、本当に不便です。


と、ここで別の話題ですが、簡単な構造のMQLプログラムで、異なるイベントを非同期で入力する......というのはどうでしょう。その対象となるのは誰なのでしょうか?- これらの必要な機能を使うエンドユーザーは誰なのか?

;)

 
Andrey Barinov:

GUIはメインのEAで回し、それ以外は別のEAで回すようにします。この独立したスレーブEAは、不可視のOBJ_CHARTに 配置され、メインのEventSendCustom()パスと相互作用する。

今はどうなんだろう。以前は、OBJ_CHART上でスクリプトのみが動作していたようです。その他にも、入力パラメータに若干のクセがあった。

Market Watchから全シンボルのバーを要求してみた。全員分の履歴をアップロードしています。数十秒の1サイクルパス!控えめに言っても、MT5には満足していない。
 
fxsaber:

今はどうなんだろう。以前は、OBJ_CHART上ではスクリプトのみが動作していたようです。その他にも、入力パラメータに若干のクセがあった。

Market Watchから全シンボルのバーを要求しようとした。アップロードされたすべての履歴を表示します。数十秒の1サイクルパス!控えめに言っても、MT5には満足していない。

Expert Advisorは実行されますが、ticksもtimerも動作しません。すべてを実行する唯一の方法は、OnChartEvent(ティックとタイマーはメインEAからそこに渡すことができます)を介してです。

その他、特に制限を感じることはありません。すべてがうまくいく。

しかし、同じ原理で通常のチャートでも同じことができます。(MT4ではOBJ_CHARTが ないので、このようにしています)
 
Andrey Barinov:

アドバイザーは起動しますが、ティックもタイマーも動作しません。OnChartEventのみを使用してすべてを開始することができます(そして、ティックとタイマーはメインのEAからそこに送信することができます)。

その他、特に制限を感じることはありません。すべてがうまくいく。

かっこいいですね。この可能性は知りませんでした。インジケータにguiを入れて、リソースでやりとりすればいいのでは?こんな感じで持っています。EventChartCustom() は最大128個のシンボル、doubleとlongを一度に送信し、OnChartEvent()のキューに入ります。 リソースには、単位を介して任意の文字と任意の型の値を配置することが可能です。しかも、キューに入らない。必要なときに必要なものを手に入れることができる。
 
Реter Konow:
かっこいいですね。この可能性は知りませんでした。インジケータにguiを入れて、通信にリソースを使えばいいじゃないですか。こんな感じで持っています。EventChartCustom()は一度に128個までのシンボル、doubleとlongを送信し、OnChartEvent()のキューに入ります。 しかし、リソースには無限のシンボルと単位を介して任意の型の値を置くことができます。しかも、キューに入らない。必要なときに必要なものを手に入れることができる。

ありがとうございます、OnChartEventは 知りませんでした。同期をカスタムイベントで行っているのでしょうか?データ交換?

 
Реter Konow:
かっこいいですね。このような機能があることを知りませんでした。インジケータにguiを入れて、リソースを使えばいいのでは?こんな感じで持っています。EventChartCustom()は最大128個のシンボル、doubleとlongを一度に送信し、OnChartEvent()のキューに入ります。 リソースには、単位を介して任意の文字と任意の型の値を配置することが可能です。しかも、キューに入らない。必要なときに必要なものを手に入れることができる。

OnChartEventでデータを渡さない。イベントのみ。そうでなければ、EAエージェントにイベントはなく、この方法でONTIMER_BEATと ONTICK_BEATを受け取ります。

データのやり取りは、タスクに応じて、ファイル経由でもリソース経由でも可能です。ファイルは、ターミナルを再起動した後にGUIなどを復元する際にも使うので、もっと頻繁に使っています。

端末の再起動後にGUIを記憶し、外観を復元することができますか?

 
fxsaber:

ありがとうございます、OnChartEventは知りませんでした。同期をカスタムイベントで行っているのでしょうか?データ交換?

各サイドの各メッセージにはシーケンス番号があります。当事者Aが当事者Bにメッセージを送るとき、まず、前のメッセージが読まれたかどうかを調べます。そうでない場合は、新しいものを送らない。BがAへメッセージを送るとき、前のメッセージが読まれたかどうかも調べます。
 
Andrey Barinov:

OnChartEventでデータを送信しない。イベントのみ。そうでなければ、EAエージェントにイベントはなく、この方法でONTIMER_BEATとONTICK_BEATを受け取ります。

データのやり取りは、タスクに応じて、ファイル経由でもリソース経由でも可能です。ファイルは、ターミナルを再起動した後にGUIなどを復元する際にも使うので、もっと頻繁に使っています。

端末の再起動後にGUIを記憶し、イメージを復元することは可能ですか?

EventChartCustom() を完全に削除することをお勧めします。まさにキューが原因で、時にはスローダウンを引き起こす可能性があります。タイマーの周波数で双方向の要求をするリソースを通じて交流する。例えば、サイドAがOnChartEvent()で大きくロードされ、サイドBがキャンセルボタンのイベントを送信した場合、サイドAは何らかの無意味なロードにより、このイベントを遅れて受信する可能性があります。

はい、カーネルをファイルに保存して、ファイルからロードしています。この場合、再起動後にすべての設定と外観が最後の表示に戻されます。しかし、通常、再起動後は起動時の設定が必要なので、この機能は使っていません。

 
Реter Konow:

私は、EventChartCustom() を完全に削除することをお勧めします。まさにキューが原因で、時にはスローダウンを引き起こすことがあります。 タイマーの周波数で双方向の要求を するリソースを通じて交流する。例えば、サイドAがOnChartEvent()で大きくロードされ、サイドBがキャンセルボタンのイベントを送信した場合、サイドAは何らかの無意味なロードにより、このイベントを遅れて受信する可能性があります。

OBJ_CHART 上にあるEAでは、タイマーが動作しない。 そこには、(OnChartEventを除く)イベントはありません。したがって、すべてのイベント(OnTick、OnTimerなど)をメインEAからそこに送信する必要があります。

それに、私はそこにボタン押しを送ったりはしないんです。その必要はないんです。
 
Andrey Barinov:

OBJ_CHART 上にあるEAでは、タイマーが動作しません。 そこには、(OnChartEventを除く)イベントはありません。したがって、すべてのイベント(OnTick、OnTimerなど)は、メインEAからそこに送信する必要があります。

それに、私はボタンを押したものを何度も送ったりしません。その必要はないんです。

インジケータはGUIのキャリアとして、リソースはEAへのリンクとして利用することを提案します。また、MT4では、Expert Advisorのテスターをパネルを使って標準のチャートから操作することができるようになる予定です。ボタンだけでなく、すべてのコントロールが機能します。テスト中のEAにテキストでも何でも送れるようになります。すでにテスト済みです。すべてがうまくいく。

ZS.そして、テスト中のEAは、通常のチャートとは異なるデータを送信します。