Чтение файла с биржовыми котировками на Java

 
 
 
Сообщения:9
Доброго времени суток всем,
у меня вопрос, как переобразовать следующий код с Delphi на Java (чтение файла котировок *.hst) :


type

THistoryHeader = packed record
version: integer; // версия базы
copyright:array[0..63] of char; // копирайт
symbol: array[0..11] of char; // инструмент
period: integer; // период инструмента
digits: integer; // число знаков после запятой в инструменте
timesign: cardinal; // временной отпечаток создания базы
last_sync: cardinal; // время последней синхронизации
unused:array[0..12] of integer;
end;

TRateInfo = packed record
ctm: cardinal; // текущее время в секундах
open: double; /// цена открытия
low:double;// минимум
high:double;// максимум
close:double;//закрытие
vol:double;// обьем
end;


var
Form1: TForm1;
hstfile:tfilestream; // эта штука чтоб с открытием файла не заморачиваться сильно
Close1: array[0..255] of TRateInfo ;// это массив на 256 элементов в него будем читать котировки
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
header:THistoryHeader;// эта переменая куда прочитаем заголовок
i,y1,y2:integer;// эти нужны были чтоб нарисовать и посмотреть чего читали
begin
hstfile:=tfilestream.Create('EURUSD1.hst',fmShareDenyNone);// можно сказать что открываем файл
hstfile.Read(header,sizeof(header));// читаем заголовок
hstfile.Read(Close1,sizeof(Close1));// читаем 256 элементов масисвва котировок

hstfile.Free; // можно сказать что закрываем файл
end;

end.
 
 
Сообщения:158
Посмотрите свой предыдущий топик.
 
 
Сообщения:9
vps Извините, не понял, что Вы имели в виду написав "Посмотрите свой предыдущий топик."
 
 
Сообщения:158
andriyp:
vps Извините, не понял, что Вы имели в виду написав "Посмотрите свой предыдущий топик."

Вроде Вы уже задавали этот вопрос здесь. Там был ответ.
Изменен:14 окт 2016 11:38
 
 
Сообщения:9
vps большое вам спасибо, возникла небольшая проблемка - нету Nullable.jar
 
 
Сообщения:158
Это кто такую ошибку выдал? Может Вы не тот файл из guava и используете?

Upd: я брал отсюда.
Изменен:14 окт 2016 16:41
 
 
Сообщения:9
vps я перешол по ссылке, скачал файл guava-19.0 и что дальше делать ? я не знаю как его инсталить
 
 
Сообщения:158
Это зависит от IDE, в которой Вы работаете и используете ли систему сборки.
Если в Intellij IDEA и создали простой проект, то в корне проекта можно создать папку, например "libs" и скопировать туда jar-ник. После этого, в самой ide, на нём можно вызвать контекстное меню, в котором выбрать "Add as library".
 
 
Сообщения:9
vps, большое спасибо, получилось прочитать копирайт, если Вас не затруднит - покажите еще как считать котировки, еще раз - большое спасибо
 
 
Сообщения:158
Остальное делается по такому же принципу. Правда, чтение самих котировок надо делать в цикле.
Посмотрите ссылки: формат файла истории котировок; чтение файла hst.
В описании формата файла указано, сколько байт занимает каждое поле.
Время в файле записано в формате "unix timestamp" - в секундах. Если используете java 8, то для преобразования в нормальный вид можно использовать класс "java.time.Instant".
 
 
Сообщения:9
vps, спасибо, смог полностью прочитать заголовок, но есть одна проблема - дата последней синхронизации 1970-01-01T00:00:00Z? , это не верно.
Кроме того, котировки коректно считываються только один раз (в цикле), если же я хочу прочитать несколько - возникает збой, может Вы меня поправите, большое спасибо ?
вот мой код :


public class OpenRateFile {
public static void main(String[] args) {
int version;
String file = "D:/Andriy/OLD/TR/Terminal/history/UkrGasBank-MT4/EURUSD1440.hst";
try(LittleEndianDataInputStream inputStream = new LittleEndianDataInputStream(new BufferedInputStream(new FileInputStream(file))))
{
version=inputStream.readInt();
System.out.println("Version: " + version);
byte[] copyright = new byte[64];
inputStream.readFully(copyright);
System.out.println("Copyright: " + new String(copyright));
byte[] symbol = new byte[12];
inputStream.readFully(symbol);
System.out.println("Symbol: " + new String(symbol));
System.out.println("Period: " + inputStream.readInt());
System.out.println("Digit: " + inputStream.readInt());
Instant timesign = Instant.ofEpochSecond( inputStream.readInt());
System.out.println("Timesign : "+ timesign);
Instant last_sync_dt= Instant.ofEpochSecond( inputStream.readInt());
System.out.println("Last sync : "+ last_sync_dt);
System.out.println("-----------");
if (version == 401){
for(int count=0; count<1; count++){
byte[] ctm = new byte[44];
inputStream.readFully(ctm);
inputStream.readDouble();
Instant rateDate = Instant.ofEpochSecond( inputStream.readInt());
System.out.println("Date: "+ rateDate);
inputStream.readInt();
System.out.println("Open: " + inputStream.readDouble());
System.out.println("High: " + inputStream.readDouble());
System.out.println("Low: " + inputStream.readDouble());
System.out.println("Close: " + inputStream.readDouble());
System.out.println("Volume: " + inputStream.readInt());
System.out.println("-----------");
}
}
} catch (IOException e) {
e.printStackTrace();
}

}
}
Изменен:15 окт 2016 13:09
 
 
Сообщения:158
В том файле, на котором я проверял время последней синхронизации было равно нулю. Видимо у Вас тоже самое, так как (из описания класса Instant): The epoch-seconds are measured from the standard Java epoch of 1970-01-01T00:00:00Z where instants after the epoch have positive values, and earlier instants have negative values.
Можете сделать проверку на равенство нулю и если это так, то не выводить значение.
Для чтения котировок используйте другой цикл с этим методом.
Что ещё увидел:
1. при чтении заголовка не учтено, что последние 52 байта зарезервированы. Их надо как-то пропустить (смотрите документацию к классу LittleEndianDataInputStream).
2. в цикле у Вас стоит проверка на новый формат (401), а пытаетесь считать (зачем-то) сразу 44 байта, а это формат 400. Заметьте, что 44 или 60 байт - это размер ВСЕХ ПОЛЕЙ, а НЕ ОДНОГО!!!

P/S: для оформления кода используйте тег "Код", а то его не удобно смотреть.
 
 
Сообщения:9
vps, что у меня не получается, котировки вообще считывает неправильно
 
 
Сообщения:158
Покажите код.
 
 
Сообщения:9
vps, извините за опоздание, вот мой код:

package ua.javabeginner.fastjava.openRate;

/**
 * Created by user on 14.10.2016.
 */
import com.google.common.io.LittleEndianDataInputStream;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.time.Instant;


import java.time.temporal.TemporalAdjusters;
import java.util.Date;

public class OpenRateFile {
    public static void main(String[] args) {
                    System.out.println("-----------");

        int version;
        String file = "d:/tmp/EURUSD1440.hst";
        try(LittleEndianDataInputStream inputStream = new LittleEndianDataInputStream(new BufferedInputStream(new FileInputStream(file))))
        {
            version=inputStream.readInt();
            System.out.println("Version: " + version);
            byte[] copyright = new byte[64];
            inputStream.readFully(copyright);


            System.out.println("Copyright: " + new String(copyright));
            byte[] symbol = new byte[12];

            inputStream.readFully(symbol);
            System.out.println("Symbol: " + new String(symbol));

            System.out.println("Period: " + inputStream.readInt());

            System.out.println("Digit: " + inputStream.readInt());

            Instant timesign = Instant.ofEpochSecond( inputStream.readInt());
            System.out.println("Timesign : "+ timesign);

            Instant last_sync_dt= Instant.ofEpochSecond( inputStream.readInt());
            System.out.println("Last sync : "+ last_sync_dt);

            System.out.println("-----------");
            if (version == 401){
              for(int count=0; count<1; count++){
                  byte[] ctm = new byte[8];
                  Instant rateDate = Instant.ofEpochSecond( inputStream.readInt());
                  System.out.println("Date: "+ rateDate);
                //  inputStream.readInt();


                  inputStream.readDouble();
                  rateDate = Instant.ofEpochSecond(inputStream.readInt());
                  System.out.println("Date: "+ rateDate);
                  inputStream.readInt();

                  System.out.println("Open: " + inputStream.readDouble());
                  System.out.println("High: " + inputStream.readDouble());
                  System.out.println("Low: " + inputStream.readDouble());

                  System.out.println("Close: " + inputStream.readDouble());


                  System.out.println("Volume: " + inputStream.readInt());
                  System.out.println("-----------");
              }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет