3

Ubuntu 14 を使用していて、ファイルを書き込むスクリプトを作成しようとしていますが5004、ファイルを開こうとするたびにエラーが発生します。

datetime currtime;
bool     newcandle;

string   terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
string   filename           = terminal_data_path + "\\MQL4\\Files\\" + "data.csv";

int      filehandle;

filehandle = FileOpen( filename, FILE_WRITE | FILE_CSV );

if (  filehandle < 0 ){    
      Print( "Failed to open the file by the absolute path " );
      Print( "Error code ", GetLastError() );
    }
else {
      Print( "file opened with sucess" );
    } 

Ubuntuでこの問題を解決するにはどうすればよいですか?

アップデート

ファイルを次のように変更しようとしました。

string terminal_data_path = TerminalInfoString( TERMINAL_DATA_PATH );
string filename           = terminal_data_path + "\\tester\\files\\data.csv";

そしてこのためだけに

string filename = "\\tester\\files\\data.csv";

そしてこのために

string filename = "\\files\\data.csv";

しかし、まだエラーが発生していますが、今回はそうではあり5002ません5004

4

1 に答える 1

2

設計上の MQL4 パーミッションは FileIO を許可/制限しない

作業ファイルを配置できる3 つのディレクトリ (サブディレクトリを含む) があります。

/HISTORY/<current broker>- 特にFileOpenHistory()機能のために;

/EXPERTS/FILES- 一般的なケース;

/TESTER/FILES- 特にテスト用 (ストラテジーテスター操作中の参照)。

他のディレクトリのファイルを操作することは禁止されています。

解決

この事実を満たし、ビルド 762 の前とビルド 762 後の違い (「新しい」MQL4 ファイルのローカライゼーション) を尊重するように MQL4 コードを調整します。

アップデート

投稿されたように、MQL4 コード (更新された状態を共有するかどうかに関係なく) は、例外をより適切に処理する必要があります。ファイル名を持ついくつかの驚くべきアーティファクトに遭遇しました。一部のプラットフォーム固有で、wXP では害はありませんが、VPS でホストされた wServer2008 VM または LinuxVM でカプセル化された Wine/MT4 インスタンスでは動作しません (同じコード)。

MQL4 ヘルプ ドキュメントを注意深く読み、さらに一歩進めるためのいくつかの事後分析ツールを作成します。

5002
 ERR_FILE_WRONG_FILENAME
 Wrong file name               -------> pre-test + "fuse" the corner cases

5003
 ERR_FILE_TOO_LONG_FILENAME
 Too long file name

5004                           <------ a good sign, we are on the safer side here
 ERR_FILE_CANNOT_OPEN
 Cannot open file

//-------------------------------------------------------------
//   MT4_GUI_postMortem
//-------------------------------------------------------------    
void MT4_GUI_postMortem( string aFileNAME = "caller forgot to pass aFileNAME"
                         ){
  // SYNTAX
  //         if ( aFileHANDLE == INVALID_HANDLE ) MT4_GUI_postMortem( filename );
  //
     int aLastErrorNUM = GetLastError();
     Comment( "POST-MORTEM >>> [", aFileNAME, "] Threw error ", aLastErrorNUM );
     Print(   "POST-MORTEM >>> [", aFileNAME, "] Threw error ", aLastErrorNUM );

     return;
    }   
于 2015-01-03T08:01:56.590 に答える