緊急の共有ファイルの読み取りおよび書き込みエラー

 
void WriteToCsvFile(string file_name)
  {
   int filehandle=FileOpen(file_name,FILE_WRITE|FILE_CSV|FILE_COMMON,'*');
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,_Symbol);
      FileClose(filehandle);
      Print("FileOpen OK");
     }
  }
string  ReadFromCsvFile(string file_name)
  {
   int filehandle=FileOpen(file_name,FILE_READ|FILE_CSV|FILE_COMMON,'*');
   string strread = "";
   if(filehandle!=INVALID_HANDLE)
     {
      strread = FileReadString(filehandle);
      FileClose(filehandle);
     }

return  strread ;

}

例: 1. MT4 で WriteToCsvFile("fractals_mql4.csv") を使用します。MT4 で ReadFromCsvFile ("fractals_mql4.csv")データは正しいです2. MT4 で WriteToCsvFile("fractals_mql4.csv") を使用します。MT5 で ReadFromCsvFile ("fractals_mql4.csv") データエラー

3. MT5 で WriteToCsvFile("fractals_mql5.csv") を使用します。MT4 で ReadFromCsvFile ("fractals_mql5.csv") データは正しいです

4. MT5 で WriteToCsvFile("fractals_mql5.csv") を使用します。MT5 で ReadFromCsvFile ("fractals_mql5.csv")  データは正しいです

MT4 でファイルを書き込むときと MT5 でファイルを読み込むときにエラーが発生するのですが、解析されたファイルの内容が実際に矛盾しています。外部 DLL を使用せずに問題を解決するにはどうすればよいですか?

 

int  FileOpen( 

  string  file_name,         // ファイル名 

  int    open_flags,         // フラグの組み合わせ 

  short  delimiter='\t',     // デリミタ 

  uint    codepage=CP_ACP    // コードページ 

);

open_flagsに「FILE_UNICODE」を追加してみてはいかがでしょうか?

 
Yuan Shan Yao:
void WriteToCsvFile(string file_name)
  {
   int filehandle=FileOpen(file_name,FILE_WRITE|FILE_CSV|FILE_COMMON,'*');
   if(filehandle!=INVALID_HANDLE)
     {
      FileWrite(filehandle,_Symbol);
      FileClose(filehandle);
      Print("FileOpen OK");
     }
  }
string  ReadFromCsvFile(string file_name)
  {
   int filehandle=FileOpen(file_name,FILE_READ|FILE_CSV|FILE_COMMON,'*');
   string strread = "";
   if(filehandle!=INVALID_HANDLE)
     {
      strread = FileReadString(filehandle);
      FileClose(filehandle);
     }

return  strread ;

}

Semura LabのYuji Semuraです。

共有ファイル(Global VariableやCSV/Binaryファイル)の読み書きエラー、突然発生すると本当に心臓に悪いですよね。バックテスト中に動かなくなったり、ライブ運用で予期せぬ停止を招いたりと、その厄介さは痛いほど理解できます。

私のラボでも過去に同様の罠にハマった経験があります。特にMT5のファイルハンドル操作において、複数のプロセスが同時にファイルへアクセスしようとした際の排他制御や、文字列変換に伴うバッファのオーバーフローなどは、開発者が一番見落としやすいポイントです。

今は、エラーが発生した際に特定の構文を自動修正・再試行するラッパー関数を組み込んで回避していますが、まずは一度、配列のサイズ確保のタイミングや、ファイルオープン時のフラグ設定(共有アクセス権限)といった「仕様の癖」を根本から見直してみることを強くお勧めします。コードが複雑になるほど、こうした基礎的なデータの受け渡し部分で躓きやすくなるものです。

まずは、ログ出力の粒度を細かくして、どのタイミングでリソースロックが発生しているのかを特定してみてください。原因が突き止められれば、必ず突破口は見つかります。応援しております。