【MQL悪用厳禁】FileMove()でファイル名変更・拡張子変更・MoveFileWの使い方・kernel32.dll

MQLのファイル操作であるFileMoveについてリファレンスがわかりずらかったので個人的な解説をしてみたいと思います('ω')(覚書ってやつ?)

 まず最初にファイル関数でよく使う機能をまとめます。
 次に、MQLのファイル関数はMQL配下のフォルダ(サンドボックス)しか操作できないので、その問題をDLLを使って解決します。

■FileOpen()

 ファイルを新規作成、開く。パイプ「|」を使ってフラグってやつを複数設定可能。今回は→書き込みします|テキストです|ANSI形式です。戻り値はハンドル(ウィンドウズが認識するファイル名みたいなもの)

作成される場所(サブフォルダのパス)は
 ①ターミナルデータパス(通常) 「データフォルダを開く」→「MQL5」→「Files」 ChartScreenShot()関数で保存した画像もここ
 ②コモンパス(共通) 「データフォルダを開く」→「上へ」→「Common」→「Files」
 ③テスターエージェントパス(テスター時) 「データフォルダを開く」→「上へ」→「上へ」→「Tester」→「9F77〇〇C8C〇F3」→「Agent-000.0.0.0-3000」→「MQL5」→「Files」

■FileWrite()

 FileOpenで作成したハンドル(ファイル)に文字を記入する。
 CSVの場合はカンマ区切りとFileWriteを何回も使って次の行へ。

■FileClose()

 FileOpenで作成したファイルを閉じる。

void OnStart()
  {
   int handle = FileOpen("test.txt", FILE_WRITE | FILE_TXT | FILE_ANSI);
   FileWrite(handle, "fairu no test desu");
   FileClose(handle);
  }

■FileMove()

①この後ファイル名を変更してみる
 テキストファイルからCSVファイルに変更は無事に成功。
 いろいろなファイルを作成したりはできますがバッチファイルは作成できませんでした。→後ほど解決します
②MT5配下の場所へ移動
FileMove("test.txt",0,"C:\\Users\\owner\\Desktop\\test.txt",FILE_REWRITE);
もちろんできません。移動はサブフォルダのみです。→後ほど解決します

void OnStart()
  {
   int handle = FileOpen("test.txt", FILE_WRITE | FILE_TXT | FILE_ANSI);
   FileWrite(handle, "fairu no test desu");
   FileClose(handle);
   FileMove("test.txt",0,"test.csv",FILE_REWRITE);
  }
FileMoveで拡張子変更


おさらいはここまで。
FileMoveの問題点を解決して、
どんなファイル名にも、
どんな場所にも移動する方法を
伝授します('ω')


■MoveFileW()

この関数はMQLリファレンスにはありませんので、まずは使えるようにします。実はMQLはこの関数を使用することを想定しており標準でインストールされている次のインクルードファイルを読み込むだけで簡単に使えるようになっています。

#include <WinAPI\winapi.mqh>

これで、ウィンドウズのDLLであるkernel32.dllのMoveFileW()が使えるようになりFileMove()の限界突破ができます。

■サンプルコード&ファイル

FileOpenで作成したテキストファイルをバッチファイルとして名称変更しながらデスクトップに移動させてみました。

 #include  <WinAPI\winapi.mqh>
void OnStart()
  {
   int handle = FileOpen("test.txt", FILE_WRITE | FILE_TXT | FILE_ANSI);
   FileWrite(handle, "fairu no test desu");
   FileClose(handle);
   string path1 = TerminalInfoString(TERMINAL_DATA_PATH) + "\\MQL5\\Files\\test.txt";
   string path2 = "C:\\Users\\owner\\Desktop\\test.bat";
   MoveFileW(path1, path2);
  }

■まとめ

 使用用途としてはコモンフォルダに保存したデータをバックアップ用のフォルダに移動するようにしたり。あくまでデータ取りやトレードのためです。
 今回紹介した記事は、MQLは一応の制限はありつつDLLを読み込んでいろんなことができると言う事の裏付けにもなっていますので悪いことを考えないようにしてください!

 今後の活力になりますのでいいね、フォローよろしくおねがいします('ω')

【参考ページ】


この記事が気に入ったらサポートをしてみませんか?