記事"MQLベースのエキスパートアドバイザとデータベースの統合 (SQL server、.NET、および C#)"についてのディスカッション

 

新しい記事 MQLベースのエキスパートアドバイザとデータベースの統合 (SQL server、.NET、および C#) はパブリッシュされました:

この記事では、MQL5 ベースのEAに対して Microsoft SQL server データベースサーバーを使用する方法について説明します。 DLL からの関数のインポートが使用します。 DLL は、Microsoft .NET プラットフォームと C# 言語を使用して作成します。 この記事で使用するメソッドは、マイナーな調整があり、MQL4で書かれているEAに適しています。

MQL5コミュニティでは、たびたびEAにデータベースとタスクを統合する方法についての質問が浮上します。 このトピックへの関心は驚くべきことではありません。 データベースは、データを保存する手段として非常に優れています。 ターミナルログとは異なり、データはデータベースから消えません。 必要なものだけを選び、選別し、フィルターし易いという特徴があります。 データベースを使用すると、特定のコマンドなど、必要な情報をエキスパートに渡すことができます。 そして最も重要なことに、得られたデータは、異なる観点から分析し、統計的に処理することができます。 たとえば、1行のクエリを作成するだけで、各通貨ペアの指定した時間の平均と総利益を調べることができます。 そして手動でトレードターミナルのアカウント履歴を計算する場合、かかる時間を想像してみてください。

残念ながら、メタトレーダーは、データベースサーバーと通信するための組み込みツールを提供していません。 この問題は、DLL ファイルから関数をインポートすることによってのみ解決できます。 このタスクはシンプルではありませんが、実行可能です。

EAを起動し、接続文字列の値をデータベース・サーバのアクセス・パラメータに変更します。 すべてが正しく行われている場合、エキスパートは次をログに出力します。

2018.07.10 20:36:21.428    MqlSqlDemo (EURUSD,H1)    Connected to database.
2018.07.10 20:36:22.187    MqlSqlDemo (EURUSD,H1)    Created table in database.
2018.07.10 20:36:22.427    MqlSqlDemo (EURUSD,H1)    Data written to table.
2018.07.10 20:36:22.569    MqlSqlDemo (EURUSD,H1)    Number read from database: 1
2018.07.10 20:36:22.586    MqlSqlDemo (EURUSD,H1)    String read from database: Test

データベースへの接続、SQL コマンドの実行、データの書き込みと読み取り-すべてが正常に実行されました。

作者: Сергей Ткаченко

 
MetaQuotes Software Corp.:

記事「MQL Expert Advisorとデータベース(SQL Server、.NET、C#)の統合」が掲載されました:

著者:Sergey Tkachenko

つい最近、フォーラムでC# DLLをMQL5に直接接続する方法について議論しました。その前はC++のDLLを使っていました。セルゲイ、Entity Frameworkはこの技術で使用できますか?特にCodeFirstに興味があります。

 

残念ながら、Entity Frameworkについては何も言えません。そして、比較的新しいC#と.NETテクノロジーについてはほとんど経験がありません。

もし私がそれをしなければならないとしたら、試してみるだろう。おそらく、うまくいくだろう。特に、高度な機能をエクスポートされた静的関数の中で使わず、いくつかの補助クラスのプライベート関数でラップして、そこで適用するのであれば。私のあるプロジェクトでは、System.Collections.Generic.Private関数のクラスを使いました。

 
Сергей Ткаченко:

残念ながら、Entity Frameworkについては何も言えません。また、比較的新しいC#や.NETテクノロジー全般については、ほとんど経験がありません。

もし私がそれをしなければならないとしたら、それを試してみるだろう。おそらく、うまくいくだろう。特に、高度な機能をエクスポートされた静的関数の内部で使わず、いくつかの補助クラスのプライベート関数にラップして、そこで適用するのであれば。私はあるプロジェクトでSystem.Collections.Genericのクラスを使った。

なるほど、経験があるので、機会があれば試してみます。一般的に、.NETのDLLファイルからアンマネージドコードに関数をエクスポートするデメリットはありますか?つまり、Renat F.はそのようなことについてよく悪態をついているということです。彼は怖い話のレベルで最も一般的な議論をする。

デメリットにお気づきですか?例えば、パフォーマンスの低下、メモリ消費量の増加などだ。

 

他の何かと比較した場合のデメリットについてしか話すことができません。

DLLから関数のエクスポートを使用するEAと、そうでなく純粋なMQLで動作するEAを比較した場合、それはすべて特定のEAの実装とそれが実行するタスクに依存します。全く同じことをする2つのEAがある場合、それは何とも言えません。私は、DLLを使用する方が、DLLをビルドする際のコンパイラによるコードの最適化が優れて いるため、より高速になると推測している。しかし、これはあくまでも仮定であって、直接比較したわけではない。私は通常、MQLで行うのが難しいか不可能なこと(例えば、記事で説明されているデータベースを使った作業)だけをDLLで行った。そのため、DLLにアクセスする場合としない場合では、私のExpert Advisorは異なるタスクを実行した。

DLLを使用するExpert Advisorには、信頼性が低いという欠点がある。稀にではあるが、「Access violation at 0x08364576」(メモリアドレスの桁が異なる)というエラーが出ることがあるのだ。純粋なMQLをベースとしたロボットにはこのようなエラーはありません。もちろん、DLLがどのように実装されているか、どの程度複雑か、メモリエラーに関して危険な可能性のある場所がすべてチェックされているかなど、すべては特定のDLLに依存します。しかし、私のExpert Advisorでは、2~3ヶ月はすべてうまく動作していたのに、1つのMTで稼働している5つのExpert Advisorのうちの1つを再起動すると、ログにこのエラーが表示されることがあります。純粋なMQLの場合、このようなことは起こりません。

C#でDLLから関数をエクスポートする方法と、通常のDLLからエクスポートする方法、例えばC++でエクスポートする方法を比較すると、それぞれの方法には長所と短所があります。私はC++とQtで別のDLLを作った。このDLLもデータベースで動作していたが、SQL ServerではなくSQLiteだった。メモリ・アクセス・エラーもあったし、.NETのDLLよりもずっと頻繁に発生した。しかし、プロジェクトが "クリーンアップ "され、nullへのポインタが必要な箇所でチェックされ、メモリが解放されるなどすれば、逆に信頼性が高まるかもしれない。しかし、C#では、すべてが自動的にチェックされ、解放されるので、何となく楽なのだ。パフォーマンスの違いには気づいていない。しかし、私のC++/Qtプロジェクトはあまり利用されていない。

 
Сергей Ткаченко:

ここでのマイナスは、他の何かとの比較でしか語れない。

DLLからの関数のエクスポートを使用するEAと、そうでなく純粋なMQLで動作するEAを比較するならば、それはすべて特定のEAの実装とそれが実行するタスクに依存します。全く同じことをする2つのEAがある場合、それは何とも言えません。私は、DLLを使用する方が、DLLをビルドする際のコンパイラによるコードの最適化が優れて いるため、より高速になると推測している。しかし、これはあくまでも仮定であって、直接比較したわけではない。私は通常、MQLで行うのが難しいか不可能なこと(例えば、記事で説明されているデータベースを使った作業)だけをDLLで行った。したがって、DLLにアクセスする場合としない場合では、私のExpert Advisorsは異なるタスクを実行した。

DLLを使ったExpert Advisorには、信頼性が低いという欠点がある。稀にではあるが、「Access violation at 0x08364576」(メモリアドレスの桁が異なる)というエラーが出ることがあるのだ。純粋なMQLをベースとしたロボットにはこのようなエラーはありません。もちろん、DLLがどのように実装されているか、どの程度複雑か、メモリエラーに関して危険な可能性のある場所がすべてチェックされているかなど、すべては特定のDLLに依存します。しかし、私のExpert Advisorでは、2~3ヶ月はすべてうまく動作していたのに、1つのMTで稼働している5つのExpert Advisorのうちの1つを再起動すると、ログにこのエラーが表示されることがあります。純粋なMQLの場合、このようなことは起こりません。

C#でDLLから関数をエクスポートする方法と、通常のDLLからエクスポートする方法、例えばC++でエクスポートする方法を比較すると、それぞれの方法には長所と短所があります。私はC++とQtで別のDLLを作った。このDLLもデータベースで動作していたが、SQL ServerではなくSQLiteだった。メモリ・アクセス・エラーもあったし、.NETのDLLよりもずっと頻繁に発生した。しかし、プロジェクトが "クリーンアップ "され、nullへのポインタが必要な箇所でチェックされ、メモリが解放されるなどすれば、逆に信頼性が高まるかもしれない。しかし、C#では、すべてが自動的にチェックされ、解放されるので、何となく楽なのだ。パフォーマンスの違いには気づいていない。しかし、私のC++/Qtプロジェクトはあまり利用されていない。

そしてもう1つの質問、もしかしたらあなたもそのようなことをしているかもしれない。C#のDLLからインタラクティブなコントロールパネルを起動することは可能なのでしょうか、それともパネルを別のプログラムとして作成し、例えばメモリーマッピングやWCFなど、何らかの方法でDLLとの通信を提供する必要があるのでしょうか?

私は今、1台のローカルコンピューターについて話しています。

 

いや、残念ながら、私はインタラクティブ・パネルを扱ったことはないんだ。推測するしかない。また、「インタラクティブ・パネル」が何を意味するのかよく理解できません。

MetaTraderのウィンドウを開く必要があるのでしょうか?どのようにすればいいのか、あるいはまったくできないのか、私にはわかりません。

ただウィンドウを開いてユーザーからの入力を受け取るだけでよいのでしょうか?私もやったことはありませんが、おそらく難しいことではないと思います。普通のWindowsフォームのウィンドウを定義するクラスを作る。そのクラスで、ウィンドウを作成し、ダイアログ・モードでユーザーに表示し、それを解放する静的なエクスポート可能な関数を作って ください。これでうまくいくはずだ。

 
素晴らしい記事だ!まさに私が探していたものだ!ありがとう、セルジ
 
マークだ。
 
そうだね、とてもいい仕事だ。
 

綿密な議論をありがとう。


ビルド期間中のつまずきについて、誰かが助けてくれることを願っている。

C:\Users\user\source\repos\mql\MqlSqlDemo\packages\UnmanagedExports.1.2.7\tools\RGiesecke.DllExport.targets(58,3): error : Microsoft.Build.Utilities.ToolLocationHelper could not find ildasm.exe


基本的に、UnmanagedExportsユーティリティは、その作業を実行するために必要な逆アセンブラの実行ファイルを見つけることができません。


ildasm.exeが存在し、さまざまな場所にあることは事実ですが、DllExportに適切なパスを認識させる方法がわかりません。