为什么[MetaTrader 4]无法使用FileWrite()函数在Windows 10中写入/打开文件?

时间:2016-06-19 17:19:05

标签: mql4 metatrader4

我尝试从这篇文章中实现解决方案 Cannot open file on Ubuntu

但无济于事。我一直收到 5002 错误。 ( FileWrite()

之后(无法打开文件)

即使我在https://docs.mql4.com/files/filewrite

上试用了示例脚本

我得到了同样的错误。我尝试在管理员模式下运行 MetaTrader Terminal 4 ,但也无济于事。
有没有人知道这方面的解决方案?

 #property version   "1.00"
 #property strict

 //--- show the window of input parameters when launching the script
 #property script_show_inputs

 //--- parameters for receiving data from the terminal
 input string             InpSymbolName    = "EURUSD";    // Сurrency pair
 input ENUM_TIMEFRAMES    InpSymbolPeriod  = PERIOD_H1;   // Time frame
 input int                InpFastEMAPeriod = 12;          // Fast EMA period
 input int                InpSlowEMAPeriod = 26;          // Slow EMA period
 input int                InpSignalPeriod  =  9;          // Difference averaging period
 input ENUM_APPLIED_PRICE InpAppliedPrice  = PRICE_CLOSE; // Price type

 //--- parameters for writing data to file
 input string             InpFileName      = "MACD.csv";  // File name
 input string             InpDirectoryName = "Data";      // Folder name
 //+------------------------------------------------------------------+
 //| Script program start function                                    |
 //+------------------------------------------------------------------+

 void OnStart()
 {
    bool     sign_buff[];                                 // signal array (true - buy, false - sell)
    datetime time_buff[];                                 // array of signals' appear time
    int      sign_size=0;                                 // signal array size
    double   macd_buff[];                                 // array of indicator values
    datetime date_buff[];                                 // array of indicator dates
    int      macd_size=0;                                 // size of indicator arrays

 //--- set indexing as time series
    ArraySetAsSeries( sign_buff, true );
    ArraySetAsSeries( time_buff, true );
    ArraySetAsSeries( macd_buff, true );
    ArraySetAsSeries( date_buff, true );

 //--- reset last error code
    ResetLastError();

 //--- copying the time from last 1000 bars
    int  copied = CopyTime( NULL, 0, 0, 1000, date_buff );
    if ( copied <= 0 )
    {    PrintFormat( "Failed to copy time values. Error code = %d", GetLastError() );`
         return;
      }

 //--- prepare macd_buff array
    ArrayResize( macd_buff, copied );

 //--- copy the values of main line of the iMACD indicator
    for ( int i = 0; i< copied; i++ )
    {     macd_buff[i] = iMACD( InpSymbolName, InpSymbolPeriod, InpFastEMAPeriod, InpSlowEMAPeriod, InpSignalPeriod, InpAppliedPrice, MODE_MAIN, i );
      }

 //--- get size
    macd_size = ArraySize( macd_buff );

 //--- analyze the data and save the indicator signals to the arrays
    ArrayResize( sign_buff, macd_size - 1 );
    ArrayResize( time_buff, macd_size - 1 );
    for ( int i = 1; i < macd_size; i++ )
    {   
        //--- buy signal
          if (  macd_buff[i-1] <  0
             && macd_buff[i]   >= 0 )
          {     
                sign_buff[sign_size] = true;
                time_buff[sign_size] = date_buff[i];
                sign_size++;
            }
        //--- sell signal
        if (  macd_buff[i-1] >  0
           && macd_buff[i]   <= 0 )
        {  
              sign_buff[sign_size] = false;
              time_buff[sign_size] = date_buff[i];
              sign_size++;
           }
      }

 //--- open the file for writing the indicator values (if the file is absent, it will be created automatically)
    ResetLastError();
    int file_handle = FileOpen( InpDirectoryName                    // aDirNAME
                              + "//"                                // aFileSystemTreeBranchSEPARATOR
                              + InpFileName,                        // aFileNAME
                                FILE_READ|FILE_WRITE|FILE_CSV       // fileIoMODE_FLAGs
                                );
    if (  file_handle != INVALID_HANDLE )
    {     
          PrintFormat( "%s file is available for writing", InpFileName );
          PrintFormat( "File path: %s\\Files\\",           TerminalInfoString( TERMINAL_DATA_PATH ) );

       //--- first, write the number of signals
          FileWrite( file_handle, sign_size );

       //--- write the time and values of signals to the file
          for ( int i = 0; i <  sign_size; i++ )
                FileWrite( file_handle, time_buff[i], sign_buff[i] );

       //--- close the file
          FileClose( file_handle );
          PrintFormat( "Data is written, %s file is closed", InpFileName );
      }
    else
          PrintFormat( "Failed to open %s file, Error code = %d", InpFileName, GetLastError() );
   }

1 个答案:

答案 0 :(得分:1)

替代。 A)

算法不会检查文件系统中是否存在 InpDirectoryName 节点。

替代。 B)

如果是Alt。 A)通过,aFilePATH + aFileNAME string中应使用兼容的分隔符,即 == "\\" ,( aFileSystemTreeBranchSEPARATOR 参考:帮助细节)
然后在fileIO\Terminal\Common\Files进行FILE_COMMON(如果 {{添加(使用) int open_flags 位掩码标记1}} 参数),
否则,操作将发生在 MetaTrader Terminal 4 本地文件夹的(子)目录中 == MQL4\Files (对于实时 ExpertAdvisor Custom Indicator {{ 1}} 操作模式)
Script (如果使用 == MQL4\Tester\Files < / kbd>或 ExpertAdvisor MT4策略测试程序 的反向测试框架内。