User History File

 
Мне давно хотелось поразбираться с рынком на уровне тикового графика.
Раньше этого нельзя было сделать даже в реальном времени. Но теперь,
когда есть возможность записать файл истории и затем открывать его
автономно, вроде бы это можно сделать.

Я переписал скрипт Period_Converter как индикатор и записываю историю
тиков так, что каждый тик - это как бы минутный бар у которого
open=high=low=close.

Писать-то пишу, но открыть этот файл автономно не могу, не открывается.
И его иконка в списке файлов истории тоже не нормальная: красная и разорванная. Что это значит ?

Может есть какие-то подробности по которым это сделать в принципе
невозможно ?
 
возможно Вы не соблюли соглашение о наименованиях исторических файлов
SSSSSSPP.HST
где SSSSSS-символ, который должен совпадать с полем symbol в заголовке файла
то же касается и периода PP
 
Slawa,

Спасибо, действительно это соглашение я нарушил. Исправил, посмотрю.
И еще вопросы.

Использовать в качестве наименования "EURUSD1.hst" я не могу,
поэтому назову "EURUSD2.hst". То есть "как бы" 2-минутный график.

Накладывает ли это какие-то ограничения, требования на то время,
которое будет писаться в поле Time ?

Можно ли туда писать реальное время тика ?

Обязательно ли чтобы в Time были записаны начала минут с шагом 2min
(в соответствии с заголовком и наименованием) ?
 
да, можно. время может быть произвольным. мы у себя таким образом строили индикатор постоянного объёма.
кстати, мне кажется, что лучше ставить реальные ohlc на момент тика. так Вы сможете увидеть бар в развитии. а если Вам нужен тиковый график то Вы всегда сможете выбрать "линию по клозам"
 
Slawa,
Спасибо, это то, что нужно.
 
Slawa,

При записи собственного файла истории столкнулся с проблемой:
невозможно дописать файл. Каждый раз он пишется заново.
После открытия я использовал такую конструкцию:
         last_fpos=FileSize(handle);
         if (last_fpos > 148) last_fpos=FileTell(handle);
         else
         {     //---- History header
            FileWriteInteger(handle, version, LONG_VALUE);
            FileWriteString (handle, c_copyright, 64);
            FileWriteString (handle, c_symbol, 12);
            FileWriteInteger(handle, i_period, LONG_VALUE);
            FileWriteInteger(handle, i_digits, LONG_VALUE);
            FileWriteInteger(handle, 0, LONG_VALUE);
            FileWriteInteger(handle, 0, LONG_VALUE);
            FileWriteArray  (handle, i_unused, 0, 13);
         }


Похоже, что функция FileOpenHistory() открывает файл каждый раз
как новый. Старый при этом уничтожается.

 
чтобы дописывать файл необходимо, во-первых открыть его на чтение-запись, а не просто на запись. во-вторых, сразу после открытия файла переместить файловый указатель на конец файла
FileSeek(header, 0, SEEK_END);
 
чтобы дописывать файл необходимо, во-первых открыть его на чтение-запись, а не просто на запись. во-вторых, сразу после открытия файла переместить файловый указатель на конец файла


Спасибо, понял.
С чего это меня на FileTell() занесло ? :-(
 
Приходится возвращаться к теме.
Исправил ошибки, история записыватся. Но...

1. Когда запись начинается с нуля, то есть даже файла нет, тогда все в порядке.
Но если файл уже есть и какая-то история записана, возникают проблемы.
Файл все-равно пишется, но когда открываешь его автономно, то читается он
только до определенного места. Никаких сообщений о нарушениях в структуре
файла, и вообще никаких сообщений об ошибках не возникает.

2. Такие сбои возникают либо когда остановился, а потом возобновился поток
данных, либо если эксперт остался присоединенным к графику при завершении
прошлой сессии и, соответственно, он начал работу сразу при запуске MT4.
К сожалению такие сбои случаются не всегда, иногда все пишется правильно.
А вот когда это происходит мне установить не удалось, нет средств контроля.

3. Оказывается MT4 допускает открытие в автономном режиме файла истории
который в данный момент используется экспертом для записи. Правильно ли
это ? Если так и было предусмотрено, то должны ли подгружаться на график
пополнения файла, когда они сбрасываются на диск ?

Посоветуйте что-нибудь. Могу представить код.
 
Slawa,
дайте, пожалуйста, ответ на мой пост.
На всякий случай код из эксперта:
int start()
{ ............
         handle = FileOpenHistory(c_filename, FILE_BIN|FILE_READ|FILE_WRITE);
         if (handle < 0) return(-1);
         FileSeek(handle,0,SEEK_END);
         last_fpos=FileTell(handle);
         if (last_fpos == 0)
         {     //---- History header
            FileWriteInteger(handle, version, LONG_VALUE);
            FileWriteString (handle, c_copyright, 64);
            FileWriteString (handle, c_symbol, 12);
            FileWriteInteger(handle, i_period, LONG_VALUE);
            FileWriteInteger(handle, i_digits, LONG_VALUE);
            FileWriteInteger(handle, 0, LONG_VALUE);       //timesign
            FileWriteInteger(handle, 0, LONG_VALUE);       //last_sync
            FileWriteArray  (handle, i_unused, 0, 13);
         }
   i_volume = 1.0;
   i_time   = CurTime();
   lastBid  = Bid;

   FileWriteInteger(handle, i_time, LONG_VALUE);      // Time
   FileWriteDouble (handle, lastBid, DOUBLE_VALUE);   // Open
   FileWriteDouble (handle, lastBid, DOUBLE_VALUE);   // Low
   FileWriteDouble (handle, lastBid, DOUBLE_VALUE);   // High
   FileWriteDouble (handle, lastBid, DOUBLE_VALUE);   // Close
   FileWriteDouble (handle, i_volume, DOUBLE_VALUE);  // Volume
.................
}
 
2Yurixx
А где закрытые файла? Никто и ничего не может вам гарантировать до тех пор пока файл не закрыт.