【MQL5】DatabaseOpen関数の使い方と自動売買実装コード

1. DatabaseOpen関数の概要と実務での活用法

MQL5のDatabaseOpen関数は、MT5(MetaTrader 5)内部でSQLiteデータベースを作成、または開くための関数です。

従来、MQL5でデータを保存する場合、CSVファイルやバイナリファイル(FileWriteなど)を利用するのが一般的でした。しかし、数千件〜数万件のバックテスト結果や、複雑な取引履歴、あるいは機械学習用の特徴量を管理する場合、ファイル操作では「検索や集計が極めて非効率」という課題がありました。

実務レベルのEA開発において、DatabaseOpenを活用するメリットは以下の通りです。
高速なデータ抽出: SQL(構造化問い合わせ言語)を使って、特定の条件に合致するデータだけを瞬時に取り出せる。
データの一貫性: 複数のEAから同じデータベースを参照し、取引状況を共有できる(共通フォルダ利用時)。
高度な分析: 取引履歴をデータベース化することで、ドローダウン分析や期待値計算をMT5上で完結できる。

初心者の方は「難しそう」と感じるかもしれませんが、基本的には「Excelのような表形式のファイルを、より堅牢に扱うための入り口」だと考えればOKです。

2. 構文と戻り値

DatabaseOpen関数の基本的な書き方は以下の通りです。

int  DatabaseOpen(
   string  filename,     // データベースファイル名
   uint    flags         // オープンモード(フラグ)
   );

パラメーターの解説

  1. filename:
    作成・オープンするファイル名です。デフォルトでは MQL5/Files フォルダ内に保存されます。
  2. flags:
    どのようにファイルを開くかを指定します。
  3. DATABASE_OPEN_READWRITE: 読み書き両方で開く。
  4. DATABASE_OPEN_CREATE: ファイルが存在しない場合に新規作成する。
  5. DATABASE_OPEN_COMMON: 全てのMT5端末で共有される「共通フォルダ」に作成する。

戻り値

  • 成功した場合:データベースハンドル(0以上の整数値)を返します。
  • 失敗した場合:INVALID_HANDLE を返します。

※失敗した理由は、GetLastError() 関数で詳細を確認できます。

3. 具体的な使い方・実践サンプルコード

以下のコードは、EAの初期化時にデータベースを作成し、取引データを記録するためのテーブルを準備する最小限のテンプレートです。

//+------------------------------------------------------------------+
//| データベース操作のサンプルEA                                         |
//+------------------------------------------------------------------+
#property strict

int db_handle = INVALID_HANDLE; // データベースハンドルを保持する変数

int OnInit()
{
   // 1. データベースを開く(存在しない場合は作成する)
   // MQL5/Files/MyTradeData.sqlite というファイルが作成される
   db_handle = DatabaseOpen("MyTradeData.sqlite", DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE);

   if(db_handle == INVALID_HANDLE)
   {
      Print("データベースのオープンに失敗しました。エラーコード: ", GetLastError());
      return(INIT_FAILED);
   }

   Print("データベースを正常にオープンしました。ハンドル: ", db_handle);

   // 2. テーブル(表)を作成するSQLの実行
   // 取引時刻、通貨ペア、利益を保存する単純なテーブル
   string sql = "CREATE TABLE IF NOT EXISTS TRADE_LOG ("
                "ID INTEGER PRIMARY KEY AUTOINCREMENT,"
                "TIME TEXT,"
                "SYMBOL TEXT,"
                "PROFIT REAL"
                ");";

   if(!DatabaseExecute(db_handle, sql))
   {
      Print("テーブル作成に失敗しました。エラーコード: ", GetLastError());
      DatabaseClose(db_handle);
      return(INIT_FAILED);
   }

   Print("テーブルの準備が完了しました。");
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   // 3. 使い終わったら必ずハンドルを閉じる
   if(db_handle != INVALID_HANDLE)
   {
      DatabaseClose(db_handle);
      Print("データベースを閉じました。");
   }
}

void OnTick()
{
   // ここに取引処理やデータ挿入のロジックを記述
}

4. 使用上の注意点とよくあるエラー

開発時にハマりやすいポイントをいくつか挙げます。

  1. DatabaseCloseの忘れ:
    DatabaseOpenで開いたハンドルは、必ずDatabaseCloseで閉じる必要があります。閉じ忘れるとファイルがロックされ、次に開こうとしたときにエラーが発生したり、メモリリークの原因になります。
  2. ファイルパスの制限:
    MT5のサンドボックス規制により、基本的には MQL5/Files フォルダ配下しか触れません。外部のフォルダを指定することはできないため注意してください。
  3. フラグの組み合わせ:
    読み書きを行いたい場合は、必ず DATABASE_OPEN_READWRITEDATABASE_OPEN_CREATE を論理和(|)で組み合わせて使用しましょう。
  4. SQL文の構文エラー:
    DatabaseExecuteなどでSQLを実行する際、カンマの付け忘れや綴りミスがあると沈黙して失敗します。エラーが出た際は必ず GetLastError() を確認する癖をつけましょう。

5. 【重要】自動売買における約定スピードと環境の罠

データベースを駆使して高度なアルゴリズムを構築しても、それを実行する「環境」が貧弱であれば、すべての努力は水の泡となります。特に、自宅のPCでMT5を稼働させている開発者が直視すべきなのが、ネットワーク遅延(レイテンシ)という物理的な壁です。

FXの自動売買において、100ミリ秒(0.1秒)の遅延は致命的です。自宅のインターネット回線は、パケットの損失やルーティングの不安定さ、さらにプロバイダー側の混雑の影響を強く受けます。あなたがEAを通じて「今だ!」と注文を出した瞬間、価格はすでに滑り、本来得られたはずの利益がスリッページによって削り取られます。これを回避し、極限まで約定スピードを高めるには、証券会社のサーバーに近いデータセンターに設置された専用のVPS(仮想専用サーバー)の利用が不可欠です。24時間安定した稼働と低遅延なネットワーク環境を確保することこそが、クオンツエンジニアとしての最初の「勝つための投資」となります。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました