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 高杉晋作

2011/02/17

運否天賦

今週末に友人と韓国旅行に行くことになり、一度行ってみたかった『カジノ』に行くつもりです。
そこで今回は、還元率について考えてみました。
還元率とは、ある賭けに対していくら払い戻しされるかの割合だそうです。
参考:控除率-Wikipedia

ちなみに各ギャンブルの還元率は!
①宝くじ(日本の自治体が運営するもの) 45%
②スポーツ振興くじ(TOTO) 50%
③日本の公営競技 75%~80%
④パチンコ 85%~90%
⑤ルーレット(アメリカンスタイル) 95%
⑥ルーレット(ヨーロピアンスタイル) 97.3%
⑦バカラ 96%~99%
などとなるようです。
ある条件を満たした場合、その還元率が大きく改善されたり100%を超える状態となるものもあるようで・・・
【チャリロトで十分な繰り越し払い戻し金がある場合】
※同時当選を考慮した十分な繰り越し払い戻し金が必要ですが・・・
《1等賞金12億円》 ÷ 《9の7乗通り》 = 約250円
購入金額が、200円なので、還元率が(約250/200)約125%となります。
※しかし、上記は、税金を考慮していませんので、実際は約25%の税金(所得税+住民税)が掛かり・・
(12億円×0.75) ÷ (9の7乗通り) = 約188円
実質還元率は、(約188/200) 約94% となります。
参考:チャリLOTO
【ビデオポーカーにて最適な方法でゲームを行ったとき】
《ビデオポーカー 控除率》などで検索してみてください。
【ブラック・ジャックにて最適な方法でゲームを行ったとき】
《ブラックジャック 控除率》などで検索してみてください。

さて、FXをゼロサムゲームと考えてみると
還元率 = 売値/(買値+手数料) となり
【USDJPY 100円/ドル スプレッド0.03 手数料なし】で考えた場合
還元率 = (100-0.03)/(100+0) =約99.97%となります。
上記の各還元率と比べてみるとかなり良心的なように見えますが・・・
これはレバ1の場合でレバを加味すると
還元率 = 売値(証拠金分)/(買値(証拠金分)+手数料)となり
【USDJPY100円/ドル スプレット0.03 手数料なし レバ100】で考えた場合
還元率 = (100/100 -0.03)/(100/100 +0) = 97%となります。
下記のグラフは、縦軸が、還元率 横軸がレバレッジで各線がスプレッドを示しています。
gf
【まとめ】
還元率から見てもレバレッジが、諸刃の剣であることがわかりスプレット及び手数料の重要性がわかります。