Вопрос по формату файла

Задавайте общие вопросы о функциях программы.
Ответить
Сообщение
Автор
ZerroCool
Сообщения: 2
Зарегистрирован: Чт дек 06, 2007 8:06 am

Вопрос по формату файла

#1 Сообщение ZerroCool » Чт дек 06, 2007 8:11 am

Здравчтвуйте. Если вам не трудно, то расскажите пожалуйста о структуре (формате) файлов *.hst
Очень нужно.

Аватара пользователя
Terranin
Site Admin
Сообщения: 846
Зарегистрирован: Вс июл 23, 2006 12:01 pm

Re: Вопрос по формату файла

#2 Сообщение Terranin » Чт дек 06, 2007 4:43 pm

ZerroCool писал(а):Здравчтвуйте. Если вам не трудно, то расскажите пожалуйста о структуре (формате) файлов *.hst
Очень нужно.
Пример процедуры чтения из hst формата МТ4 (под Delphi):

Код: Выделить всё

{-----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

ZerroCool
Сообщения: 2
Зарегистрирован: Чт дек 06, 2007 8:06 am

#3 Сообщение ZerroCool » Пт дек 07, 2007 6:19 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.


Ответить