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