代码之家  ›  专栏  ›  技术社区  ›  Maurice

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

  •  1
  • Maurice  · 技术社区  · 10 年前

    我试着实现这个帖子中的解决方案 Cannot open file on Ubuntu

    但没有用。我不断得到 5002 错误之后(未能打开文件) FileWrite()

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

    我也犯了同样的错误。我试着跑步 MetaTrader终端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 回复  |  直到 9 年前
        1
  •  1
  •   user3666197    10 年前

    备选方案A)

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

    备选方案B)

    如果Alt.A)通过,则应在 aFilePATH + aFileNAME string ,即。 == "\\" , ( aFileSystemTreeBranchSEPARATOR 参考:有关详细信息的帮助)
    然后
    fileIO 应在 \Terminal\Common\Files (如果a FILE_COMMON 位掩码标志已添加(使用)到 int open_flags 参数),
    否则
    操作将在 MetaTrader终端4 本地文件夹
    == MQL4\Files (为了生存 ExpertAdvisor Custom Indicator Script 操作模式)

    == MQL4\Tester\Files (如果使用 专家顾问 自定义指示器 在后台测试框架中 MT4策略测试仪 ).