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

 
Yuriy Asaulenko:


トピックを読み直し始めたら、イゴールさんがすでに書かれていました。

Пишите dll (в которой Вы должны выделить память и зарегистрировать новый поток! - затем при выходе все аккуратно уничтожить!) и вызывайте ее из MQL

これが、私が言いたかったユーリ、メモリの確保とフローの登録が必要ということです。
イゴールはアロケーションと登録が必要だと言っていますが、あなたは何もする必要がないと言っています。
だから、頭がクラクラするんです。その結果、デッドロックに陥ってしまうのです。

イゴールは大学で専門的に勉強したのだから、私たち独学組よりは理解しているはずだ。
私は当初から、「メモリは必ず確保して初期化しなければならない」という考え方に傾いていました。
初期化とメモリの確保は、流れてはいけない、ゴミになってはいけないということで、正しいコーディングのための重要なポイントです。

そこでIgorに質問なのですが、C++でどうやるか説明してください。
言葉でなく、例で、何も理解できない ))

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}
 
Roman:

トピックを読み直し始めたら、イゴールさんがすでに書かれていました。

それがユーリ、メモリを確保してフローを登録しましょうと言いたかったんです。

はい、もちろんそうです。でもDllMainは関係ない)- それは他のもののためです。そして、あなたのためでもない。忘れてください、良いことです)あなたには存在しないのです。
エクスポート機能を記述する。あとは、通常の番組とまったく同じです。そこも同じにする必要があります。
残りは後で、もう寝てます))。
 
C/C++は複雑すぎるから、C#を使え。
 
Roman:

スレッドを読み直し始めたら、イゴールがすでに書いていた。

私も当初は、メモリを確保して初期化するという考えに傾いていました。
初期化とメモリの確保は、ゴミを垂れ流してはならないので、正しいコーディングのための重要なポイントです。

そこでIgorに質問なのですが、C++でどうやるか説明してください。

あなたは見事にこのスレッドを議論のトップに押し上げ、自分の問題に多くの参加者を引き付けようとしています ))))

通信文の内容を鵜呑みにしない。

- WinAPIの仕組みを理解したいなら、DLLの書き方に関する既成の例を使えばいいという文脈で書きました=このリソースに20以上の記事があります

- 私は、システムプログラマーがすでに書いてくれたプラグインを置き換えることで、純粋なWinAPIコールに到達できるような文脈でこれを書きました

....

文通のポイント:書くこと、書くことではなく、読み始めること、そして何かをすること...。あなたは多くのことを理解し、あなたは何を理解し、どのようにWindowsで動作しますが、この知識は、アプリケーションプログラマから唯一の機械的な仕事として あなたから、需要にはなりません- プロジェクトの種類を選択し、コードを追加し、コンパイル=結果を得た- あなたのためのすべての作業は、システムプログラマの何百、何千をやった。テンプレートやインクルードファイルの修正は、意味があるものでなければなりません。"なぜこんなにコードが必要なのか、すでに機能しているじゃないか!"という口実で、わからない場合は、そのようにします。- 再現性のないバグやOS/PCの互換性の欠如が発生します。

 
Vladimir Simakov:
クリエイターのためのポストです。 トロール離れ。GUIの場合、OnChartEventを別スレッドにするのが良さそうです。

なぜ開発者が作ったモデルを壊してしまうのか?- MQLプログラムのモデルは単純明快で、イベントがあり、これらのイベントを処理するエントリポイントがあります(OnTick()、OnInit()...、OnChartEvent() )。

あらゆるMQLプログラムからトレード環境の状態を取得できる可能性があり(インジケータでもオープンオーダーの利益を確認できるなど)、Expert Advisor+スクリプト、Expert Advisor+ユーザーインジケータを同じチャート上で組み合わせることができます - MQLプログラムの非同期実行、EAのトレード、インジケータによるグラフ表示 - もしユーザーインジケータストリームの パフォーマンスが十分ではない(彼らは1スレッドで機能)場合はもちろん問題です - あなたは2台のチャートに2つのEAを使い、それらの相互関係を整えることが必要になります。

なぜこの機能が必要なのか、何度も尋ねたのですが、今のところ答えはなく、3Dビジュアライゼーションに関する空間的な推論だけです...。そして、3Dで動作させるためのDirectXをどこで入手するかという議論はありません ;)

imho, it works!)))

 
Igor Makanu:

なぜ開発者が作ったモデルを壊してしまうのか?- MQLプログラムのモデルは単純明快で、イベントがあり、これらのイベントを処理するエントリポイントがあります(OnTick()、OnInit()...、OnChartEvent() )。

あらゆるMQLプログラムからトレード環境の状態を取得できる可能性があり(インジケータでもオープンオーダーの利益を確認できるなど)、Expert Advisor+スクリプト、Expert Advisor+ユーザーインジケータを同じチャート上で組み合わせることができます - MQLプログラムの非同期実行、EAのトレード、インジケータによるグラフ表示 - もしユーザーインジケータストリームの パフォーマンスが十分ではない(彼らは1スレッドで機能)場合はもちろん問題です - あなたは2台のチャートに2つのEAを使い、それらの相互関係を整えることが必要になります。

なぜこの機能が必要なのか、何度も尋ねたのですが、今のところ答えはなく、3Dビジュアライゼーションに関する空間的な推論だけです...。そして、3Dで動作させるためのDirectXをどこで入手するかという議論はありません ;)

imho, it works!)))

見てください。ボタンがあります。クリックするとOnChartEventがキューに入る。しかし、このキューにはすでにOnTickがあり、それに続いてOnTimeがあり、それらの中にすべてのツールのCopyRateがあり、一瞬ブロックしてクソみたいな反復のためにループしています。その結果、例えばボタンでダイアログウィンドウを開くような場合、動作が重くなる。もちろん批判的ではないですが、いい加減なものです。
 
Vladimir Simakov:
見てください。ボタンがあります。クリックするとOnChartEventがキューに入る。しかし、このキューにはすでにOnTickがあり、それに続いてOnTimeがあり、それらの中にすべてのツールのCopyRateがあり、一瞬、ブロックしてクソほど反復してループしているのです。その結果、例えばボタンでダイアログウィンドウを開くような場合、動作が重くなる。もちろん批判的ではないですが、いい加減なものです。

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

マルチスレッドのようなものを取得します。そのように実装しています。

 
Vladimir Simakov:
見てください。ボタンがあります。クリックするとOnChartEventがキューに入る。しかし、このキューにはすでにOnTickがあり、それに続いてOnTimeがあり、それらの中にすべてのツールのCopyRateがあり、一瞬、ブロックしてクソみたいな反復のためにループしています。その結果、例えばボタンでダイアログウィンドウを開くような場合、動作が重くなる。もちろん批判的ではないですが、いい加減なものです。

OnChartEventのOnTickとOnTimeは知りませんが、開発者は、EAが忙しくてイベントを処理していない場合、このイベントはキューを作らない、つまり、単なるティックまたはタイマースキップであると書いています(OnChartEvent - 知りません、確認しませんでした)。


開発者のロジックは単純で、各イベントはExpert Advisorの特定のアクションですが、私が確実に知っていて何度も確認したのはこのイベントです(私はMT5でより理論的に仕事をしているので、ONTickが物理的にどう動くかは知りません)。

MT4の場合、はっきり言いますが、すべての取引操作は 受信ティックを通してのみ行うべきです。そうしないと、十中八九、サーバから取引操作の拒否を受けることになります。

すなわち、BUYボタンとのインターフェースが実装されている - 我々の考えによると、あなたはBUYを押すとすぐに注文を送信しますが、それは直接動作しません、あなたはユーザーコマンドを覚えておく必要があります(理想的には、それがyakしないようにボタンをブロック))、ダニの到着時に、OnTick()で - サーバに命令を送信 - これは99%の場合に動作します、すなわちダニは来た - あなたは取引要求(MQLのどこからでもない)を実行することができます。



また、非同期フローにOnChartEventを導入すると、実行されたコードの相互ロックが行われるのでは?- 例えば、OnChartEventでボタンを押すと取引統計が得られ、OnTickで同じ関数(最後の負け取引)が使用されます。- imho、すべてを解決することはできない!

 
Andrey Barinov:

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

マルチスレッドのようなものを取得します。そのように実装しています。

その通りです。メイドがいないために・・・。松葉づえといいます。
 
Igor Makanu:

OnChartEventのOnTickとOnTimeは知りませんが、開発者は、EAが忙しくてイベントを処理していない場合、このイベントはキューを作らない、つまり、単なるティックまたはタイマースキップになると書いています(OnChartEvent - 知りません、確認しませんでした)。


開発者のロジックは単純で、各イベントはExpert Advisorの特定のアクションですが、私が確実に知っていて何度も確認したのはこのイベントです(私はMT5でより理論的に作業するので、ONTickが物理的にどう動くかは知りません)。

MT4の場合、はっきり言いますが、すべての取引操作は 受信ティックを通してのみ行うべきです。そうしないと、十中八九、サーバから取引操作の拒否を受けることになります。

すなわち、私はBUYボタンでインターフェースを作成しました - 私の考えによると、あなたはBUYを押すとすぐに注文を送信しますが、それは直接動作しません、あなたはユーザーコマンドを記憶する必要があります(理想的には、それがyakしないようにボタンをブロック))とOnTick()でダニの到着時に - サーバに命令を送信 - これは99%のケースで動作します、すなわちダニは来た - あなたは取引要求を実行できます(MQLのどこかからではない)。



また、非同期フローにOnChartEventを導入すると、実行されたコードの相互ロックが行われるのでは?- 例えば、OnChartEvent でボタンを押すと取引統計が取得され、OnTick で同じ関数(最後の負け取引)が使用されると、何か重大なことになります。- imho、すべてを解決することはできない!

同期はプログラマーの仕事であり、方法がわからなければマルチスレッドを使うことはないでしょう。クリエイターの仕事は道具を与えることであり、そうすれば誰もが悪のコバンザメそのものになるのです。同じア・ラ・ミューテックスでも、全く問題ありません。