Search code examples
mql4metatrader4

Why [ MetaTrader 4 ] can't write/open a file in windows 10 with the FileWrite() function?


I tried implementing the solutions from this post Cannot open file on Ubuntu

But to no avail. I keep getting a 5002 error. (failed to open file) after FileWrite()

Even when I try out the example script on https://docs.mql4.com/files/filewrite

I get the same error. I tried running MetaTrader Terminal 4 in administrator mode but to no avail either.
Does anyone know a solution to this?

 #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() );
   }

Solution

  • Alt. A)

    the algo does not check for a positive presence of an InpDirectoryName node in the filesystem.

    Alt. B)

    in case the Alt. A) passes, there ought be used a compatible delimiter in aFilePATH + aFileNAME string, i.e. == "\\", ( aFileSystemTreeBranchSEPARATOR ref.: Help for details )
    then
    a fileIO shall take place in \Terminal\Common\Files ( in case a FILE_COMMON bitmask flag was added (used) in the int open_flags parameter),
    otherwise,
    the operations will take place in a (sub)-directory of a MetaTrader Terminal 4 local folder
    == MQL4\Files ( for a live ExpertAdvisor or Custom Indicator or Script mode of operations )
    or
    == MQL4\Tester\Files ( in case of using ExpertAdvisor or Custom Indicatorinside a back-testing framework of MT4 Strategy Tester).