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

可以放置工作文件的三个目录(带有子目录) :

/HISTORY/<current broker>- 特别是对于FileOpenHistory()功能;

/EXPERTS/FILES- 常见情况;

/TESTER/FILES- 特别是用于测试(参考在 Strategy Tester 操作期间)。

禁止使用其他目录中的文件。

解决方案

调整您的 MQL4 代码以满足这一事实并尊重构建前 762 和构建后 762 的差异(“新”-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 回答