記事"MQL5 (MQL4)から MySQL データベースにアクセスする方法"についてのディスカッション

 

新しい記事 MQL5 (MQL4)から MySQL データベースにアクセスする方法 はパブリッシュされました:

本稿はMQL と MySQLデータベース間のインターフェース作成について説明します。また、既存の実用的ソリューションについて話し、データベースと連携するライブラリのより便利な実装方法を提供します。関数の詳細記述、インターフェースの構成、MySQLと連携する特別な機能を取り上げます。ソフトウェアソリューションについては、本稿の添付に動的ライブラリ、ドキュメンテーション、MQL4 および MQL5 言語のスクリプト例があります。

MQL とデータベースの連携問題は新しいものではありませんが、それでも関連性のあるものです。データベースの利用は MetaTrader の機能を大いに強化します。:価格履歴の格納と分析、あるトレーディングプラットフォームから別のプロットフォームへのトレードコピー、サーバー側での思 い分析的計算および/またはスケジュールの使用、モニター、ウェブ技術を利用しての遠隔でのアカウント管理。

いずれにしてもMQL と MySQLの組合せで利益を得ようとする試みは数多くあります。ソリューションの中には CodeBaseで利用可能なものもあります。

たとえば "MySQL wrapper - library for MetaTrader 4" はプロジェクトで、そこから多くのプログラマーが更なる追加を加えて自分自身の開発を始めるのです。私見ですが、このソリューションの欠点のひとつはデータベースからデータを読むための特殊配列の割当てです。

もうひとつ別のプロジェクト "MySQL logger 1 - EA for MetaTrader 4" は専門性の高いのもので、標準ライブラリlibmysql.dll にアクセスするのにそれはラッパーを使用しません。. そのため、MetaTrader4 Build 600+では動作しません。char 文字タイプが wchar_tで置換され、 TMYSQLストラクチャポインターの代わりに int タイプを使用するとプロジェクト内でメモリリークを起こしてしまうためです(割り当てられたメモリが制御/解放できません)。

その他興味深いプロジェクトは "EAX_Mysql - MySQL library - library for MetaTrader 5"です。それはひじょうにすぐれた実装です。著者によるデメリットのリストはそれを使用するのにくらか制限を課します。

プロジェクト内でデータベースを使用する必要のある人には選択肢が2つあります。:自分でソリューションを作成し、隅々まで知るか、または第三者ソリューションを使用/採用し、それの使用法を学びプロジェクト支障をきたす可能性のある欠陥をすべて検出するかです。

私はそのような必要性があり、かなり複雑な売買ロボット開発中にその2つの選択肢に直面しました。既存のプロジェクトを検索し、ひじょうに多くのソ リューションを調査して、私はみつけた実装がどれとして私の売買ロボットを『プロレベル』にする役に立たないのが判ったのです。

また、異常なソリューションもありました。たとえば、DML/DDL 処理(挿入/更新/データ削除/データベース内オブジェクトの作成/ドロップ)が標準 libmysql.dll を使用して行われたり、データ選択(SELECT)は実際に HTTP リクエスト(inet.dllを使用して)としてMySQL サーバー側のウェブサーバーに置かれている PHP スクリプトに実装されていたのです。SQL クエリは PHP スクリプト内に書かれています。

別の言い方をすれば、プロジェクトを実行するためには、次のコンポーネントが利用可能であるようにし構成されており、実行し続ける必要がありま す。:MySQL サーバー、Apache/IIS ウェブサーバー、サーバー側の PHP/ASP スクリプトなど。かなり多数の技術の組合せです。もちろんある状況ではこれは可能かもしれませんが、ただ一つのタスクがデータベースからのデータ選択であ れば、これはナンセンスです。その上、そのような面倒なソリューションをサポートすることは時間がかかります。

ソリューションのほとんどはデータ挿入、オブジェクト作成などすになにも問題はありません。問題はデータ選択です。データは環境を呼びだすために返されるためです。

私はこの目的で配列を使用することは実用的でなく不便であると思います。それは単純に開発/デバッグ/メインプロジェクトのサポートの過程でデータ ベースに対してクエリを選択することは変更可能で、一方で配列に対する正しいメモリ割り当てを管理する必要があるためです。これは避けられるし、避けるべ きです。

これ以降、話の対象となる MQL ⇔MySql 間の連携はOracle PL/SQL、 MS SQL T-SQL、AdoDB で使用される典型的な方法に基づきます。カーソル使用です。このインターフェースはプログラミング、管理を容易にし、プラスコンポーネントを最小にするこ とを目標として作成されました。それは標準ライブラリ libmysql.dll に対する DLL ラッパーとして、また .mqhファイルとしてのインターフェース関数セットとして実装されます。


1. MQL ⇔ MySQL インターフェース

MetaTrader ターミナルの接続(MQL プログラムをとおして)は以下のコンポーネントの助けを借りて実装することができます。

MQL と MySQL の連携スキーム

作者: Eugeniy Lugovoy

 
DB = MySqlConnect(Host, User, Password, Database, Port, Socket, ClientFlag);

ティック ごとに呼び出すと大きな負荷がかかるのでは?

initでデータベースに接続し、識別子を使用してアクセスする方が論理的ではありませんか?

 
DKeN:

ティックごとに呼び出すと大きな負荷がかかるのでは?

initでデータベースに接続し、識別子を使用してアクセスする方が論理的ではありませんか?

こんにちは。Expert AdvisorとIndicatorsの場合、データベースへの接続は初期化関数で行われます。各ティックで データベースとの接続を確立する方法についての推奨事項は記事にはありません。スクリプトの例のみが示されており、スクリプトには初期化がないことをご理解ください。
 

ユージン、記事をありがとう。DBMSに関する興味深い資料だ。

私はそのような問題を抱えています。

私はMetaTrader5、x64、975ビルドを持っています。

スクリプト "MySQL-001 "を実行すると、エラーが発生します:

RL      1       12:41:22.443    MySQL-001       'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll' is not 64-bit version
PG      1       12:41:22.474    MySQL-001 (AUDCAD.e,M1) Cannot load 'C:\Program Files\MetaTrader5\MQL5\libraries\MQLMySQL.dll'
DK      2       12:41:23.677    MySQL-001 (AUDCAD.e,M1) Cannot call 'cMySqlVersion', '..\libraries\MQLMySQL.dll' is not loaded
ID      2       12:41:23.677    MySQL-001 (AUDCAD.e,M1) unresolved import function call

理由は、私が理解しているように、システムが64ビットライブラリをロードしようとしているからです。

 
denkir:

ユージン、記事をありがとう。DBMSに関する興味深い資料だ。

私はそのような問題を抱えています。

私はMetaTrader5、x64、975ビルドを持っています。

スクリプト "MySQL-001 "を実行すると、エラーが発生します:

理由は、私の理解では、システムが64ビットライブラリをロードしようとしているからです。

私は主に32ビット端末で作業しているため、プロジェクトは x32用にコンパイルされています。数日中にMT5 x64でコンパイルしてテストしてみます。

コメントありがとうございます。

 

メタトレーダー5用ライブラリバージョン - x64

- プロジェクト MQLMySQL.DLLはx64用に再コンパイルされています(ソースは修正されていません)。

- 標準のLibMySQL.DLLは最新の安定版MySQLディストリビューションv5.6.21 x64から取得しています。

実際、MT5 x64でプロジェクトを実行しようとした人のために、MQL5Librariesディレクトリの内容だけを置き換えることができます。MQLプログラムのソースコードを修正したり再コンパイルする必要はありません。

Denis(denkir)氏のご指摘に感謝します。

ファイル:
 

私はそれを読んで涙した。著者に恨みはない。彼が批判を適切に扱ってくれることを願っている。とにかく

1.なぜ別のDLLという形でラッパーを書くのでしょうか?MQL言語は、しばしば熊手と化すような松葉杖を書くような開発段階にはない。

2.2.このような作業の結果、なぜ必要なものをすべて備え、著者が言及しているような先行製品の欠点を解消したクラスが書かれないのでしょうか?

3.特にこの点に注目したい:

string SQL;
SQL = "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632);";
SQL = SQL + "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3621,1.3643);";
SQL = SQL + "INSERT INTO EURUSD(Ask,Bid) VALUES (1.3605,1.3629);";

実は、すべてがもっとシンプルなのだ:

string SQL="INSERT INTO EURUSD(Ask,Bid) VALUES (1.3601,1.3632),(1.3621,1.3643),(1.3605,1.3629);";

一般的に、この記事は「どうすべきか見て学ぶ」のではなく、「何ができるか見てみよう!」というスタイルで書かれている。

 
avoitenko:

私はそれを読んで涙した。著者に恨みはない。彼が批判を適切に扱ってくれることを願っている。とにかく

1.なぜ別のDLLという形でラッパーを書くのでしょうか?MQL言語は、しばしば熊手と化すような松葉杖を書くような開発段階にはない。

2.2.このような作業の結果、なぜ必要なものをすべて備え、著者が言及しているような先行製品の欠点を解消したクラスが書かれないのでしょうか?

3.特にこの点に注目したい:

実は、すべてがもっとシンプルなのだ:

一般的に、この記事は「どうすべきか見て学ぶ」のではなく、「何ができるか見てみよう!」というスタイルで書かれている。

順を追って答えよう。

MQL言語が現在の開発段階になく、MQL4にはクラスも構造体もありませんでした。

そしてソフトウェア・ソリューションは、MQL4とMQL5の両方で動作し、MQL4からMQL5への移行(必要な場合)には最小限のコストで済むものでなければなりませんでした。このプロジェクトは最近まで最終決定が行われていた。

プロジェクトがクラスとして実装されなかったのはそのためです。クラスが欲しいですか?問題ありません!誰もあなたを禁じてはいません。

さて、1つではなく3つのINSERTについて。私がこのように書いたのは(著作権上も)以下の理由からです:

- 一般的に受け入れられている標準SQL'92やSQL'2000に違反しない;

- この分野の初心者プログラマにとって、読みやすく理解しやすい;

- 1つのINSERT命令ではなく、正確に3つのINSERT命令の実行のデモンストレーション。

マルチステートメントにはあらゆるDML/DDL/DCL操作が含まれますが、あなたの例は1つのテーブルに対するINSERT操作に限定されています。

P.S. この記事は、"Take and use "スタイルで書かれています。

 

ありがとう!MQLだけに頼るよりも安定しているかもしれません。

参考までに、MT4ビルド600+用に私が少し前に書いたMQL4専用のブリッジがあります: https://www.mql5.com/ja/code/11114

MySQL for new MQL4 (tested in build 600)
MySQL for new MQL4 (tested in build 600)
  • 投票: 12
  • 2014.02.10
  • Sergey
  • www.mql5.com
Connecting to MySQL server from new MQL4
 
lukins:

ありがとう!MQLだけに頼るよりも安定しているかもしれません。

参考までに、少し前にMT4ビルド600+用に書いたMQL4専用のブリッジがあります: https://www.mql5.com/ja/code/11114

この記事をお読みいただきありがとうございます。私もあなたの(https://www.mql5.com/ja/code/11114)を チェック しました。このような解決策はずいぶん前(MT4ビルド600以前)に見つけたことがあり、MQLとMySQLを友好的にするアイデアが気に入りました。MQLとMySQLをフレンドリーにするアイデアは気に入っていたのですが、データベースからデータを取得するために配列を使いたくないのです。そのため、MT4とMT5で使うためにこのソリューションを作りました。

また、記事にx64ベースのプロジェクトを追加するのを忘れていました。DLLがx64用に再コンパイルされただけで、ソースは何も変わっていません。

幸運を祈る、

ユージン

MySQL for new MQL4 (tested in build 600)
MySQL for new MQL4 (tested in build 600)
  • 投票: 12
  • 2014.02.10
  • Sergey
  • www.mql5.com
Connecting to MySQL server from new MQL4
 
x64プラットフォームでは、以下のライブラリを使用する(議論あり)。