Как правильно записать историю в HST файл.

 

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

Бьюсь второй день но ничего не получаеться.

Код

//+------------------------------------------------------------------+
//|                                                          hst.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
ulong    last_fpos=0;         //
int      HandleHistory=-1;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string symbol=Symbol();
   int per=Period()*9;

   ResetLastError();
   if(CreateHeader()==true)//если создали заголовок
     {
      HandleHistory=FileOpenHistory(symbol+(string)per+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
      if(HandleHistory!=INVALID_HANDLE)
        {

         for(int i=199;i>0;i--)//заполняем данными
           {
            MqlRates r;
            r.time=Time[i];//просто пытаюсь записать, это так для примера
            r.open=Open[i];//просто пытаюсь записать, это так для примера
            r.low=Low[i];
            r.high=High[i];
            r.close=Close[i];
            r.tick_volume=(long)10;
            r.spread=0;
            r.real_volume=(long)10;
            uint byteswritten=FileWriteStruct(HandleHistory,r);
            Print("FileOpen OK ",byteswritten," ",Time[i]);
           }
       FileClose(HandleHistory);
       // FileFlush(HandleHistory);
        }
      else Print("Операция FileOpen неудачна, ошибка ",GetLastError());
     }
// long id=ChartOpen(symbol,per);
//Alert(id);
  }
//+------------------------------------------------------------------+
bool CreateHeader()//создаем файл с историей hst(заголовок)
  {

   int      file_version=401;
   string   c_copyright;
   string   c_symbol=Symbol();
   int i_period=Period()*9;
   int      i_digits=Digits;
   int      i_unused[13];
//---  
   ResetLastError();
   HandleHistory=FileOpenHistory(c_symbol+(string)i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
   if(HandleHistory<0)
     {
      Print("Error open ",c_symbol+(string)i_period,".hst file ",GetLastError());
      return(false);
     }
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   ArrayInitialize(i_unused,0);
//--- write history file header
   FileWriteInteger(HandleHistory,file_version,LONG_VALUE);
   FileWriteString(HandleHistory,c_copyright,64);
   FileWriteString(HandleHistory,c_symbol,12);
   FileWriteInteger(HandleHistory,i_period,LONG_VALUE);
   FileWriteInteger(HandleHistory,i_digits,LONG_VALUE);
   FileWriteInteger(HandleHistory,0,LONG_VALUE);
   FileWriteInteger(HandleHistory,0,LONG_VALUE);
   FileWriteArray(HandleHistory,i_unused,0,13);
   return(true);
  }

 В результате выполнения создаеться файл с историей, но автономный график не создается.

 

Вот инфо по графику

 

Почему то пишуться данные 2003 года!

 

В итоге при запуска графика получаю ошибку:  HistoryBase: 196 errors in 'NZDCHF45'

Понимаю что- что то не так записала. Но как правильно записывать не знаю, мало информации. Кто знает - подскажите.


 
miss.natasha:

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

Бьюсь второй день но ничего не получаеться.


В итоге при запуска графика получаю ошибку:  HistoryBase: 196 errors in 'NZDCHF45'

Понимаю что- что то не так записала. Но как правильно записывать не знаю, мало информации. Кто знает - подскажите.


Откройте  скрипт PeriodConverter и рассмотрите как пример.
 
Vitalie Postolache:
Откройте  скрипт PeriodConverter и рассмотрите как пример.
Открывала и рассматривала. Не помогло, я не очень опытный программист. Нигде нет информации как правильно записать в hst
 
miss.natasha:
Открывала и рассматривала. Не помогло, я не очень опытный программист. Нигде нет информации как правильно записать в hst
Тогда просто попробуйте объяснить сначала себе, зачем вы внутри цикла структуру "MqlRates r" объявляете?
 
Vitalie Postolache:
Тогда просто попробуйте объяснить сначала себе, зачем вы внутри цикла структуру объявляете?
А так нельзя? Структуру можно наверное и в цикле обявлять, компилятор вроде не возражал
 
miss.natasha:
А так нельзя? Структуру можно наверное и в цикле обявлять, компилятор вроде не возражал

Понятно. Тогда просто делайте как в том скрипте, ничего не переиначивая.

А компилятор следит лишь за правописанием, вашу логику он не знает и не проверит никак. 

 
Vitalie Postolache:

Понятно. Тогда просто делайте как в том скрипте, ничего не переиначивая.

А компилятор следит лишь за правописанием, вашу логику он не знает и не проверит никак. 

Мне не надо как в том скрипте, мне надо свои данные записать в hst.
 
Может не подойдёт вовсе, но как вариант:
я иногда тоже рисую свои графики, пишу файл вида (самый простой вариант графика с нумерацией от нуля по оси х. А вообще можно хоть японские свечи рисовать):
"График 1"
3\n5\n7\n1...


"График 2"
5\n2\n1\n8...


...
 и скармливаю это хозяйство gnuplot:
gnuplot> plot for [i=0:10] 'data_file' index i with line  title columnheader
График готов. Простой открытый формат файлов без всякой ненужной шелухи.