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

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

MQL5のSendFTPは、MT5(MetaTrader 5)の端末から事前に設定されたFTPサーバーへファイルを転送するための関数です。

実務における主な活用法は、「トレード状況の遠隔監視」です。例えば、現在の口座残高や保有ポジションの損益、またはEAが検知したシグナルをCSVやHTML形式で出力し、それをサーバーへ送信することで、外出先のスマホやブラウザから自身の運用状況をチェックできる仕組みを構築できます。

しかし、多くの開発者が最初につまずくポイントは、この関数が「MT5のオプション設定に依存している」という点です。コードを書くだけでは動かず、MT5の「ツール」→「オプション」→「FTP」タブで、ホスト名やログイン情報を正しく設定しておく必要があります。また、この関数は非同期で動作するため、送信命令を出した瞬間に完了するわけではないという実務上の特性も理解しておく必要があります。

2. 構文と戻り値

SendFTP関数の構文は以下の通りです。

bool SendFTP(
   string  filename,      // 送信するファイル名
   string  ftp_path=NULL  // FTPサーバー上のディレクトリパス
);

パラメーター

  • filename: 送信するファイルの名称です。このファイルは、MT5のデータフォルダ内にある「MQL5Files」フォルダの中に存在している必要があります。
  • ftp_path: 転送先のサーバー上のディレクトリを指定します。指定しない(NULLにする)場合は、FTP設定で指定されたルートディレクトリに保存されます。

戻り値

  • 送信リクエストがキュー(待ち行列)に追加された場合は true を返します。
  • 失敗した場合は false を返します。

※注意点として、true が返ってきたからといって「送信が完了した」わけではありません。あくまで「送信処理を受け付けた」ことを意味します。

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

以下のサンプルは、1時間ごとに現在の口座残高と有効証拠金を記述したテキストファイルを作成し、FTPサーバーへアップロードするEAの簡易的な例です。

//+------------------------------------------------------------------+
//|                                              FTP_Report_Demo.mq5 |
//+------------------------------------------------------------------+
#property strict

// タイマーイベントを利用して定期的に送信
int OnInit()
{
   EventSetTimer(3600); // 3600秒(1時間)ごとに実行
   return(INIT_SUCCEEDED);
}

void OnDeinit(const int reason)
{
   EventKillTimer();
}

void OnTimer()
{
   string fileName = "AccountStatus.txt";

   // 1. ファイルの作成とデータの書き込み
   int fileHandle = FileOpen(fileName, FILE_WRITE | FILE_TXT | FILE_ANSI);
   if(fileHandle != INVALID_HANDLE)
   {
      string content = StringFormat("Time: %s\nAccount Balance: %.2f\nEquity: %.2f", 
                                    TimeToString(TimeCurrent()), 
                                    AccountInfoDouble(ACCOUNT_BALANCE), 
                                    AccountInfoDouble(ACCOUNT_EQUITY));
      FileWriteString(fileHandle, content);
      FileClose(fileHandle);

      // 2. FTP送信の実行
      // 第2引数を省略すると、MT5設定のルートに保存される
      if(SendFTP(fileName))
      {
         Print("FTP送信リクエスト成功: ", fileName);
      }
      else
      {
         Print("FTP送信リクエスト失敗。設定を確認してください。 Error:", GetLastError());
      }
   }
   else
   {
      Print("ファイル作成失敗。 Error:", GetLastError());
   }
}

void OnTick()
{
   // 通常のトレードロジック
}

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

開発時にハマりやすいポイントを整理しました。

  1. ファイルの場所: SendFTPで送信できるのは、原則として MQL5/Files フォルダ内にあるファイルだけです。それ以外の場所(共通フォルダなど)にあるファイルを送ることはできません。
  2. MT5の設定忘れ: 最も多いミスです。MT5の「オプション」→「FTP」で「FTPによるレポートの有効化」にチェックを入れる必要はありませんが、サーバー・ログイン・パスワードの各項目は正しく入力されている必要があります。
  3. 送信頻度の制限: SendFTPを毎ティック(OnTick内)で呼び出すのは避けてください。FTP転送はネットワーク負荷が高く、短時間に大量の呼び出しを行うと、MT5の動作が重くなったり、サーバー側からスパム判定を受けて遮断されたりするリスクがあります。
  4. エラーコード4013: ERR_FTP_SEND_FAILED(4013)が返る場合、ファイアウォールが通信をブロックしているか、パッシブモードの設定不整合、あるいはサーバー情報の入力ミスが考えられます。

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

どれほど高度なEAを開発し、SendFTPで完璧な監視体制を構築したとしても、実行環境が「自宅のPC」であれば、その優位性は一瞬で崩壊します。家庭用インターネット回線は、プロバイダーの混雑やWi-Fiの干渉により、常に数百ミリ秒単位の不安定な遅延(レイテンシ)を抱えています。FX相場において、この数ミリ秒の遅れは、狙った価格での約定を逃す「スリッページ」を誘発し、バックテストでは勝てていたロジックを致命的な損失へと変えてしまいます。

プロレベルの自動売買を行うエンジニアにとって、取引サーバーの物理的距離が近いデータセンター内に設置された「専用VPS(仮想専用サーバー)」の導入は、もはやオプションではなく必須条件です。 24時間365日の安定稼働はもちろん、極限まで短縮されたネットワーク遅延こそが、スリッページを最小化し、あなたのアルゴリズムが持つ本来のパフォーマンスを最大限に引き出す唯一の手段となります。

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

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

コメント

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