Help needed , how to import a cvs file data as an indicator

 

Hi,

I got a csv file with a list of data: Datetime, and values.

These are the values of an indicator at certain moments, calculated in excel/mathlab.
How can I import these data to appear on my screen (either oin the main window or separate one) ?

Thnx in advance for you help !
Twoci
 
twoci:

Hi,

I got a csv file with a list of data: Datetime, and values.

These are the values of an indicator at certain moments, calculated in excel/mathlab.
How can I import these data to appear on my screen (either oin the main window or separate one) ?

Thnx in advance for you help !
Twoci

Create CI, use file functions  https://www.mql5.com/en/docs/files. You may want to experiment with  https://www.mql5.com/en/docs/files/filereadarray

However this is not fun, much more easy in MT4, coz it has offline chart, filereadarray can read any string. 

Documentation on MQL5: File Functions
  • www.mql5.com
File Functions - Documentation on MQL5
 

Hello,

Please try this:

//+------------------------------------------------------------------+
//|                                                   csvdisplay.mq5 |
//|                                                           meisme |
//+------------------------------------------------------------------+
#property copyright "meisme"
#property version   "1.00"

class CCsvDisplay {
   public:
   //Constructor, pass the filename here
   CCsvDisplay(string strFilename) {
      m_strFilename = strFilename;
   }
   ~CCsvDisplay(){/*Destructor*/};
   //Read the csv file
   void ReadDisplayFile() {
      if (FileIsExist(m_strFilename) == true) {
         int iFile = FileOpen(m_strFilename, FILE_TXT | FILE_READ | FILE_SHARE_READ | FILE_ANSI);
         //Is file open succeed?
         if (iFile != -1) {
         //Succeed
            Print("Open file ", m_strFilename);
            string strFormatDisplayString;
            //Parse and display file content until file reach the end
            while (FileIsEnding(iFile) == false) {
               //Read file line per line
               string strContentLine = FileReadString(iFile);
               string strParsedColumn[];
               //Parse string column by column (based on separator)
               int iContentCount = StringSplit(strContentLine, StringGetCharacter(",",0), strParsedColumn);
               if (iContentCount > 0) {
                  for (int i = 0; i < iContentCount; i++) {
                     strFormatDisplayString += strParsedColumn[i];
                     if (i != (iContentCount - 1)) strFormatDisplayString += " -> ";
                  }
                  //Add return and new line for display
                  strFormatDisplayString += "\n";
               }
            } 
            //Close file after read
            FileClose(iFile);
            //Plot string as comment on chart
            Comment(strFormatDisplayString);
         }
         else {
         //Failed
            Comment("Cannot open ", m_strFilename, " !");
         }
      }
      else {
      //File doesn't exist?
         Comment("File ", m_strFilename, " doesn't exist!");
      }
   }
   
   private:
      string m_strFilename;
};

//============

CCsvDisplay *m_pcCsvDisp;
int OnInit()
  {
   m_pcCsvDisp = new CCsvDisplay("myFile.csv");
   m_pcCsvDisp.ReadDisplayFile();
   
   Print("Load Csv display");
   return(0);
  }
  
  void OnDeinit(const int r)
  {
   if (m_pcCsvDisp != NULL) delete m_pcCsvDisp;
  }

The csv file have to be placed inside folder: C:\Program Files\MetaTrader 5\MQL5\Files

with name: myFile.csv

Good luck!


Edit: Add file close code

 
meisme:

Hello,

Please try this:

The csv file have to be placed inside folder: C:\Program Files\MetaTrader 5\MQL5\Files

with name: myFile.csv

Good luck!

Hi meisme,

Thanks for the code. However if I may ...

The flag in file open should be FILE_CSV not FILE_TXT. That's OK though, I made the same mistake lately, but the file still can be opened and read.

And there's no need for StringSplit(), because FileReadString(), will read CSV file before delimiter, and we also can directly pass the value of CSV columns into an array of double type by directly convert the string into double (and datetime) by using FileReadNumber(). So, FileReadString() is not even needed.

Here's my CSV file reading which anyone can modify  https://www.mql5.com/en/forum/6909#comment_209726. There, the CSV data is passed to string array but not using StringSplit() (and not converted into Double or Integer).

However the real thing that need attention is, the number of read data should not exceed the number of Bars on chart :(.

:D 

 

 

Hi onewithzachy,

Thanks to pointed that up.  You are right, using FILE_CSV may made the code much shorter.

I wrote above code with mindset that OP could possibly extend the csv content for more than 2 columns, with unknown data type.  So imo string is the best option as the purpose is only for display.

It's quite good link you have, also i am quite agree people here are too serious :)

Edit: Forget to tell that at above code, it's better to close the file after the file content already read.  I missed that part. I am going to fix it


Regards,

 
meisme:

Hi onewithzachy,

Thanks to pointed that up.  You are right, using FILE_CSV may made the code much shorter.

I wrote above code with mindset that OP could possibly extend the csv content for more than 2 columns, with unknown data type.  So imo string is the best option as the purpose is only for display.

It's quite good link you have, also i am quite agree people here are too serious :)

Edit: Forget to tell that at above code, it's better to close the file after the file content already read.  I missed that part. I am going to fix it


Regards,

Dear onewithzachy, Dear meisme,


Thank your for your replies

Regards

 
onewithzachy:

Hi meisme,

Thanks for the code. However if I may ...

The flag in file open should be FILE_CSV not FILE_TXT. That's OK though, I made the same mistake lately, but the file still can be opened and read.

And there's no need for StringSplit(), because FileReadString(), will read CSV file before delimiter, and we also can directly pass the value of CSV columns into an array of double type by directly convert the string into double (and datetime) by using FileReadNumber(). So, FileReadString() is not even needed.

Here's my CSV file reading which anyone can modify  https://www.mql5.com/en/forum/6909#comment_209726. There, the CSV data is passed to string array but not using StringSplit() (and not converted into Double or Integer).

However the real thing that need attention is, the number of read data should not exceed the number of Bars on chart :(.

:D 

 

 hi ....if i have one only integer in the CSV file  how to use integer to draw an OBJ_HLINE using    ObjectCreate ...how to connect between the tow functions?
 

this is nice code..

but i would need this data in .csv be presented in indicator window as a line. (as lets say RSI), can somebody help me please?

 

Hi, i see is rather old the topic, but im tryng to make an indicator that simply show under the chart the interest rate or the inflaction etc... (date and value)
i prepared a file csv called myFile.csv with a column filled with date as:   26.07.2019      and value as :  2,50%

Is ok? should work or i must do something else?
Im sorry im really bad in programming, i wish to learn but is rather difficult for me. If somebody could give me the rights line to follow my ideas, thanks much in advance


Alberto