Запись показаний индикаторов в формате .xls

 
Можно ли сохранять показания  индикаторов  в экселевой (.xls) таблице. К примеру индикатор МA и MACD   с  определенным интервалом 15 или 30 минут, т.е это будет xls таблица:  первый столбец - время, второй и последующие столбцы - показания индикаторов.
 

если ответить Вам, что можно, то Вы спросите как и напишете код самостоятельно?

если да, тогда возможно Вам поможет https://book.mql4.com/ru/functions/files, выводите в .csv с которым Exel прекрасно работает

 

Csv пишите.

Автоматизация позволяет закладывать данные в эксель- но работает слишком медленно.
Лажает как на модификации отдельных ячеек- так и на закладке большим блоком.
Как-то ковырялся с этим. Не использую.

Единственное- разберитесь с форматами дат- разделителями- форматом чисел.
Что-то можно через региональные настройки... настроить.
В целом- все зависит от задачи- что нужно.

 
IgorM:

если ответить Вам, что можно, то Вы спросите как и напишете код самостоятельно?

если да, тогда возможно Вам поможет https://book.mql4.com/ru/functions/files, выводите в .csv с которым Exel прекрасно работает


Ознакомился с указанной статьей. Прочитал аналогичную информацию в форуме. Не понял. Вся информация (пока для меня) фрагментальная и обрывистая и поэтому не смог её систематизировать. Нужен один полный проход (пример), чтобы понять полный (завершенный) цикл выполнения задачи.

Прошу помочь в решении задачи: в экселевой таблице - 1-я строка - "шапка" в колонках "Дата и время" "adx_main" "adx_plus" "adx_minus".

В конечном итоге, к примеру, должна быть таблица, в которой в строках будут указаны время с интервалом 15 минут и показания индикаторов.


//+------------------------------------------------------------------+
//| write_indikator.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""


string EASymbol; //--- Текущий символ

int init()
{
//----
EASymbol = Symbol(); //--- Инициализация текущено символа
//----
return(0);
}

int deinit()
{
//----

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

int start()
{
int Handle; // Файловый описатель
int Qnt_Symb; // Количество записанных симв.
string File_Name="indikators.csv"; // Имя файла
//----
if (NewBar() == true)
{
//----
double adx_main = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MAIN,1);
double adx_plus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_PLUSDI,1);
double adx_minus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MINUSDI,1);

//--------------------------------------------------------------- 3 --
Handle=FileOpen(File_Name,FILE_CSV|FILE_READ|FILE_WRITE,";");// Открытие файла
if(Handle<0) // Неудача при открытии файла
{
if(GetLastError()==4103) // Если файла не существует,..
Alert("Нет файла с именем ",File_Name);//.. извещаем трейдера
else // При любой другой ошибке..
Alert("Ошибка при открытии файла ",File_Name);//..такое сообщ

return; // Выход из start()
}
Qnt_Symb=FileWrite(Handle,adx_main,adx_plus,adx_minus );//Запись в файл
if(Qnt_Symb < 0) // Если не получилось
{
Alert("Ошибка записи в файл ",GetLastError());// Сообщение
FileClose( Handle ); // Закрываем файл
return; // Выход из start()
}
//----
}
return(0);
}
//+------------------------------------------------------------------+

bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return (true);
} else return(false);

}


ЗАРАНЕЕ БЛАГОДАРЕН.

Сергей.

 

OK, значит будете писать самостоятельно код, это обнадеживает, вот пример от метаквот: https://www.mql5.com/ru/code/7716

и вот еще в один отличный примерчик https://www.mql5.com/ru/code/9781

 
void WriteToFile()
{
   string FileName, TimeString;
   FileName = "8currencyIndexClear" + Period()+"_"+ChartBars; //задаем имя файла
   
   int i, index, FileHandle, ChrtBars;
   ChrtBars = ChartBars;
   index = 1;
   FileHandle = FileOpen(FileName, FILE_CSV | FILE_WRITE, ";");
   if (FileHandle >= 0)
   {
      FileWrite(FileHandle, ChrtBars); //пишем размер выборки
      for (i = 0; i < ChrtBars; i++)
      {
         TimeString =  TimeToStr( Time[i], TIME_DATE|TIME_MINUTES);
         FileWrite(FileHandle, TimeString, b0[i], b1[i], b2[i], b3[i], b4[i], b5[i], b6[i], b7[i]);
      }
      FileClose( FileHandle);
   }
}
Привет, тезка! Покопался в своих индюках. Наиболее близко то, что ты видишь. Надеюсь, разберешься. Если, что, пиши в личку.
 
markos:

Ознакомился с указанной статьей. Прочитал аналогичную информацию в форуме. Не понял.

В таких случаях наверное лучше всего взять готовый рабочий пример, удалить из него все что
не относится к теме вопроса, разобраться с тем как это работает и затем переложить на свой код.
 
IgorM:

OK, значит будете писать самостоятельно код, это обнадеживает, вот пример от метаквот: https://www.mql5.com/ru/code/7716

и вот еще в один отличный примерчик https://www.mql5.com/ru/code/9781

Благодарю за отзыв. Конечно буду решать задачу самостоятельно, только нужна помощь. Исходя из тех трех примеров, которые мне были рекомендованы, я подкорректировал код, сейчас он очень простой. Мне важно решить следующее: при открытии нового бара должна происходить запись - дата, время и показания нескольких индикаторов. Вот мой шаблон . Пожалуйста подкорректируйте код. Заранее благодарю.

//+------------------------------------------------------------------+
//| write_indikator.mq4 |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""

string EASymbol; //--- Текущий символ
int ChartBars;
extern string File_name = "";
int Handle; // Файловый описатель
extern string Delimiter = ";";


int init()
{
EASymbol = Symbol(); //--- Инициализация текущено символа

if(File_name == "")File_name = Symbol() + Period() + "_Write_ind";
Handle = FileOpen(File_name,FILE_READ | FILE_WRITE | FILE_CSV, Delimiter);
if(Handle == -1){Alert("Ошибка при открытии файла ", File_name + ".csv");}
else{FileWrite(Handle,"Time;adx_main;adx_plus;adx_minus;_Write_ind");}

return(0);
}

int deinit()
{
FileClose(Handle);
return(0);
}

int start()
{

//----
if (NewBar() == true)
{
//--вычисляем значения индикаторов --
double adx_main = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MAIN,1);
double adx_plus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_PLUSDI,1);
double adx_minus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MINUSDI,1);
//----
WriteToFile(File_name,Handle,adx_main,adx_plus,adx_minus);
}
return(0);
}
//+------------------------------------------------------------------+



void WriteToFile(string d, int f, double a, double b,double c)
{
int status;
string TimeString;

if(f < 0) // Неудача при открытии файла
{
if(GetLastError()==4103) // Если файла не существует,..
Alert("Нет файла с именем ",d);//.. извещаем трейдера
else // При любой другой ошибке..
Alert("Ошибка при открытии файла ",d);//..такое сообщ
return;
}
TimeString = TimeToStr(Time[1],TIME_DATE|TIME_MINUTES);
FileSeek(d,0,SEEK_END);
status = FileWrite(d,TimeString,a,b,c);//Запись в файл
if(status < 0) // Если не получилось
{
Alert("Ошибка записи в файл ",GetLastError());// Сообщение
return;
}
}

bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return (true);
} else return(false);
}

 
Mislaid:
Привет, тезка! Покопался в своих индюках. Наиболее близко то, что ты видишь. Надеюсь, разберешься. Если, что, пиши в личку.
string EASymbol; //--- Текущий символ 
int ChartBars;
extern string File_name = "";
int Handle; // Файловый описатель
extern string Delimiter = ";";

int init()
{
EASymbol = Symbol(); //--- Инициализация текущено символа
if(File_name == "")File_name = Symbol() + Period() + "_Write_ind";
Handle = FileOpen(File_name,FILE_READ | FILE_WRITE | FILE_CSV, Delimiter);
if(Handle == -1){Alert("Ошибка при открытии файла ", File_name + ".csv");}
else{FileWrite(Handle,"Time;adx_main;adx_plus;adx_minus;_Write_ind");}
return(0);
}

int deinit()
{FileClose(Handle);return(0);}

int start()
{
//---- 
if (NewBar() == true)
{
//--вычисляем значения индикаторов --
double adx_main = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MAIN,1);
double adx_plus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_PLUSDI,1);
double adx_minus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MINUSDI,1);
//---- 
WriteToFile(File_name,Handle,adx_main,adx_plus,adx_minus);
}
return(0);
}
//+------------------------------------------------------------------+


void WriteToFile(string d, int f, double a, double b,double c)
{
int status;
string TimeString;

if(f < 0) // Неудача при открытии файла
{
if(GetLastError()==4103) // Если файла не существует,..
Alert("Нет файла с именем ",d);//.. извещаем трейдера 
else // При любой другой ошибке..
Alert("Ошибка при открытии файла ",d);//..такое сообщ
return; 
}
TimeString = TimeToStr(Time[1],TIME_DATE|TIME_MINUTES);
FileSeek(d,0,SEEK_END);
status = FileWrite(d,TimeString,a,b,c);//Запись в файл
if(status < 0) // Если не получилось
{
Alert("Ошибка записи в файл ",GetLastError());// Сообщение
return; 
}
}

bool NewBar()
{
static datetime lastbar = 0;
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return (true);
} else return(false);
}
Не получается. Мне надо к примеру, прикрепить к 15 мин графику и снимать показания индикаторов. А он мне пишет "Ошибка записи, 4051".  Что надо изменить? Не записывается файл.
 
markos:
Не получается. Мне надо к примеру, прикрепить к 15 мин графику и снимать показания индикаторов. А он мне пишет "Ошибка записи, 4051". Что надо изменить? Не записывается файл.


Ошибка записи в следующих двух строчках. Я их исправил.

FileSeek(f,0,SEEK_END);
status = FileWrite(f,TimeString,a,b,c);//Запись в файл

Да, и в твоем коде я не нашел первую строчку:

#property indicator_chart_window
Надеюсь, она просто не скопировалась.
 
Mislaid:


Ошибка записи в следующих двух строчках. Я их исправил.

Да, и в твоем коде я не нашел первую строчку:

Надеюсь, она просто не скопировалась.


Изменил переменную d  на  f. Не работает. Когда была переменная  d  советник выдавал сообщение об ошибке 4051, а при переменной f  вообще никаких действий. Что-то не так. Посмотри  пожалуйста ещё, код прилагаю.

 

//+------------------------------------------------------------------+
//|                                              write_indikator.mq4 |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
//#property indicator_chart_window

string EASymbol; //--- Текущий символ 
int ChartBars;
extern string File_name = "";
int Handle;                   // Файловый описатель
extern string Delimiter = ";";


int init()
  {
    EASymbol = Symbol(); //--- Инициализация текущено символа
    
    if(File_name == "")File_name = Symbol() + Period() + "_Write_ind";
    Handle = FileOpen(File_name,FILE_READ | FILE_WRITE | FILE_CSV, Delimiter);
    if(Handle == -1){Alert("Ошибка при открытии файла ", File_name + ".csv");}
    else{FileWrite(Handle,"Time;adx_main;adx_plus;adx_minus;_Write_ind");}

   return(0);
  }

int deinit()
  {
  FileClose(Handle);
   return(0);
  }

int start()
  {
 
//----  
  if (NewBar() == true)
  {
//--вычисляем значения индикаторов --
  double adx_main  = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MAIN,1);
  double adx_plus  = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_PLUSDI,1);
  double adx_minus = iADX(EASymbol,PERIOD_M15,14,PRICE_CLOSE,MODE_MINUSDI,1);
//----  
  WriteToFile(File_name,Handle,adx_main,adx_plus,adx_minus);
   }
   return(0);
  }
//+------------------------------------------------------------------+



void WriteToFile(string d, int f, double a, double b,double c)
     {
     int status;
     string TimeString;
     
     if(f < 0)                        // Неудача при открытии файла
       {
        if(GetLastError()==4103)         // Если файла не существует,..
           Alert("Нет файла с именем ",d);//.. извещаем трейдера 
        else                             // При любой другой ошибке..
           Alert("Ошибка при открытии файла ",d);//..такое сообщ
        return;                               
     }
     TimeString = TimeToStr(Time[1],TIME_DATE|TIME_MINUTES);
     FileSeek(f,0,SEEK_END);
     status = FileWrite(f,TimeString,a,b,c);//Запись в файл
     if(status  < 0)                 // Если не получилось
        {
         Alert("Ошибка записи в файл ",GetLastError());// Сообщение
         return;                            
        }
     }
  
bool NewBar()
{
  static datetime lastbar = 0;
  datetime curbar = Time[0];
  if(lastbar!=curbar)
    {
     lastbar=curbar;
     return (true);
    } else return(false);
}

	          
Причина обращения: