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

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

DatabaseExportは、MQL5内で操作しているSQLiteデータベース上のデータを、CSVなどのテキストファイルとして一括出力するための関数です。

実務レベルのEA(エキスパートアドバイザー)開発において、単に取引を行うだけでなく「なぜそのエントリーをしたのか」「その時のインジケーターの値はどうだったのか」といった詳細なログをデータベースに保存することは、戦略の改善に不可欠です。しかし、データベース内に溜まった膨大なデータをSQLだけで分析するのは手間がかかります。

そこでDatabaseExportを活用します。この関数を使えば、SQLクエリの結果をそのまま外部ファイルへ書き出せるため、Pythonでの機械学習による相関分析や、Excelでの高度なグラフ化が極めてスムーズになります。初心者がつまずきやすいポイントは「データベースを開いた状態でないと実行できない点」や「ファイル出力先のディレクトリ制限」ですが、これさえ理解すれば非常に強力なツールとなります。

2. 構文と戻り値

DatabaseExport関数の基本的な構文は以下の通りです。

bool DatabaseExport(
   int           database,           // データベースハンドル
   const string  table_or_sql,       // テーブル名またはSELECTクエリ
   const string  filename,           // 出力ファイル名
   int           flags,              // フラグ(ヘッダーの有無など)
   const string  separator           // 区切り文字(カンマやタブなど)
);

パラメーターの仕様

  • database: DatabaseOpen関数で取得したハンドルを指定します。
  • table_or_sql: エクスポートしたい「テーブル名」を直接書くか、特定の条件で抽出したい場合は「SELECT文」を記述します。
  • filename: 出力するファイル名です。通常、MQL5\Filesフォルダ内に作成されます。
  • flags: DATABASE_EXPORT_HEADER(1行目にカラム名を入れる)やDATABASE_EXPORT_INDEX(インデックスを含める)などを指定します。
  • separator: CSVなら ","、タブ区切りなら "\t" を指定します。

戻り値

  • 成功した場合は true、失敗した場合は false を返します。失敗の理由は GetLastError() で確認できます。

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

以下は、取引履歴を保存している「ORDERS_HISTORY」というテーブルから、特定の利益(Profit)以上のデータだけを抽出してCSVに出力する実践的なスクリプト例です。

void OnStart()
{
   string dbFileName = "MyTradingData.sqlite";
   string exportFileName = "HighProfitTrades.csv";

   // 1. データベースを開く
   int dbHandle = DatabaseOpen(dbFileName, DATABASE_OPEN_READONLY);

   if(dbHandle == INVALID_HANDLE)
   {
      Print("データベースのオープンに失敗しました。 Error:", GetLastError());
      return;
   }

   // 2. 利益が100ドル以上の取引だけを抽出するSQL文を作成
   string sqlQuery = "SELECT * FROM ORDERS_HISTORY WHERE Profit > 100";

   // 3. DatabaseExportを実行(カンマ区切り、ヘッダーあり)
   if(DatabaseExport(dbHandle, sqlQuery, exportFileName, DATABASE_EXPORT_HEADER, ","))
   {
      Print("エクスポート成功: ", exportFileName);
   }
   else
   {
      Print("エクスポート失敗。 Error:", GetLastError());
   }

   // 4. データベースを閉じる(忘れないように!)
   DatabaseClose(dbHandle);
}

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

  • ファイル出力先の制限: MQL5のセキュリティ制約により、ファイルは基本的に MQL5\Files フォルダ内(または共通データフォルダ)にしか出力できません。デスクトップなどに直接出力することはできないため注意が必要です。
  • 既存ファイルの上書き: 同名のファイルが既に存在する場合、DatabaseExportは警告なく上書きします。過去のデータを残したい場合は、ファイル名に TimeCurrent() などのタイムスタンプを付与する工夫が必要です。
  • SQL文のミス: table_or_sql 引数にSQL文を書く場合、構文が間違っていると関数は false を返します。複雑なクエリを書く前に、一度SQLite管理ツールなどで動作確認をすることをおすすめします。
  • ハンドルの閉じ忘れ: データベースを開きっぱなしにすると、他のプロセスがファイルにアクセスできなくなることがあります。処理が終わったら必ず DatabaseClose を呼び出してください。

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

どれほど高度なデータベース管理や分析を行っても、最終的な「約定スピード」が遅ければ、シストレの収益性は劇的に低下します。自宅のPCや一般的な光回線で自動売買を行う開発者が直面する最大の罠は、物理的な距離に起因する「ネットワーク遅延(レイテンシ)」です。日本の自宅から海外の証券サーバーへ注文を出す際、往復でコンマ数秒のタイムラグが発生し、その一瞬で価格が滑り(スリッページ)、バックテスト通りの利益が出ないという事態が頻発します。

プロのクオンツ環境において、EAを稼働させるのは自宅PCではなく、証券会社のサーバーと同じデータセンター内、あるいは極めて至近距離に位置する専用のVPS(仮想専用サーバー)が常識です。VPSを利用することで、ネットワーク遅延を1ミリ秒(1000分の1秒)単位まで極限まで削ぎ落とすことが可能になります。特に数ピップスを抜くスキャルピングや、ボラティリティの激しい指標発表時に稼働させる戦略では、VPSの導入は「推奨」ではなく「必須」の投資と言えるでしょう。収益を最大化したいのであれば、まずは足元のインフラ環境をプロ仕様に整えることから始めてください。

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

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

コメント

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