2011/03/14

MT4からDATABASEを利用する。 ■■■

MT4に外部データを渡す場合は、一般的にテキストファイル(CSVファイル)が使用されますが、今回はデータベースを使用する方法を調べてみました。

【データーベースの選択】

サーバーを使用しないこと、コンパクトで高速処理が可能であるこ、MT4用のラッパを公開されている方がいらっしゃったことから、【SQLite3】を使用することにしました。

【環境整備】

①SQLite3の取得 サイト:http://www.sqlite.org/
main
down
【Download】→(Precompiled Binaries For Windows)-(This ZIP archive contains a DLL for the SQLite library)をダウンロードし、解凍後≪sqlite3.dll≫をMT4のlibrariesファイル内に保存。
②MT4用ラッパの取得 サイト:http://www.shmuma.ru/
mainwrapper
wrapper
【SQLite library for MetaTrader4】→(Download)-≪sqlite3_wrapper.dll≫をダウンロードしMT4のlibrariesファイル内に保存。sqlite.mqhをコピペしてヘッダーファイルを作成。
③SQLiteの管理ソフトの取得
今回は、PupSQLを使用させてもらいました。

【sqlite3_wrapper.dllの公開関数の説明】

int sqlite_exec (string db_fname, string sql);
db_fname: pathを含むデータベース名(pathは、絶対パス若しくは相対パス)
sql    : クエリ
  ※作成、更新、削除などの戻りデータのないクリエを発行する。

int sqlite_table_exists (string db_fname, string table);
  db_fname: pathを含むデータベース名(pathは、絶対パス若しくは相対パス)
  table      : テーブル名
  ※データベースを開き、テーブルを指定する。(1:あり 0:なし)

int sqlite_query (string db_fname, string sql, int& cols[]);
  db_fname: pathを含むデータベース名(pathは、絶対パス若しくは相対パス)
  sql         : クエリ
  cols[ ]      : int cols[1];と設定。列数の合計を受け取る。
  ※戻りデータのあるクリエを発行し、ハンドルを返す。
  ※反復処理は、(sqlite_next,sqlite_get_col)を使用。
  ※(sqlite_free_query)を使用しクリエの解放をおこなう。

int sqlite_next_row (int handle);
  ※次の行を取得する 。(1:あり 0:なし)

string sqlite_get_col (int handle, int col);
  col       : テーブルの列番号(0,1,2,3,……)
  ※列の値を取得する。

int sqlite_free_query (int handle);
  ※クリエの解放。

【テスト】

さて環境が整いましたのでテストしてみたいと思います。
どうせならということで前々回スクレイピングした内容をデータベース化し、国名とランクを条件に抽出するスクリプトを作成してみました。
PupSQLにてデータベース化したものを添付しておきます。
ダウンロード: EventDate.db
base
ダウンロード後解凍しMT4のfilesフォルダに保存。
作成したスクリプトをダウンロードしスクリプトフォルダに保存。
ダウンロード: EventHist.mq4

稼働させた結果は以下の通りです。
kekka
【SQLite3】は、文字コードが、UTF-8となっているため読み込んだ日本語が文字化けしました。
文字化け対策は後日としたいと思います。

【sqlite3_wrapper.dllのコンパイルに挑戦記録】

いろいろ苦戦したので、自分の記録に・・・
使用したIDEは、Dev-C++(v4.9.9.2)です。
sqlite_wrapper.cをGet
② 【SQLite Download Page】-(SorceCode)-(sqlite-amalgamation)をGet
解凍後≪sqlite3.h≫を抜き取り上記と結合
③ ≪sqlite-dll-win32-x86-××××.zip≫より≪sqlite3.def≫を取得しDev-C++のパス内に置き
コマンドプロンプトにて[\Dev-Cpp\bin]以下コードでライブラリファイルを作成-詳しくはココ
【dlltool –dllname “sqlite3.dll” –input-df “sqlite3.def” –output-lib libsqlite3.a】
④sqlite_wrapper.cの変更
1: 《extern”C”{ }》にて関数群を囲む。詳しくはココ
  2: コンパイルエラーとなるため、build_db_fname関数内【res = (char*)malloc (s);】と変更。
3: コンパイルエラーとなるため、sqlite_get_col関数の型を【unsigned char】に変更。
4: 公開する関数の型に【__declspec(dllexport)】を追加
⑤【コンパイラオプション】→リンカーのコマンドに【libsqlite3.a -k】と記入しコンパイル。
※正しいがどうかは不明だがこの方法でコンパイルが完了し作動も確認できた。

【最後に・・】

おもしろき こともなき世を おもしろく すみなしものは 心なりけり  by 高杉晋作

0 件のコメント :