Скачать MetaTrader 5

Не могу считать из файла в массив

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Иван Скиридомов
9
Иван Скиридомов  
//+------------------------------------------------------------------+
//|                                                 WININET_TEST.mq5 |
//|                        Copyright 2010, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
//| Пример загрузки файла из Интернета с использованием wininet.dll  |
//| Модификация кода c http://codebase.mql4.com/ru/1064              |
//+------------------------------------------------------------------+
#property copyright "2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Импортируемые функции из wininet.dll                             |
//+------------------------------------------------------------------+
#import "wininet.dll"
int InternetAttemptConnect(int x);
int InternetOpenW(string sAgent,int lAccessType,
                  string sProxyName="",string sProxyBypass="",
                  int lFlags=0);
int InternetOpenUrlW(int hInternetSession,string sUrl,
                     string sHeaders="",int lHeadersLength=0,
                     int lFlags=0,int lContext=0);
int InternetReadFile(int hFile,uchar &sBuffer[],int lNumBytesToRead,
                     int &lNumberOfBytesRead[]);
int HttpQueryInfoW(int hRequest,int dwInfoLevel,
                   uchar &lpvBuffer[],int &lpdwBufferLength,int &lpdwIndex);
int InternetCloseHandle(int hInet);
#import
#define HTTP_QUERY_CONTENT_LENGTH 5
//+------------------------------------------------------------------+
//| Параметры скрипта по умолчанию                                   |
//+------------------------------------------------------------------+
#property script_show_inputs

//+------------------------------------------------------------------+
//| Функция загружает файл указанный по адресу addr                  |
//| и сохраняет его в подкаталог терминала \MQL5\Files               |
//+------------------------------------------------------------------+
int FileLoadFromInternet(string addr,string filename)
  {
   int rv = InternetAttemptConnect(0);
   if(rv != 0)
     {
      Print("Ошибка при вызове InternetAttemptConnect()");
      return(-1);
     }

   int hInternetSession=InternetOpenW("Microsoft Internet Explorer",0,"","",0);
   if(hInternetSession<=0)
     {
      Print("Ошибка при вызове InternetOpenW()");
      return(-2);
     }

   int hURL=InternetOpenUrlW(hInternetSession,addr,"",0,0,0);
   if(hURL<=0)
     {
      Print("Ошибка при вызове InternetOpenUrlW()");
      InternetCloseHandle(hInternetSession);
      return(-3);
     }

//--- Данный блок кода предназначен для получения информации о размере 
//--- скачиваемого объекта. Для этого используется функция HttpQueryInfo 
//--- Размер содержимого будет в переменной ContentSize_HttpQueryInfoW
//--- Если она равна нулю, значит сервер не сообщил информацию о размере
   int BufLen=2048;
   int ind=0;
   uchar buf0[2048];
   string s="";
   int ContentSize_HttpQueryInfoW=0;
   int iRes;

   iRes=HttpQueryInfoW(hURL,HTTP_QUERY_CONTENT_LENGTH,buf0,BufLen,ind);
   if(iRes<=0)
     {
      Print("Ошибка при вызове HttpQueryInfoW()");
     }
   else
     {
      s="";
      for(int k=0;k<BufLen;k++) { s=s+CharToString(buf0[k]);}
      if(StringLen(s)>0) ContentSize_HttpQueryInfoW=(int)StringToInteger(s);
     }

   if(ContentSize_HttpQueryInfoW>0)
     {
      Print("Размер содержимого=",ContentSize_HttpQueryInfoW);
     }
   else
     {
      Print("Размер содержимого неизвестен");
     }

   int dwBytesRead[1];
   bool flagret=true;
   uchar buffer[1024];
   int cnt=0;

   int h=FileOpen(filename,FILE_BIN|FILE_WRITE);
   if(h<=0)
     {
      Print("Ошибка при вызове FileOpen(), имя файла",filename,"ошибка",GetLastError());
      InternetCloseHandle(hInternetSession);
      return(-4);
     }

   while(!IsStopped())
     {
      bool bResult=InternetReadFile(hURL,buffer,1024,dwBytesRead);
      cnt+=dwBytesRead[0];
      if(dwBytesRead[0]==0) break;
      FileWriteArray(h,buffer,0,dwBytesRead[0]);
     }

   if(h>0) FileClose(h);

   if(cnt==0) FileDelete(filename);

   if(cnt==0)
     {
      Print("Нет считанных данных, запрос по адресу:",addr);
      InternetCloseHandle(hInternetSession);
      return(-5);
     }
   InternetCloseHandle(hInternetSession);

   return(0);
  }
//+------------------------------------------------------------------+
//| Главная функция скрипта OnStart                                  |
//+------------------------------------------------------------------+
int OnStart()
  {
//---
   string URL=GetURL(); // Ссылка
   string FileToSave="temp.csv"; // Имя файла

   if(TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)==false)
     {
      Alert("Необходимо в настройках разрешить использование DLL");
      return(-1);
     }

   int iRes=FileLoadFromInternet(URL,FileToSave);
   if(iRes==0)
     {
      ParseNews(FileToSave);
      DrawNews(NewsArr);
     }
   else
     {
      Alert("Произошла ошибка. Подробности во вкладке Эксперты");
     }

   return(0);
  }
//+------------------------------------------------------------------+

string GetURL()
{
   string url = "http://www.dailyfx.com/files/";
   // http://www.dailyfx.com/files/Calendar-01-19-2014.csv
   MqlDateTime tm;
   TimeCurrent(tm);
   datetime date =  TimeLocal() - (tm.day_of_week  * 86400);
   TimeToStruct(date,tm);
   string filename = StringFormat("Calendar-%02d-%02d-%4d.csv",tm.mon,tm.day,tm.year);
   StringConcatenate(url,url,filename);
   return  url;
}


struct structNews
  {
   string Date;
   string NewsTime;
   string NewsTimeZone;
   string Currency;
   string Event;
   string Importance;
   string  Actual;
   string  Forecast;
   string  Previous;
  };

structNews NewsArr[]; 


bool ParseNews(string file) {

   ResetLastError();

   int filehandle=FileOpen(file,FILE_READ|FILE_CSV);
   if(filehandle!=INVALID_HANDLE)
     {
      
      FileReadArray(filehandle,NewsArr);
   
      Print("FileOpen OK");
      int size=ArraySize(NewsArr);
      Print("Data size:",size);
      FileClose(filehandle);
      return true;
     }
   else {
   Print("Операция FileOpen неудачна, ошибка ",GetLastError());
   return false;
   }
}

bool DrawNews(structNews &arr[])
{
   int size=ArraySize(arr);
      //--- распечатаем данные из массива
      for(int i=0;i<size;i++)
         Print("Date = ",arr[i].Date," Actual = ",arr[i].Actual," Forecast = ",arr[i].Forecast);
      Print("Total data = ",size);
   return true;
}

В логах пишет:

2014.01.24 17:59:56.754 MyNews (AUDCAD,H1)      Total data = 0
2014.01.24 17:59:47.690 MyNews (AUDCAD,H1)      Data size:0
2014.01.24 17:59:47.690 MyNews (AUDCAD,H1)      FileOpen OK
2014.01.24 17:59:47.686 MyNews (AUDCAD,H1)      Размер содержимого=9313

 

Уже весь задебажился :( 

Quantum
161
Quantum  
Попробуйте так:
//+------------------------------------------------------------------+
//| ParseNews                                                        |
//+------------------------------------------------------------------+
bool ParseNews(string file)
  {
   ResetLastError();
   int filehandle=FileOpen(file,FILE_TXT|FILE_READ|FILE_ANSI);
   if(filehandle==INVALID_HANDLE)
     {
      Print("Операция FileOpen неудачна, ошибка ",GetLastError());
      return(false);
     }
   int cnt=0;
   while(!FileIsEnding(filehandle))
     {
      string str=FileReadString(filehandle);
      if(str!="")
        {
         string arr_str[];
         StringSplit(str,',',arr_str);
         //--- Print(cnt," items=",ArraySize(arr_str),"str=",str);
         if(ArraySize(arr_str)==9)
           {
            ArrayResize(NewsArr,cnt+1);
            NewsArr[cnt].Date=arr_str[0];
            NewsArr[cnt].NewsTime=arr_str[1];
            NewsArr[cnt].NewsTimeZone=arr_str[2];
            NewsArr[cnt].Currency=arr_str[3];
            NewsArr[cnt].Event=arr_str[4];
            NewsArr[cnt].Importance=arr_str[5];
            NewsArr[cnt].Actual=arr_str[6];
            NewsArr[cnt].Forecast=arr_str[7];
            NewsArr[cnt].Previous=arr_str[8];
            cnt++;
           }
        }
     }
   FileClose(filehandle);
   return(true);
  }
Другой пример чтения новостей  https://www.mql5.com/ru/forum/16650
Библиотеки: EasyXML - XML Parser
Библиотеки: EasyXML - XML Parser
  • www.mql5.com
Библиотека является полностью объектно-ориентированной и аккуратно интегрируется с MQL5 за счет использования классов CObject и CArrayObj Стандартной библиотеки для хранения DOM-дерева.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий