Статья описывает, как добавить в экспертов на MQL5 возможность работы с сервером баз данных Microsoft SQL Server. Используется импорт функций из DLL. Для создания DLL применяется платформа Microsoft .NET и язык C#. Используемые в статье методы с незначительными изменениями подходят и для экспертов, написанных на MQL4.
マーケットでスクリーンショットを読み込まない。2つのブラウザから試しました。
私もです...。
こんにちは、何が問題なのでしょうか?SQL Serverへの書き込みにDLLを使用しています(記事からの例https://www.mql5.com/ru/articles/2895)。
5スレッドまで使用すると、データは正しく書き込まれます。それ以上のスレッドを使用すると、"Unhandled exception 0xE0434352 "というエラーが発生します。
こんにちは、何が問題なのでしょうか?SQL Serverへの書き込みにDLLを使用しています(記事からの例https://www.mql5.com/ru/articles/2895)。
5スレッドまで使用すると、データは正しく書き込まれます。複数のスレッドを使用すると、「Unhandled exception 0xE0434352」というエラーが一度に表示されます。
インターフェイスDLLのすべての関数でtry catchを使用し、「処理されない例外」をキャッチしてログに書き込む...。
すべての例外をキャッチし、プラスへのすべての呼び出しを試してみるのがよいでしょう。MQLのドキュメントでも、C++ではなくDLLが例外を投げてはいけないとはっきり書かれています。
特に記事の中でconn.Close とnew SqlConnection は「例外の捕捉」に該当せず、例外をスローする可能性があります。
マーケットプレイスでスクリーンショットが読み込まれない。2つのブラウザで試してみました。
私もです...。
写真のドラッグ&ドロップは試されましたか?
トレーディング、自動売買システム、ストラテジーテストに関するフォーラム
マーケットと算数
アレクセイ・ヴィクトロフ, 2021.08.19 21:01
画像をドラッグ&ドロップで挿入してみましょう。
今、隠しExpert Advisorで変更を試み、最初に見た画像をドラッグしてみました。
写真のドラッグ&ドロップは試されましたか?
5枚の写真のうち、1枚だけが追加される
mqlの文字列は、文字列の中やリテラルの中、関数の中にもNULL文字があるのがとても嫌なのです。
正常な方法は、3つの文字列を終端が0の配列に変換することのみです。
つまり、今のこの挙動は数年前に意図的に 行われたものなのです。理由はわかりません。敵だらけ
すべてのインターフェースDLL関数で、すべてをtry catchでラップし、「処理されない例外」をキャッチし、ログに記録する...。
すべての例外をキャッチし、プラスの呼び出しをすべてtryでラップするのが良いアイデアです。MQLのドキュメントでも、C++ではなくDLLが例外を投げてはいけないとはっきり書かれています。
特にconn.Close とnew SqlConnection は例外をスローしないので、例外をスローする可能性があります。
ありがとうございます。確認したところ、共有変数アクセスエラー。筆者も書いています。
デモプロジェクトには非常に大きな制限があることに留意してください。問題は、すべてのEAがロードされたDLLの1つのインスタンスを使用することです。このクラスは静的に作られているため、実行中のExpert Advisorすべてに対して同じものが適用されます。変数も共通となる。複数のエキスパートを実行する場合、それらはすべて同じ接続と1つのコマンド・オブジェクトを使用します。 複数のエキスパートが一度にこれらのオブジェクトにアクセスしようとすると、問題が発生する場合があります。
Q:DLLへのマルチスレッドアクセス(関数呼び出しごとに個別のインスタンス、呼び出しごとにローカルな変数)を実装するにはどうすればよいですか?
MT5テスターでこの問題が発生しています。
複数の通貨を扱う場合、データが他の通貨と入れ替わることがあります。テスターを確認する。訂正してください。
最初の値はSymbolInfoDouble(symbol,SYMBOL_BID) である。
まるで価格を受け取れないかのようにSymbolInfoDouble(EURGBP,SYMBOL_BID); と、作業中の他のペアから値を取得します。引用が正しいかどうかを確認する方法はありますか?
ありがとうございました。確認したところ、共有変数アクセスエラー。筆者も書いています。
デモプロジェクトには非常に大きな制限があることに留意してください。問題は、すべてのEAがロードされたDLLの1つのインスタンスを使用することです。このクラスは静的に作られているため、実行中のExpert Advisorすべてに対して同じものが適用されます。変数も共通となる。複数のエキスパートを実行する場合、それらはすべて同じ接続と1つのコマンド・オブジェクトを使用します。 複数のエキスパートが一度にこれらのオブジェクトにアクセスしようとすると、問題が発生する場合があります。
Q:DLLへのマルチスレッドアクセス(関数呼び出しごとに個別のインスタンス、呼び出しごとにローカルな変数)を実装するにはどうすればよいですか?
.NETでこれを実現する方法はほとんどない。このクラスがstaticにされているのは、記事の著者が邪悪だからではなく、シャープなクラスはそうやってインポートされるからです。
1) (書くのに時間がかかるが、速く動作する) C++で書き直し、もう.NETには触らない 2) (むしろ機械的に、しかし速度は落ち、副作用があるかもしれない) Critical Sectionで慎重に呼び出しをラップして、2つのスレッドが同時にアクセスするのを避ける。
.netについては分かりませんが、MQLの構造体やスカラーにシャープのオブジェクトへの参照を取得・保存して、それをやり取りすることは可能でしょうか?つまり、通常のC++のポインタと同じように操作することです。それができれば、すべてがシンプルになります。