Subversion Repositories Integrator Subversion

Rev

Rev 795 | Rev 797 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
795 blopes 1
package br.com.kronus.ibkr.history;
2
 
3
import java.io.BufferedWriter;
4
import java.nio.file.Files;
5
import java.nio.file.Path;
796 blopes 6
import java.time.Instant;
7
import java.time.ZoneId;
8
import java.time.ZonedDateTime;
9
import java.time.format.DateTimeFormatter;
795 blopes 10
import java.util.List;
11
import java.util.concurrent.CompletableFuture;
12
import java.util.concurrent.TimeUnit;
13
 
14
import com.ib.client.Bar;
15
import com.ib.client.Contract;
16
import com.ib.client.TagValue;
17
 
18
import br.com.kronus.ibkr.api.IbkrClient;
19
 
20
public class IbkrHistoricalDataService {
21
 
22
    private final IbkrClient ibkr;
796 blopes 23
 
24
    private static final DateTimeFormatter DATA = DateTimeFormatter.ofPattern("yyyy-MM-dd");
25
    private static final DateTimeFormatter HORA = DateTimeFormatter.ofPattern("HH:mm:ss");
795 blopes 26
 
27
    public IbkrHistoricalDataService(IbkrClient ibkr) {
28
        this.ibkr = ibkr;
29
    }
30
 
31
    /**
32
     * Solicita histórico para IBKR e grava tudo em CSV.
33
     *
34
     * @param contract        contrato IBKR
35
     * @param endDateTime     "" para agora ou "yyyyMMdd HH:mm:ss"
36
     * @param durationStr     "2 D", "5 D", "1 W", "1 M", etc.
37
     * @param barSizeSetting  "1 min", "5 mins", "15 mins", "1 day", etc.
38
     * @param whatToShow      "TRADES", "MIDPOINT", etc.
39
     */
40
    public void baixarHistoricoParaCsv(
41
            int reqId,
42
            Contract contract,
43
            String endDateTime,
44
            String durationStr,
45
            String barSizeSetting,
46
            String whatToShow,
47
            Path arquivoCsv
48
    ) throws Exception {
49
 
50
        if (!Files.exists(arquivoCsv.getParent())) {
51
            Files.createDirectories(arquivoCsv.getParent());
52
        }
53
 
54
        try (BufferedWriter writer = Files.newBufferedWriter(arquivoCsv,
55
                java.nio.file.StandardOpenOption.CREATE,
56
                java.nio.file.StandardOpenOption.TRUNCATE_EXISTING)) {
57
 
58
            writer.write("data;hora;open;high;low;close;volume;wap;count");
59
            writer.newLine();
60
 
61
            CompletableFuture<List<Bar>> fut = ibkr.prepararFutureHistorico(reqId);
62
 
63
            ibkr.getClient().reqHistoricalData(
64
                    reqId,
65
                    contract,
66
                    endDateTime,
67
                    durationStr,
68
                    barSizeSetting,
69
                    whatToShow,
70
                    1,
71
                    2,
72
                    false,
73
                    (List<TagValue>) null
74
            );
75
 
76
            List<Bar> bars = fut.get(60, TimeUnit.SECONDS);
77
 
796 blopes 78
            ZoneId zoneId = ZoneId.of("America/Maceio");
79
            DateTimeFormatter FMT_DATA = DateTimeFormatter.ofPattern("yyyy-MM-dd");
80
            DateTimeFormatter FMT_HORA = DateTimeFormatter.ofPattern("HH:mm:ss");
81
 
795 blopes 82
            for (Bar b : bars) {
796 blopes 83
 
84
                long time = new Long(b.time()); // agora vem algo como 1764688966523
795 blopes 85
 
796 blopes 86
                // Detecta se é segundos (10 dígitos) ou milissegundos (13 dígitos)
87
                Instant inst;
88
                if (time > 9999999999L) {
89
                    inst = Instant.ofEpochMilli(time);   // 13 dígitos = millis
90
                } else {
91
                    inst = Instant.ofEpochSecond(time);   // 10 dígitos = seconds
92
                }
795 blopes 93
 
796 blopes 94
                ZoneId zdt = ZoneId.of("America/Maceio");
95
                String dataStr = DATA.format(inst.atZone(zoneId));
96
                String horaStr = HORA.format(inst.atZone(zoneId));
97
 
795 blopes 98
                String linha = String.join(";",
796 blopes 99
                                dataStr,
795 blopes 100
                        horaStr,
101
                        String.valueOf(b.open()),
102
                        String.valueOf(b.high()),
103
                        String.valueOf(b.low()),
104
                        String.valueOf(b.close()),
105
                        String.valueOf(b.volume()),
106
                        String.valueOf(b.wap()),
107
                        String.valueOf(b.count())
108
                );
796 blopes 109
 
795 blopes 110
                writer.write(linha);
111
                writer.newLine();
112
            }
796 blopes 113
 
795 blopes 114
            writer.flush();
115
        }
116
    }
796 blopes 117
 
795 blopes 118
}