Subversion Repositories Integrator Subversion

Rev

Rev 762 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 762 Rev 764
Line 4... Line 4...
4
import java.nio.file.Paths;
4
import java.nio.file.Paths;
-
 
5
import java.time.Duration;
5
import java.time.LocalDateTime;
6
import java.time.LocalDateTime;
6
import java.time.temporal.ChronoUnit;
7
import java.time.temporal.ChronoUnit;
7
import java.util.Map;
8
import java.util.Map;
8
import java.util.concurrent.ConcurrentHashMap;
9
import java.util.concurrent.ConcurrentHashMap;
9
import java.util.concurrent.TimeUnit;
10
import java.util.concurrent.TimeUnit;
Line 11... Line 12...
11
12
12
import javax.inject.Singleton;
13
import javax.inject.Singleton;
13
14
14
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.beans.factory.annotation.Autowired;
15
import org.springframework.stereotype.Service;
16
import org.springframework.stereotype.Service;
-
 
17
-
 
18
import com.itextpdf.text.log.SysoLogger;
16
19
17
import br.com.ec.core.generic.AbstractService;
20
import br.com.ec.core.generic.AbstractService;
18
import br.com.ec.core.generic.GenericRepository;
21
import br.com.ec.core.generic.GenericRepository;
19
import br.com.ec.core.util.VerificadorUtil;
-
 
20
import br.com.ec.core.validador.Validador;
22
import br.com.ec.core.validador.Validador;
21
import br.com.sl.core.ExcelProfitDataProvider;
23
import br.com.sl.core.ExcelProfitDataProvider;
-
 
24
import br.com.sl.core.ExcelProfitTempoRealPorSegundoProvider;
22
import br.com.sl.core.ProfitDataProvider;
25
import br.com.sl.core.ProfitDataProvider;
23
import br.com.sl.domain.dto.RoboDTO;
26
import br.com.sl.domain.dto.RoboDTO;
24
import br.com.sl.domain.dto.robo.CandleState;
27
import br.com.sl.domain.dto.robo.CandleState;
25
import br.com.sl.domain.dto.robo.ProfitTick;
28
import br.com.sl.domain.dto.robo.ProfitTick;
26
import br.com.sl.domain.service.CandleService;
29
import br.com.sl.domain.service.CandleService;
Line 67... Line 70...
67
        public void iniciarColetor1Minuto() {
70
        public void iniciarColetor1Minuto() {
68
                RoboDTO roboDTO = new RoboDTO();
71
                RoboDTO roboDTO = new RoboDTO();
69
                roboDTO.setRodando(true);
72
                roboDTO.setRodando(true);
70
                setRoboDTO(roboDTO);
73
                setRoboDTO(roboDTO);
71
               
74
               
72
                this.profitDataProvider = new ExcelProfitDataProvider(Paths.get(EXCEL_PATH), EXCEL_SHEET);
-
 
-
 
75
                this.profitDataProvider = new ExcelProfitTempoRealPorSegundoProvider(Paths.get(EXCEL_PATH), EXCEL_SHEET);
73
        if (!rodando.compareAndSet(false, true)) {
76
        if (!rodando.compareAndSet(false, true)) {
74
            // já está rodando
77
            // já está rodando
75
            return;
78
            return;
76
        }
79
        }
77
80
Line 79... Line 82...
79
        t.setDaemon(true);
82
        t.setDaemon(true);
80
        t.start();
83
        t.start();
81
    }
84
    }
82
       
85
       
83
        private void loopColetor() {
86
        private void loopColetor() {
-
 
87
                System.out.println("INICIANDO COLETOR DE DADOS...");
-
 
88
                getRoboDTO().setObservacaoRobo("INICIANDO COLETOR DE DADOS...");
-
 
89
               
-
 
90
                /*
-
 
91
                try {
-
 
92
                        // INICIA NO PRIMEIRO SEGUNDO DO PRÓXIMO MINUTO HH:mm:01
-
 
93
                        LocalDateTime agora = LocalDateTime.now();
-
 
94
                        LocalDateTime proximoMinuto = agora
-
 
95
                                        .truncatedTo(ChronoUnit.MINUTES)
-
 
96
                                        .plusMinutes(1)
-
 
97
                                        .plusSeconds(1);
-
 
98
                       
-
 
99
                        long millisAteProximaExecucao = Duration.between(agora, proximoMinuto).toMillis();
-
 
100
                        if (millisAteProximaExecucao > 0) {
-
 
101
                                System.out.println("AGUARDANDO PARA INICIAR NO PRÓXIMO MINUTO");
-
 
102
                                getRoboDTO().setObservacaoRobo("AGUARDANDO PARA INICIAR NO PRÓXIMO MINUTO");
-
 
103
                                Thread.sleep(millisAteProximaExecucao);
-
 
104
                        }
-
 
105
                       
-
 
106
                } catch (InterruptedException e) {
-
 
107
                        // TODO Auto-generated catch block
-
 
108
                        e.printStackTrace();
-
 
109
                }
-
 
110
                */
-
 
111
               
-
 
112
                System.out.println("INICIANDO CAPTURA!");
-
 
113
                getRoboDTO().setObservacaoRobo("INICIANDO CAPTURA!");
-
 
114
               
84
        while (rodando.get()) {
115
        while (rodando.get()) {
85
            try {
116
            try {
86
                // Lê ticks atuais de TODOS os ativos (snapshot)
117
                // Lê ticks atuais de TODOS os ativos (snapshot)
87
                Map<String, ProfitTick> ticks = profitDataProvider.readCurrentTicks();
118
                Map<String, ProfitTick> ticks = profitDataProvider.readCurrentTicks();
88
119
89
                // Atualiza estado de cada ativo
120
                // Atualiza estado de cada ativo
90
                for (Map.Entry<String, ProfitTick> entry : ticks.entrySet()) {
121
                for (Map.Entry<String, ProfitTick> entry : ticks.entrySet()) {
91
                    String symbol = entry.getKey();
122
                    String symbol = entry.getKey();
92
                    ProfitTick tick = entry.getValue();
123
                    ProfitTick tick = entry.getValue();
93
-
 
94
                    processarTick(symbol, tick);
124
                    processarTick(symbol, tick);
95
                }
125
                }
96
126
97
                // Espera 1 segundo antes da próxima leitura
127
                // Espera 1 segundo antes da próxima leitura
98
//                TimeUnit.SECONDS.sleep(1);
-
 
99
-
 
-
 
128
                TimeUnit.SECONDS.sleep(1);
100
            } catch (Exception e) {
129
            } catch (Exception e) {
101
                e.printStackTrace();
130
                e.printStackTrace();
102
                try {
131
                try {
103
                    TimeUnit.SECONDS.sleep(1);
132
                    TimeUnit.SECONDS.sleep(1);
104
                } catch (InterruptedException ex) {
133
                } catch (InterruptedException ex) {
105
                    Thread.currentThread().interrupt();
134
                    Thread.currentThread().interrupt();
106
                }
135
                }
107
            }
136
            }
108
        }
137
        }
-
 
138
        System.out.println("CAPTURA FINALIZADA!");
-
 
139
        getRoboDTO().setObservacaoRobo("CAPTURA FINALIZADA!");
109
    }
140
    }
110
141
111
        private void processarTick(String ativo, ProfitTick tick) {
142
        private void processarTick(String ativo, ProfitTick tick) {
112
        CandleState situacaoCandle = estados.get(ativo);
143
        CandleState situacaoCandle = estados.get(ativo);
113
        LocalDateTime tickTime = tick.getDateTime();
144
        LocalDateTime tickTime = tick.getDateTime();
Line 118... Line 149...
118
            return;
149
            return;
119
        }
150
        }
120
151
121
        LocalDateTime minutoTick = tickTime.truncatedTo(ChronoUnit.MINUTES);
152
        LocalDateTime minutoTick = tickTime.truncatedTo(ChronoUnit.MINUTES);
122
        BigDecimal preco = tick.getPrice();
153
        BigDecimal preco = tick.getPrice();
-
 
154
       
-
 
155
        System.out.println("CAPTURANDO: " + preco + " [" + tickTime + "]");
123
156
124
        if (situacaoCandle == null) {
157
        if (situacaoCandle == null) {
125
            // Primeiro tick desse ativo
158
            // Primeiro tick desse ativo
126
                situacaoCandle = new CandleState(minutoTick, preco, tickTime);
159
                situacaoCandle = new CandleState(minutoTick, preco, tickTime);
127
            estados.put(ativo, situacaoCandle);
160
            estados.put(ativo, situacaoCandle);
128
            return;
161
            return;
129
        }
162
        }
130
163
131
        // Se o minuto mudou → fecha candle anterior e salva no banco
164
        // Se o minuto mudou → fecha candle anterior e salva no banco
132
        if (!minutoTick.equals(situacaoCandle.getMinutoAtual())) {
165
        if (!minutoTick.equals(situacaoCandle.getMinutoAtual())) {
133
               
-
 
134
               
-
 
135
            LocalDateTime inicioCandle = situacaoCandle.getMinutoAtual();
166
            LocalDateTime inicioCandle = situacaoCandle.getMinutoAtual();
136
            LocalDateTime fimCandle = inicioCandle.plusMinutes(1);
167
            LocalDateTime fimCandle = inicioCandle.plusMinutes(1);
137
168
138
            candleService.cadastrar(ativo, inicioCandle, fimCandle, situacaoCandle);
169
            candleService.cadastrar(ativo, inicioCandle, fimCandle, situacaoCandle);
139
170
140
            // Inicia o próximo candle (novo minuto) com o tick atual
171
            // Inicia o próximo candle (novo minuto) com o tick atual
141
            situacaoCandle = new CandleState(minutoTick, preco, tickTime);
172
            situacaoCandle = new CandleState(minutoTick, preco, tickTime);
142
        } else {
173
        } else {
-
 
174
                System.out.println("PREÇO: " + preco + " [" + tickTime + "]");
-
 
175
               
143
            // Ainda dentro do mesmo minuto → atualiza OHLC
176
            // Ainda dentro do mesmo minuto → atualiza OHLC
144
            if (preco.compareTo(situacaoCandle.getMaxima()) > 0) {
177
            if (preco.compareTo(situacaoCandle.getMaxima()) > 0) {
145
                situacaoCandle.setMaxima(preco);
178
                situacaoCandle.setMaxima(preco);
146
            }
179
            }
147
            if (preco.compareTo(situacaoCandle.getMinima()) < 0) {
180
            if (preco.compareTo(situacaoCandle.getMinima()) < 0) {