| //+------------------------------------------------------------------+//|                                               Demo_FileWrite.mq4 |
 //|                        Copyright 2014, MetaQuotes Software Corp. |
 //|                                              https://www.mql5.com |
 //+------------------------------------------------------------------+
 #property copyright "Copyright 2014, MetaQuotes Software Corp."
 #property link      "https://www.mql5.com"
 #property version   "1.00"
 #property strict
 //--- покажем окно входных параметров при запуске скрипта
 #property script_show_inputs
 //--- параметры для получения данных из терминала
 input string             InpSymbolName="EURUSD";      // Валютная пара
 input ENUM_TIMEFRAMES    InpSymbolPeriod=PERIOD_H1;   // Таймфрейм
 input int                InpFastEMAPeriod=12;         // Период быстрой средней
 input int                InpSlowEMAPeriod=26;         // Период медленной средней
 input int                InpSignalPeriod=9;           // Период усреднения разности
 input ENUM_APPLIED_PRICE InpAppliedPrice=PRICE_CLOSE; // Тип цены
 //--- параметры для записи данных в файл
 input string             InpFileName="MACD.csv";      // Имя файла
 input string             InpDirectoryName="Data";     // Имя каталога
 //+------------------------------------------------------------------+
 //| Script program start function                                    |
 //+------------------------------------------------------------------+
 void OnStart()
 {
 bool     sign_buff[]; // массив сигналов (true - покупка, false - продажа)
 datetime time_buff[]; // массив времени наступления сигналов
 int      sign_size=0; // размер массивов сигналов
 double   macd_buff[]; // массив значений индикатора
 datetime date_buff[]; // массив дат индикатора
 int      macd_size=0; // размер массивов индикатора
 //--- установим для массивов признак таймсерии
 ArraySetAsSeries(sign_buff,true);
 ArraySetAsSeries(time_buff,true);
 ArraySetAsSeries(macd_buff,true);
 ArraySetAsSeries(date_buff,true);
 //--- сбросим код ошибки
 ResetLastError();
 //--- скопируем таймсерию,содержащую время открытия последних 1000 баров
 int copied=CopyTime(NULL,0,0,1000,date_buff);
 if(copied<=0)
 {
 PrintFormat("Не удалось скопировать времена открытия за последние 1000 баров. Код ошибки=%d",GetLastError());
 return;
 }
 //--- подготовим массив macd_buff
 ArrayResize(macd_buff,copied);
 //--- скопируем значения основной линии индикатора iMACD
 for(int i=0;i<copied;i++)
 {
 macd_buff[i]=iMACD(InpSymbolName,InpSymbolPeriod,InpFastEMAPeriod,InpSlowEMAPeriod,InpSignalPeriod,InpAppliedPrice,MODE_MAIN,i);
 }
 //--- получим размер буфера
 macd_size=ArraySize(macd_buff);
 //--- проанализируем данные и сохраним сигналы индикатора в массивы
 ArrayResize(sign_buff,macd_size-1);
 ArrayResize(time_buff,macd_size-1);
 for(int i=1;i<macd_size;i++)
 {
 //--- сигнал на покупку
 if(macd_buff[i-1]<0 && macd_buff[i]>=0)
 {
 sign_buff[sign_size]=true;
 time_buff[sign_size]=date_buff[i];
 sign_size++;
 }
 //--- сигнал на продажу
 if(macd_buff[i-1]>0 && macd_buff[i]<=0)
 {
 sign_buff[sign_size]=false;
 time_buff[sign_size]=date_buff[i];
 sign_size++;
 }
 }
 //--- откроем файл для записи значений индикатора (если его нет, то создастся автоматически)
 ResetLastError();
 int file_handle=FileOpen(InpDirectoryName+"//"+InpFileName,FILE_READ|FILE_WRITE|FILE_CSV);
 if(file_handle!=INVALID_HANDLE)
 {
 PrintFormat("Файл %s открыт для записи",InpFileName);
 PrintFormat("Путь к файлу: %s\\Files\\",TerminalInfoString(TERMINAL_DATA_PATH));
 //--- сначала запишем количество сигналов
 FileWrite(file_handle,sign_size);
 //--- запишем время сигналов и их значения в файл
 for(int i=0;i<sign_size;i++)
 FileWrite(file_handle,time_buff[i],sign_buff[i]);
 //--- закрываем файл
 FileClose(file_handle);
 PrintFormat("Данные записаны, файл %s закрыт",InpFileName);
 }
 else
 PrintFormat("Не удалось открыть файл %s, Код ошибки = %d",InpFileName,GetLastError());
 }
 |