記事"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

 
Hello I have a question (Please forgive me because I am Japanese because it is a bad sentence for English translation) Selecting multi-byte characters in Mysql garbles characters. Does this program support multibyte characters?
 
Freemans Core:
Hello I have a question (Please forgive me because I am Japanese because it is a bad sentence for English translation) Selecting multi-byte characters in Mysql garbles characters. Does this program support multibyte characters?


Not yet, I'm working on next release with support of multi-byte charachters

現時点では - いいえ。 私はマルチバイト文字サポートで次のリリースに取り組んでいます

 

Hello, I read this document interestingly.

Could I ask you a question?

I wanna know how to confirm the connection with MySQL.

Please teach me how the way to confirm the connection.


about original japanese: そして月曜日、マーケットが開始されるとプロジェクトにエラーが見つかります。よってサーバーの設定で指定したタイムアウトよりも小さい時間間隔でデータベースへの接続および/または再接続を確認することを強くお薦めします。

that means: After then, You will find out an error in your project on Monday. So, I recommend you to confirm that the connection is alive or dead at a time interval shorter than the timeout server settings.


Thank you.

 

Hello, 

I wrote the code for the time being like below.

1. Create a table that has a time record when confirm the connection.

2. UpSert (Insert or Update) that record  at hourly intervals.

3. If the UpSert will be failed, try resync with MySQL.

Please tell me if some methods exists to confirm the connection.

Thank you.

//+------------------------------------------------------------------+
//| MySQLの接続確認と再接続                                           |
//+------------------------------------------------------------------+
bool DBAccess::resync(void)
{
    string  qry = "";

    string  update_time = (string)TimeCurrent();

    qry += "INSERT INTO `" + sync_table + "` (id, update_time) ";
    qry += "VALUES (\'sync\', \'" + update_time + "\') ";
    qry += "ON DUPLICATE KEY UPDATE update_time = \'" + update_time + "\';";
    
    if (MySqlExecute(DBID, qry))    { return true; }
    
    echo("[Try] Database has been disconnected. EA will try resynchronization.");

    bool    sync        = syncDB();
    
    if(!sync)   { return false; }

    return true;
}
for the time beingの意味・使い方 - 英和辞典 Weblio辞書
  • ejje.weblio.jp
for the time beingの意味や使い方 当分の間, さしあたり, 目下. - 約1037万語ある英和辞典・和英辞典。発音・イディオムも分かる英語辞書。
理由: