Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Публикуй программы в Маркете. Зарабатывай с помощью своих знаний!
Andrey Khatimlianskii
52202
Andrey Khatimlianskii 2006.01.28 00:59 
- пишу историю в файл "СимволПериодall.hst"
- файл успешно записывается, размер соответствует.
- пробую открыть файл в автономном режиме, открывается, вроде бы, нормально (в списке файлов правильно отображается имя и заголовок, при открытии ни какаих сообщений нет)
- просматриваю историю - не то. Вместо нужного файла загружается исходный файл (в моём случае, евро М1 и фунт М1)

Проверяю:
- удаляю всю историю евро-минуток (в архиве котировок)
- импортирую минутки из сделанного файла (там же)
- открываю график - всё ок, котировки загрузились

Пробую по-другому:
- пишу переделанную историю GBPUSD в файл "EURUSD1.hst"
- открываю файл "EURUSD1.hst" в автономном режиме - всё ок

Вывод - файлы с нестандартным именем не открываются автономно

ЗЫ: пробовал имя "СимволallПериод.hst" - эфект тот же...
ЗЗЫ: билд 188 от 19.01.2006
Andrey Khatimlianskii
52202
Andrey Khatimlianskii 2006.01.28 01:00  
Код для проверки (имя файла нестандартное):
#include <WinUser32.mqh> int ExtHandle=-1; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { int last_fpos; double d_close, last_volume; int hwnd=0,cnt=0; //---- History header int version=400; string c_copyright="Copyright © 2005, komposter"; string c_symbol=Symbol(); int i_period=Period(); int i_digits=Digits; int i_unused[13]; //---- ExtHandle=FileOpenHistory(c_symbol+i_period+"_all.hst", FILE_BIN|FILE_WRITE); if(ExtHandle < 0) return(-1); //---- write history file header FileWriteInteger(ExtHandle, version, LONG_VALUE); FileWriteString(ExtHandle, c_copyright, 64); FileWriteString(ExtHandle, "EURUSD", 12); FileWriteInteger(ExtHandle, i_period, LONG_VALUE); FileWriteInteger(ExtHandle, i_digits, LONG_VALUE); FileWriteInteger(ExtHandle, 0, LONG_VALUE); //timesign FileWriteInteger(ExtHandle, 0, LONG_VALUE); //last_sync FileWriteArray(ExtHandle, i_unused, 0, 13); //---- write history file int periodseconds = i_period * 60; int StartBar = Bars - 1; double d_open = Open[StartBar]; double d_low = Low[StartBar]; double d_high = High[StartBar]; double d_volume = Volume[StartBar]; //---- normalize open time int i_time = Time[StartBar]/periodseconds; i_time *= periodseconds; //+------------------------------------------------------------------+ //| обработка истории //+------------------------------------------------------------------+ int time0; for( int i = StartBar - 1; i >= 0; i-- ) { time0 = Time[i]; //---- если есть пропущенные бары, while ( time0 > i_time + periodseconds && TimeDayOfWeek(i_time) > 0 && TimeDayOfWeek(i_time) < 6 ) { //Print( "i = ", i, ", time0 = ", TimeToStr(time0), ", d_open = ", d_open, ", d_low = ", d_low, ", d_high = ", d_high, ", d_close = ", d_close, ", d_volume = ", d_volume ); last_fpos = FileTell(ExtHandle); FileWriteInteger(ExtHandle, i_time, LONG_VALUE); FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE); FileFlush(ExtHandle); cnt++; i_time += periodseconds; d_open = d_close; d_low = d_close; d_high = d_close; d_volume = 1; //Print( "i = ", i, ", time0 = ", TimeToStr(time0), ", d_open = ", d_open, ", d_low = ", d_low, ", d_high = ", d_high, ", d_close = ", d_close, ", d_volume = ", d_volume ); } if ( time0 >= i_time + periodseconds ) { last_fpos = FileTell(ExtHandle); FileWriteInteger(ExtHandle, i_time, LONG_VALUE); FileWriteDouble(ExtHandle, d_open, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_low, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_high, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_close, DOUBLE_VALUE); FileWriteDouble(ExtHandle, d_volume, DOUBLE_VALUE); FileFlush(ExtHandle); cnt++; i_time = time0 / periodseconds; i_time *= periodseconds; d_open = Open[i]; d_low = Low[i]; d_high = High[i]; d_close = Close[i]; d_volume = Volume[i]; } } FileFlush(ExtHandle); Print(cnt," record(s) written"); return(0); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void deinit() { if(ExtHandle>=0) { FileClose(ExtHandle); ExtHandle=-1; } } //+------------------------------------------------------------------+



Если
ExtHandle=FileOpenHistory(c_symbol+i_period+"_all.hst", FILE_BIN|FILE_WRITE);
поменять на
ExtHandle=FileOpenHistory("EURUSD"+i_period+".hst", FILE_BIN|FILE_WRITE);
файл можно будет открыть автономно.. Иначе - только импортом котировок..
Slawa
Модератор
6676
Slawa 2006.01.30 12:39  
Вообще-то, существует соглашение о наименовании исторических файлов и о соответствии наименования файла некоторым полям заголовка файла
Andrey Khatimlianskii
52202
Andrey Khatimlianskii 2006.01.30 15:39  
stringo:
Вообще-то, существует соглашение о наименовании исторических файлов и о соответствии наименования файла некоторым полям заголовка файла
Это, наверное, скорее хорошо, чем плохо ;)

Только я не встречался с этим - вот и напоролся...


А как тогда быть? Я хочу из минуток сделать те же минутки, только отредактированные... А свои менять не хочется.
Как записать новый файл истории, не заменяя предыдущий?

Может, есть нормальное решение? Не копировать же в другую папку, а потом назад...
Slawa
Модератор
6676
Slawa 2006.01.30 16:43  
komposter:
Только я не встречался с этим - вот и напоролся...
Кстати, да. В хелпе по терминалу есть описание формата HST. Соглашение же о наименовании и соответствии не приведено. Исправим.


А как тогда быть? Я хочу из минуток сделать те же минутки, только отредактированные... А свои менять не хочется.
Как записать новый файл истории, не заменяя предыдущий?

Может, есть нормальное решение? Не копировать же в другую папку, а потом назад...
Чтобы не было проблем, соответствующий график обязательно должен быть закрыт и не должен принимать котировки. То есть, Вы закрываете график и выжидаете 10 минут, либо перезагружаете клиентский терминал.
После этого Вы можете внести любые изменения, не трогая заголовка.
И открывайте хоть оффлайн, хоть онлайн. Однако, Вы потеряете Ваши изменения, нажав кнопочку "Обновить".
Andrey Khatimlianskii
52202
Andrey Khatimlianskii 2006.01.30 22:08  
Чтобы не было проблем, соответствующий график обязательно должен быть закрыт и не должен принимать котировки. То есть, Вы закрываете график и выжидаете 10 минут, либо перезагружаете клиентский терминал.
После этого Вы можете внести любые изменения, не трогая заголовка.
И открывайте хоть оффлайн, хоть онлайн. Однако, Вы потеряете Ваши изменения, нажав кнопочку "Обновить".
В том-то и дело, что мне надо оба файла истории.

1-й (оригинальные минутки) - достаточно ценный материал...
2-й (минутки без пропусков) - мне - для написания скрипта и отлова багов, людям - для анализа =) (неоднократно просили)

И нельзя жертвовать ни одним, ни другим...

Наверное, прийдётся называть его М2 ;)
Slawa
Модератор
6676
Slawa 2006.01.31 10:23  
komposter:
Наверное, прийдётся называть его М2 ;)
Зачем? Оставьте минутки.
Назовите, например, EUROUSD1.HST, только не забудьте в заголовке файла в поле symbol также записать EUROUSD.
Кстати, Вы можете оставить название EURUSDALL1.HST, соответственно в поле symbol запишите EURUSDALL
Andrey Khatimlianskii
52202
Andrey Khatimlianskii 2006.01.31 12:51  
Кстати, Вы можете оставить название EURUSDALL1.HST, соответственно в поле symbol запишите EURUSDALL
Вот - то, что нужно =)

Я об этом и спрашивал. Просто не догадался, что шапка должна совпадать. А про новое имя символа - догадался ;)
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий