Архив котировок

 
Подскажите, пожалуйста,  можно ли и как в MQL4 организовать редактирование данных архива котировок (тех, что доступны по F2)? Спасибо.
 
evnt:
Подскажите, пожалуйста,  можно ли и как в MQL4 организовать редактирование данных архива котировок (тех, что доступны по F2)? Спасибо.
Да, двойной клик на строке, которую хотите редактировать. К тому же, там есть еще кнопка "Правка".
 

Scriptong:
Да, двойной клик на строке, которую хотите редактировать. К тому же, там есть еще кнопка "Правка".Y

Уточняю вопрос: не из терминала, а программно, средствами языка MQL4.

 
Тоже можно. Смотрите в сторону FileOpenHistory. Наиболее яркий пример - штатный скрипт period_converter.
 
Scriptong:
Тоже можно. Смотрите в сторону FileOpenHistory. Наиболее яркий пример - штатный скрипт period_converter.
Да, это то, что надо. Большое спасибо
 
evnt:
Да, это то, что надо. Большое спасибо

А может еще знаете скрипт, который  историю меньшего фрейма дописывает более длинной историей большего фрейма?

 
evnt:

А может еще знаете скрипт, который  историю меньшего фрейма дописывает более длинной историей большего фрейма?


 ок, спасибо, вроде бы сам сделал.

 
evnt:

Я опять за помощью, застрял там, где не рассчитывал:

Создал файл минуток с историей нужной длины из исходных минуток и историй бОльших фреймов: 

myLink.HST

Теперь хочу сделать копию  исходного файла минутки, а потом заменить исходную минутку на myLink.HST, но сделать этого не могу, так как все время идет ошибка 5002 "неверное имя файла" из  FileCopy, FileMove и т.д.

Хотя  проводник по этому пути до файла добирается

Может файлы .hst  переименовывать/удалять нельзя? Может для них есть функции типа  FileCopyHistory?

 

Вот нужные строки кода:

string iFile,rFile;//initial and result files

string local=TerminalInfoString(TERMINAL_DATA_PATH);

 string local1=AccountServer(); 

... 

Tool=ToolNames[i];

 iFile=StringConcatenate(local,"\\history\\",local1,"\\", Tool,"1.hst");

  rFile=StringConcatenate(local,"\\history\\",local1,"\\", Tool,"1_.hst"); 

... 

 GetLastError();

   if(!FileCopy(iFile,0,rFile,FILE_REWRITE))

   {

      err=GetLastError();

      MessageBox(iFile+" FileCopy  err="+err);

   }

 
evnt:

Теперь хочу сделать копию  исходного файла минутки, а потом заменить исходную минутку на myLink.HST, но сделать этого не могу, так как все время идет ошибка 5002 "неверное имя файла" из  FileCopy, FileMove и т.д.

Хотя  проводник по этому пути до файла добирается

 

FileCopy не работает с файлами, находящимися вне папки MQL4\Files. Об этом прямо написано в документации. Чтобы работать с файлами истории котировок из MQL4, придется их копировать путем открытия-чтения-записи (FileOpenHistory-FileRead-FileReadStruct-FileWrite-FileWriteStruct), т. е. самостоятельно.

 
Scriptong:

FileCopy не работает с файлами, находящимися вне папки MQL4\Files. Об этом прямо написано в документации. Чтобы работать с файлами истории котировок из MQL4, придется их копировать путем открытия-чтения-записи (FileOpenHistory-FileRead-FileReadStruct-FileWrite-FileWriteStruct), т. е. самостоятельно.Xn

 

Мне уже неловко, но у меня не получается. Что я делаю не так?

Размер моей копии получается чуть меньшего  размера, чем у оригинала (2271628 оригинал/2271360 копия).

Убедился, что  размер копии по Copy+Paste совпадает с оригиналом.

  Когда импортирую (по F2 из History Center) созданную мною копию , то в окне предварительного просмотра все пусто, а когда созданную по Copy+Paste, то там все нормально.

Возможно какого-то заголовка файла не хватает? 

//+------------------------------------------------------------------+

//| Script program start function                                    |

//+------------------------------------------------------------------+

void OnStart()

  {

//---

MqlRates buf[];

int err;

int i=0;


int HndCopy=FileOpenHistory("AUDCHF1_.hst",FILE_WRITE|FILE_SHARE_WRITE|FILE_BIN);

int copied=CopyRates("AUDCHF",1,i,1,buf);

while (copied>0)

{  

   i=i+1;

   copied=CopyRates("AUDCHF",1,i,1,buf);

   FileWriteStruct(HndCopy,buf[0]);

}

FileClose(HndCopy);

//MessageBox(i);

  } 

 

 

Да, Вы забыли про заголовок исторического файла. Посмотрите, как это реализовано в штатном period_converter:

   ExtHandle=FileOpenHistory(c_symbol+(string)i_period+".hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ|FILE_ANSI);
   if(ExtHandle<0)
      return;
   c_copyright="(C)opyright 2003, MetaQuotes Software Corp.";
   ArrayInitialize(i_unused,0);
//--- write history file header
   FileWriteInteger(ExtHandle,file_version,LONG_VALUE);
   FileWriteString(ExtHandle,c_copyright,64);
   FileWriteString(ExtHandle,c_symbol,12);
   FileWriteInteger(ExtHandle,i_period,LONG_VALUE);
   FileWriteInteger(ExtHandle,i_digits,LONG_VALUE);
   FileWriteInteger(ExtHandle,0,LONG_VALUE);
   FileWriteInteger(ExtHandle,0,LONG_VALUE);
   FileWriteArray(ExtHandle,i_unused,0,13);