Работа с файлами. Пример визуализация важных рыночных событий

Andrey Opeyda | 31 мая, 2006


Каждый трейдер знает, что открывать позицию, применяя только лишь технический анализ (ТА), слегка рискованно. Правильней бы было открывать позицию, исходя как из фундаментального, так и технического анализа. Чаще всего трейдеры, работающие по ТА, используют календарь событий, чтобы учесть возможную волатильость рынка и не подвергать свою позицию неоправданному риску. Было бы очень удобно, если бы на ценовом графике отображались все ключевые события торгового дня. Например:


15.05.2006;9:00; Заказы пром. предприятий M.M ;Япония;Март;3.40%;1.00%;
15.05.2006;16:30; Индекс ФРБ Нью-Йорка ;США;Май;15.8;15;
15.05.2006;17:00; Нетто-приток иностр. капитала ;США;Март;86.9млрд.;80.0млрд.;
16.05.2006;12:30; HICP Y.Y ;Британия;Апрель;1.80%;2.00%;
16.05.2006;13:00; Индекс экон. настроений ZEW ;Германия;Май;62.7;65;
16.05.2006;16:00; Отчёт Wal-Mart Stores ;США;1кв.;-0.61;-;
16.05.2006;16:30; PPI M.M ;США;Апрель;0.50%;0.70%;
16.05.2006;16:30; PPI без прод. и энерг. M.M;США;Апрель;0.10%;0.20%;
16.05.2006;16:30; Новое строительство ;США;Апрель;1.960млн.;1.960млн.;
16.05.2006;16:30; Разрешения на строительство ;США;Апрель;2.094млн.;2.050млн.;
16.05.2006;17:15; Промышленное производство M.M;США;Апрель;0.60%;0.40%;
16.05.2006;17:15; Загрузка произв. мощностей ;США;Апрель;81.30%;81.50%;
17.05.2006;8:30;  Пром. производство (уточн.) M.M ;Япония;Март;0.20%;0.20%;
17.05.2006;12:30; Число безработных M.M ;Британия;Апрель;+12,600;+5,000;
17.05.2006;12:30; Протокол заседания BoE 4.05 ;Британия;-;-;-;
17.05.2006;13:00; Промышленное производство M.M;ЕС;Март;0.00%;-0.20%;
17.05.2006;13:00; Промышленное производство Y.Y ;ЕС;Март;3.20%;2.80%;
17.05.2006;13:00; HICP (уточн.) Y.Y ;ЕС;Апрель;2.40%;2.40%;
17.05.2006;16:30; CPI M.M;США;Апрель;0.40%;0.50%;
17.05.2006;16:30; CPI без прод. и энерг. M.M ;США;Апрель;0.30%;0.20%;
18.05.2006;12:30; Розничные продажи M.M ;Британия;Апрель;0.70%;0.20%;
18.05.2006;12:30;  Розничные продажи Y.Y;Британия;Апрель;2.60%;2.60%;
18.05.2006;16:30; Первичные обращения ;США;8-14.05;324,000;320,000;
18.05.2006;17:30; Выступление Б. Бернанке ;США;-;-;-;
18.05.2006;8:00; Опережающие индикаторы M.M ;США;Апрель;-0.10%;0.10%;
18.05.2006;20:00;  Индекс ФРБ Филадельфии ;США;Май;13.2;12;
19.05.2006;1:30; Выступление А. Гринспена;США;-;-;-;
19.05.2006;3:50; ВВП (предварит.) Q.Q ;Япония;1кв.;1.30%;0.20%;
19.05.2006;8:00; Заседание центробанка ;Япония;-;-;-;
19.05.2006;13:00;  Торговый баланс ;ЕС;Март;-4.5млрд.;-3.0млрд.;
     

Для чтения данных из файла необходимо сначала связаться с ним, т.е. открыть его для чтения. Для этого в MQL4, существует оператор

int FileOpen( string filename, int mode, int delimiter=';')

параметрами которого являются: имя файла, тип (бинарный FILE_BIN или строковой с разделителями FILE_CSV), способ доступа (запись FILE_READ или чтение FILE_WRITE), и символ разделитель между строковыми данными. В случае удачного открытия файла, идентификатору присваивается уникальное значение, в противном случае, идентификатору файла присваивается значение -1. Для детализации информации об ошибке можно воспользоваться функцией GetLastError(). Переменная FileName вынесена в заголовок скрипта.

#property show_inputs
extern string FileName = "week.txt";
 
…
 
   int handle;
   handle=FileOpen(FileName,FILE_CSV|FILE_READ,';');
   if(handle<1)
    {
     Print("Файл не найден: ", GetLastError());
     return(false);
    }

Так мы связались с файлом. Следующим этапом будет чтение всех данных. Читать будем строки, далее конвертировать их в нужные нам типы. Далее попробуем написать фильтр отображения событий. Для этого потребуется всего лишь вынести переменные в заголовок скрипта, которые и будут обозначать, надо ли отображать событие этой страны на ценовом графике.

  while(!FileIsEnding(handle))
   {
    string sDate=FileReadString(handle); // Date
    string sTime=FileReadString(handle); // Time
    string sCountry=FileReadString(handle); // Country
    string sPeriod=FileReadString(handle); // Period
    string sDescription=FileReadString(handle); // Description
    string sPrev=FileReadString(handle); // Prev    
    string sForecast=FileReadString(handle); // Expected        
    string sCurrent=FileReadString(handle); // Current value
    
    FileReadString(handle); // null
    
    
    Print(
      sDate+" "
      ,sTime+" "
      ,sCountry+" "
      ,sPeriod+" "
      ,sDescription+" "
      ,sForecast+" "
      ,sCurrent+" ");
      
    i++;
    datetime dt = StrToTime(sDate+" "+sTime);
    
         color c = Red;
 
         if (sCountry == "Япония") c = Yellow;            
         if (sCountry == "США") c = Brown;         
         if (sCountry == "Германия") c = Green;
         if (sCountry == "Еврозона") c = Blue;            
         if (sCountry == "Великобритания") c = Orange;
         if (sCountry == "Канада") c = Gray;
         if (sCountry == "Австралия") c = DarkViolet;
         if (sCountry == "Швеция") c = FireBrick;
         if (sCountry == "ЮАР") c = DodgerBlue;
         if (sCountry == "Дания") c = RosyBrown;
         if (sCountry == "Норвегия") c = HotPink;
         
 
 
         if ((sCountry == "Япония") && (!Japan)) continue;            
         if ((sCountry == "США") && (!USA)) continue;            
         if ((sCountry == "Германия") && (!Germany)) continue;            
         if ((sCountry == "Еврозона") && (!ES)) continue;            
         if ((sCountry == "Великобритания") && (!GB)) continue;                      
         if ((sCountry == "Канада") && (!Canada)) continue;                     
         if ((sCountry == "Австралия") && (!Australia)) continue;      
         if ((sCountry == "Швеция") && (!Shweden)) continue;      
         if ((sCountry == "ЮАР")&& (!UAR)) continue;      
         if ((sCountry == "Дания") && (!Dania)) continue;      
         if ((sCountry == "Норвегия") && (!Norvegia)) continue;
         
 
            
            
          if (DisplayText)
          {
          ObjectCreate("x"+i, OBJ_TEXT, 0, dt, Close[0]);
          ObjectSet("x"+i, OBJPROP_COLOR, c);          
          ObjectSetText("x"+i, 
            sDescription + " "
            + sCountry + " "
            + sPeriod + " "
            + sCurrent + " "
            + sForecast,
            8);          
          ObjectSet("x"+i, OBJPROP_ANGLE, 90);          
          }
          
                   
          ObjectCreate(sCountry+" "+i, OBJ_VLINE, 0, dt, Close[0]);
          ObjectSet(sCountry+" "+i, OBJPROP_COLOR, c);                    
          ObjectSet(sCountry+" "+i, OBJPROP_STYLE, STYLE_DOT);                    
          ObjectSet(sCountry+" "+i, OBJPROP_BACK, true);          
          ObjectSetText(sCountry+" "+i, 
            sDescription + " · "
            + sPeriod + " · "
            + sCurrent + " · "
            + sForecast,
            8);          
 
   }

Теперь вы всегда можете визуально видеть предстоящие события, и их влияние на рынок. Готовый код скрипта и файлы с данными прикреплены к статье. Не забудьте, что скрипты находятся в директории Experts/Scripts  а файлы данных должны находится в Experts/Files. Также следует не забывать о формате даты. YYYY.MM.DD HH:MM, и о символах разделителях. Иллюстрации работы скрипта ниже.









Работа с файлами в MQL4 предоставляет пользователю широкий выбор возможностей, это как связь терминала с внешними источниками данных, так и упрощения или оптимизация работы с торговым терминалом. Примерами есть как ведение логов, так и возможность отображения уровней поддержки/сопротивления, получая данные прямо с World Wide Web. Т.е не следует забывать, что пользователь неограничен в выборе методов работы с файлом. А автоматизация процессов происходящих в торговле для открытия и управления позициями должна способствовать меньшей психологической нагрузке на трейдера, и в свою очередь дать возможность анализировать большее количество факторов влияющих на торговлю. В принципе язык MQL4 предназначен именно для этого.

Все функции MQL4 для работы с файлом. Подробная информация в документации MQL4.

FileClose
FileDelete
FileFlush
FileIsEnding
FileIsLineEnding
FileOpen
FileOpenHistory
FileReadArray
FileReadDouble
FileReadInteger
FileReadNumber
FileReadString
FileSeek
FileSize
FileTell
FileWrite
FileWriteArray
FileWriteDouble
FileWriteInteger
FileWriteString