package br.com.sl.domain.model;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import org.hibernate.annotations.ForeignKey;
import br.com.ec.core.interfaces.Alterar;
import br.com.ec.core.interfaces.Cadastrar;
import br.com.ec.core.util.DataUtils;
import br.com.ec.core.util.VerificadorUtil;
import br.com.kronus.core.Timeframe;
import br.com.sl.domain.dto.robo.CandleState;
import br.com.sl.domain.model.tipos.TipoPeriodoCandle;
import br.com.sl.domain.util.BigDecimalUtils;
@
Entity
@Table
(name=
"slp_candle", schema=
"sc_slp")
public class Candle
implements Serializable {
private static final long serialVersionUID = 1L
;
private Long sequencial
;
private Integer contadorCandle
;
private Ativo ativo
;
private Date dataHora
;
private BigDecimal abertura
;
private BigDecimal maxima
;
private BigDecimal minima
;
private BigDecimal fechamento
;
private BigDecimal volume
;
private String periodo
;
private String nomeAtivo
;
private LocalDateTime dataHoraTime
;
private Timeframe periodoTimeFramde
;
private Boolean candleAnalisado =
false;
public Candle
() {}
public Candle
(Ativo ativo, LocalDateTime fimCandle, CandleState situacaoCandle,
String periodoCandle
) {
this.
ativo = ativo
;
this.
dataHora =
Date.
from(situacaoCandle.
getLastTickTime().
atZone(ZoneId.
systemDefault()).
toInstant());
this.
abertura = situacaoCandle.
getAbertura();
this.
maxima = situacaoCandle.
getMaxima();
this.
minima = situacaoCandle.
getMinima();
this.
fechamento = situacaoCandle.
getFechamento();
this.
periodo = periodoCandle
;
}
public Candle
(Integer contador,
String ativoDescricao, LocalDateTime time,
BigDecimal abertura,
BigDecimal topo,
BigDecimal fundo,
BigDecimal fechamento,
String periodoCandle
) {
this.
contadorCandle = contador
;
this.
nomeAtivo = ativoDescricao
;
this.
dataHora =
Date.
from(time.
atZone(ZoneId.
systemDefault()).
toInstant());
this.
abertura = abertura
;
this.
maxima = topo
;
this.
minima = fundo
;
this.
fechamento = fechamento
;
this.
periodo = periodoCandle
;
}
@Id
@SequenceGenerator
(name =
"sq_candle")
@GeneratedValue
(strategy = GenerationType.
IDENTITY)
@Column
(name=
"seq_candle", nullable=
false)
public Long getSequencial
() {
return sequencial
;
}
public void setSequencial
(Long sequencial
) {
this.
sequencial = sequencial
;
}
@ManyToOne
@ForeignKey
(name =
"fk_candleativo_candle")
@JoinColumn
(name=
"seq_ativo", referencedColumnName=
"seq_ativo")
public Ativo getAtivo
() {
return ativo
;
}
public void setAtivo
(Ativo ativo
) {
this.
ativo = ativo
;
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Contador", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"val_contador", nullable=
false)
public Integer getContadorCandle
() {
return contadorCandle
;
}
public void setContadorCandle
(Integer contadorCandle
) {
this.
contadorCandle = contadorCandle
;
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Data e hora", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"dth_datahora", nullable=
false)
public Date getDataHora
() {
return dataHora
;
}
public void setDataHora
(Date dataHora
) {
this.
dataHora = dataHora
;
}
@Transient
public String getDataHoraFormatada
() {
return VerificadorUtil.
naoEstaNulo(getDataHora
())? DataUtils.
converterDataComHorarioParaString(getDataHora
()) :
"";
}
@Transient
public String getHoraFormatada
() {
return VerificadorUtil.
naoEstaNulo(getDataHora
())? DataUtils.
converterDataParaStringNoFormato(getDataHora
(),
"HH:mm:ss") :
"";
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Preço de abertura", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"val_abertura", nullable=
false)
public BigDecimal getAbertura
() {
return abertura
;
}
public void setAbertura
(BigDecimal abertura
) {
this.
abertura = abertura
;
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Preço da máxima", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"val_maxima", nullable=
false)
public BigDecimal getMaxima
() {
return maxima
;
}
public void setMaxima
(BigDecimal maxima
) {
this.
maxima = maxima
;
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Preço da mínima", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"val_minima", nullable=
false)
public BigDecimal getMinima
() {
return minima
;
}
public void setMinima
(BigDecimal minima
) {
this.
minima = minima
;
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Preço de fechamento", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"val_fechamento", nullable=
false)
public BigDecimal getFechamento
() {
return fechamento
;
}
public void setFechamento
(BigDecimal fechamento
) {
this.
fechamento = fechamento
;
}
@Column
(name=
"val_volume", nullable=
true)
public BigDecimal getVolume
() {
return volume
;
}
public void setVolume
(BigDecimal volume
) {
this.
volume = volume
;
}
@NotNull
(message =
"Parâmetro obrigatório não preenchido: Tipo do período do candle", groups =
{Cadastrar.
class, Alterar.
class})
@Column
(name=
"tip_periodo", nullable=
false)
public String getPeriodo
() {
return periodo
;
}
public void setPeriodo
(String periodo
) {
this.
periodo = periodo
;
}
@Transient
public String getTipoPeriodoCandle
() {
return VerificadorUtil.
naoEstaNulo(getPeriodo
())? TipoPeriodoCandle.
parse(getPeriodo
()).
getValor() :
"";
}
@Transient
public LocalDateTime getDataHoraTime
() {
return dataHoraTime
;
}
public void setDataHoraTime
(LocalDateTime dataHoraTime
) {
this.
dataHoraTime = dataHoraTime
;
}
@Transient
public Timeframe getPeriodoTimeFramde
() {
return periodoTimeFramde
;
}
public void setPeriodoTimeFramde
(Timeframe periodoTimeFramde
) {
this.
periodoTimeFramde = periodoTimeFramde
;
}
@Transient
public String getNomeAtivo
() {
return nomeAtivo
;
}
public void setNomeAtivo
(String nomeAtivo
) {
this.
nomeAtivo = nomeAtivo
;
}
@Transient
public Boolean getCandleAnalisado
() {
return candleAnalisado
;
}
public void setCandleAnalisado
(Boolean candleAnalisado
) {
this.
candleAnalisado = candleAnalisado
;
}
@
Override
public int hashCode
() {
final int prime =
31;
int result =
1;
result = prime
* result
+
((sequencial ==
null) ? 0 : sequencial.
hashCode());
return result
;
}
@
Override
public boolean equals
(Object obj
) {
if (this == obj
)
return true;
if (obj ==
null)
return false;
if (getClass
() != obj.
getClass())
return false;
Candle other =
(Candle
) obj
;
if (sequencial ==
null) {
if (other.
sequencial !=
null)
return false;
} else if (!sequencial.
equals(other.
sequencial))
return false;
return true;
}
@Transient
public boolean isCandleComprador
() {
return BigDecimalUtils.
ehMaiorQue(fechamento, abertura
);
}
@Transient
public boolean isCandleVendedor
() {
return BigDecimalUtils.
ehMenorQue(fechamento, abertura
);
}
@Transient
public BigDecimal getCorpoAlto
() {
// return Math.max(abertura.doubleValue(), fechamento.doubleValue());
return BigDecimalUtils.
maximo(abertura, fechamento
);
}
@Transient
public BigDecimal getCorpoBaixo
() {
// return Math.min(abertura.doubleValue(), fechamento.doubleValue());
return BigDecimalUtils.
minimo(abertura, fechamento
);
}
}