記事"SQL と MQL5:SQLite データベースとの連携"についてのディスカッション

 

新しい記事 SQL と MQL5:SQLite データベースとの連携 はパブリッシュされました:

本稿はご自身のプロジェクトで SQL を利用することに興味のある開発者を対象としています。ここではSQLite の機能性とメリットについて説明します。SQLite の特別な知識は必要ありませんが、SQL の最小限の知識があれば役に立つと思います。


開発者の多くがデータ保管のためにデータベースを利用することを考えますが、躊躇したままです。 SQL サーバーのインストールに余計な時間がどれほど取られるかわかっているからです。そして一方プログラマーにとってそれはさほど難しいことではなく(データ ベース管理システム(DBMS)がすでに別の目的でインストールされていれば)、それは明らかに、ソフトウェアを一緒にインストールすることに最終的に消 極的な一般ユーザーにとっての問題なのです。

現在取り組んでいるソリューションがほとんど利用されないことがわかっているため、開発者の多くは DBMS に取り組もうとしません。結果、彼らはファイルの操作を来ないます(多様な使用データを与えられ、複数のファイルに対処する必要があることがよくありま す。):CSV、頻度は低いものの XML や JSON、厳格なストラクチャサイズのバイナリファイルなど。

ただ、 SQL サーバーのすばらしい代替があることがわかりました。そしてすべてをみなさんのプロジェクト内で行われるため、追加のソフトウェアをインストールする必要 はありません。それでも SQLのフル性能を利用できるのです。これから SQLiteについてお話していきたいと思います。

本稿のめざすところはみなさんに速くSQLite をスタートしてもらうことです。そのため、細かい部分や考えられるパラメータセットすべてや関数フラグについては述べませんが、その代り、SQL コマンドを実行するための軽い接続ラッパを作成し、使用を実地で見ていきます。

本稿を読み進むにあたりみなさんには以下が必要となります。

  • 良い気分であること ;)
  • 本稿添付のアーカイブファイルをMetaTrader 5 クライアントターミナルフォルダに抽出する。
  • 都合のよい SQLite ビューアをインストールする。(たとえばSQLiteStudio
  • SQLite の公式ドキュメンテーション http://www.sqlite.org をお気に入りに追加する。

作者: o_O

 

いくつかの重要な追加事項があります。

1.作者はsqlite_open()関数を使用していますが、より柔軟なsqlite_open_v2()関数があり、これはオープニングフラグで動作することができます。

#define  SQLITE_OPEN_READONLY         0x00000001  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_READWRITE        0x00000002  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_CREATE           0x00000004  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_DELETEONCLOSE    0x00000008  /* VFSのみ */
#define  SQLITE_OPEN_EXCLUSIVE        0x00000010  /* VFSのみ */
#define  SQLITE_OPEN_AUTOPROXY        0x00000020  /* VFSのみ */
#define  SQLITE_OPEN_URI              0x00000040  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_MEMORY           0x00000080  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_MAIN_DB          0x00000100  /* VFSのみ */
#define  SQLITE_OPEN_TEMP_DB          0x00000200  /* VFSのみ */
#define  SQLITE_OPEN_TRANSIENT_DB     0x00000400  /* VFSのみ */
#define  SQLITE_OPEN_MAIN_JOURNAL     0x00000800  /* VFSのみ */
#define  SQLITE_OPEN_TEMP_JOURNAL     0x00001000  /* VFSのみ */
#define  SQLITE_OPEN_SUBJOURNAL       0x00002000  /* VFSのみ */
#define  SQLITE_OPEN_MASTER_JOURNAL   0x00004000  /* VFSのみ */
#define  SQLITE_OPEN_NOMUTEX          0x00008000  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_FULLMUTEX        0x00010000  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_SHAREDCACHE      0x00020000  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_PRIVATECACHE     0x00040000  /* sqlite3_open_v2()でOK */
#define  SQLITE_OPEN_WAL              0x00080000  /* VFSのみ */

2.私は、計算が「重い」インジケータを使用する際に、EAの最適化を 高速化する問題を解決するためにsqliteを使用してきました。このような状況における論理的な解決策は、最初の実行時に最適化期間中のインジケーターの読み取り値をデータベースに保存し、その後の実行時には、すでに計算された読み取り値をデータベースから直接抽出することです。そのため、sqliteエンジンを「デフォルト形式」で使用すると、INSERTやSELECTクエリを大量に送信するプロセスに多くの時間がかかるようになります。現実的には、1)インメモリデータベースを使用すること、2)SQLエンジンの#pragma-directivesを使用すること、が解決策であることがわかった。

なぜなら、データベースをRAMからディスクにダンプする必要がなくなるからです。データベースに最初のテーブルを作成する前に、以下のクエリを送信する必要があります:

"PRAGMA temp_store = MEMORY;"
"PRAGMA page_size = 65536;"
"PRAGMA cache_size = 16384;"
"PRAGMA journal_mode = OFF;"
"PRAGMA locking_mode = EXCLUSIVE;"
"PRAGMA synchronous = OFF;"

さて、その後は

"CREATE TABLE IF NOT EXISTS"

など。

皆さん、幸運を!

 
alsu:

いくつか重要な追加事項がある(改善提案もある)。

1.作者はsqlite_open()関数を使用していますが、より柔軟なsqlite_open_v2()関数があり、オープンフラグで動作させることができます。

2.私は、計算が「重い」インジケータを使用する際にEAの最適化を 高速化する問題を解決するためにsqliteを使用してきました。このような状況での論理的な解決策は、最初の実行時に最適化期間中のインジケーターの読み取り値をデータベースに保存し、その後の実行時には、すでに計算された読み取り値をデータベースから直接抽出することです。そのため、sqliteエンジンを「デフォルト形式」で使用すると、INSERTやSELECTクエリを大量に送信するプロセスに多くの時間がかかるようになります。現実的には、1)インメモリデータベースを使用すること、2)SQLエンジンの#pragma-directiveを使用すること、が解決策であることがわかった。

なぜなら、データベースをRAMからディスクにダンプする必要がなくなるからです。データベースに最初のテーブルを作成する前に、以下のクエリを送信する:

さて、その後は

など。

皆さん頑張ってください!

テスターを実行する際のインジケーターの読み取りデータは、もともと単純な配列であり、シーケンシャル・アクセスのストリームなので、SQLベースで保存したり読み込んだりするのは冗長であり、合理的ではありません。

この記事の著者がSQLiteの応用例として提案した取引操作のリストについても同じことが言える。

したがって、リレーショナルでマルチリンクされたデータモデルを使用することの効率性は、主に解決しようとするタスクに依存し、IMHOのこれらの例では、「耳で引っ張られる」だけかもしれないことに気づかなければならない。

 
MonetDBというカラム型SQL DBMSがあります。これはデータをカラムに格納するために設計されたフリーのDBMSで、スピードと信頼性に優れています。私が間違っていなければ、どのSQL DBMSでも、トピックで紹介した方法でMTに接続できます。
 
revers45:

テスター実行中のインジケータの読み取りデータは、その性質上、単純な配列であり、シリアルアクセスのストリームであるため、SQLベースに保存したり読み込んだりすることは冗長であり、合理的ではありません。

エキスパート・アドバイザーを最適化する ために、冗長で合理的ではありませんが、もう一度お読みください。


 

使うことは可能だし、それは良いことだ。もうひとつは、SQLiteは シリアスなプロジェクトには使うべきではないということだ。いずれにせよ、私はお勧めしない。私自身、SQLiteの衝突という問題に何度も直面した。例えば、取引ロボットが異なるチャートに接続されているが、同じベースを使っていて、アドレスが1つの汎用テーブル(例えば、登録/変更セッション、口座)になっている場合、どのような場合でも「テーブルがロックされています」というようなエラーが出ます。そして、すべてのトランザクションが完了し、カーソルが閉じられ、データベースが共有モードでオープンされたとしても関係ありません。この問題はSQLiteの開発者にも知られている。

私の意見では、MS AccessはSQLをサポートしたファイルデータベースの中では最高である。スモールソフトの人たちをどんなに叱ろうとも、私はSQLiteからMS Accessに乗り換えたが、まったく後悔していない。Win98でもOleDBドライバJet 4.0がインストールされているので、プロジェクトはすべてのOC Windowsで動作する。

 
素晴らしいアイデアと記事だ。しかし、mql5のネイティブ・サポートがあれば、マーケット社の製品で 使えるようになる。
 

まず最初に、あなたの仕事に感謝します!

mql4に移植して成功しました!(いくつかの#property strictでコンパイルエラーが解消されました)。

32bitプラットフォームを使っているので、64bit関連のimport関数をコメントアウトして削除する必要がありました。terminalはearly bindingを使っているので、64bit-dllも プログラムのロード中にロード しようとする 。(使用されていないのは32bit.dllだけですが)。これはエラーになった。

でもとにかく、あなたの実装は気に入っています!(私もあなたのような良いプログを書きたいものです。)

 
MetaTrader 5の64ビット版を使用していますが、コードを動作させることができません。32ビットコードへの参照を削除して みましたが、"Sqlite3_32.dll" cannot load.というエラーが表示されます。コードはこのdllをどこかで参照していますか?64ビットで動作させる必要があります。
 

スクリプトが動作していない、箱から出しても動作しない、そのようなプロジェクトを ゴミ箱に。

コンソールでは、https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png。

В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png

Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png

 
delphiec:

スクリプトが機能していない、箱から出しても動かない。

何をどうすればいいのかわからなければ、マニュアルを読んでください。