Здравчтвуйте. Если вам не трудно, то расскажите пожалуйста о структуре (формате) файлов *.hst
Очень нужно.
Вопрос по формату файла
-
- Сообщения: 2
- Зарегистрирован: Чт дек 06, 2007 8:06 am
- Terranin
- Site Admin
- Сообщения: 846
- Зарегистрирован: Вс июл 23, 2006 12:01 pm
Re: Вопрос по формату файла
Пример процедуры чтения из hst формата МТ4 (под Delphi):ZerroCool писал(а):Здравчтвуйте. Если вам не трудно, то расскажите пожалуйста о структуре (формате) файлов *.hst
Очень нужно.
Код: Выделить всё
{-----Load quotations from mt4 hst file--------------------------------------}
procedure TBarsList.LoadFromHst(FileName: string; UpdateProc: TLoadProgressProc = nil);
var
f: file;
dt: integer;
open, high, low, close, volume: double;
DateTime: TDateTime;
begin
Clear;
// load data from hst file
AssignFile(f, FileName);
try
reset(f, 1);
try
seek(f, $94);
while not(eof(f)) do
try
BlockRead(f, dt, sizeof(dt));
BlockRead(f, open, sizeof(open));
BlockRead(f, low, sizeof(low));
BlockRead(f, high, sizeof(high));
BlockRead(f, close, sizeof(close));
BlockRead(f, volume, sizeof(volume));
DateTime := 25569 + (dt div (60*60*24)) + (dt mod (60*60*24))/(60*60*24);
Add(TSingleBar.create(DateTime, open, high, low, close, volume));
if assigned(UpdateProc) then
UpdateProc(ls_Update, '', count);
except
//
end;
finally
CloseFile(f);
end;
except
clear;
end;
end;
Asta la vista
Mike
Mike
-
- Сообщения: 2
- Зарегистрирован: Чт дек 06, 2007 8:06 am
Спасибо. Но вчера сам нашёл описание формата. И сделал немного по другому. Вот только интересно какой из вариантов работает быстрее.
Код: Выделить всё
unit HstStruct;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, DateUtils, Grids, ComCtrls;
type
HistoryHeader = Record
version : integer;
copyright : Array[1..64] of char;
symbol : Array[1..12] of char;
period : Integer;
digits : Integer;
timesign : Integer;
last_sync : Integer;
unused : Array[1..13] of Integer;
End;
RateInfo = packed record
ctm : Integer;
open : Real;
low : Real;
high : Real;
close : Real;
vol : Real;
end; //
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
const
FileName = 'EURUSD1.hst';
Var
FileHST : TFileStream;
HeaderHST : HistoryHeader;
Rate : RateInfo;
coprt : String;
smb : String;
UnU : String;
resstr : String;
timeform : String;
i, : Integer;
Tth : Tthread;
begin
try
FileHST := TFileStream.create(FileName, fmOpenRead);
FileHST.Read(HeaderHST, Sizeof(HeaderHST));
coprt :=''; smb := ''; UnU := ''; resstr := '';
For i := 1 to 64 do coprt := coprt + HeaderHST.copyright[i];
For i := 1 to 12 do smb := smb + HeaderHST.symbol[i];
For i := 1 to 13 do UnU := UnU + IntToStr(HeaderHST.unused[i])+' ';
i := Sizeof(HeaderHST);
FileHST.seek(i,soFromBeginning);
rowIndex := 1;
While i< FileHST.Size do
Begin
StringGrid1.RowCount := rowIndex;
FileHST.Read(Rate, Sizeof(Rate));
timeform := TimeToStr(UnixToDateTime(Rate.ctm));
inc(i,Sizeof(Rate));
FileHST.seek(i,soFromBeginning);
End;
FileHST.free;
except
ShowMessage('Не удалось открыть файл.');
end;
end;
end.