internal static ResultCotacoes ObterCotacoes(DateTime dataAtual, int idAtivo) { while (Math.Abs(DateTime.Now.Ticks - _ultimoTickRequisicao) < IntervaloMinimo) { Thread.Sleep(10); } string url = $"https://iqoption.com/api/quote/history/v1/expirations?active_id={idAtivo}&tz_offset=0&"; url += $"date={dataAtual.Year}-{dataAtual.Month}-{dataAtual.Day}-{dataAtual.Hour}"; if (dataAtual.Minute != 0) { url += $"-{dataAtual.Minute}"; } string json = new WebClient().DownloadString(url); _ultimoTickRequisicao = DateTime.Now.Ticks; ResultCotacoes result = JsonConvert.DeserializeObject <ResultCotacoes>(json); result.result.expirations.RemoveAll(e => Regex.Match(e.datetime, @"[\d]{4}-[\d]{2}-[\d]{2} [\d]{2}:[\d]{2}:([\d]{2})").Groups[1].Value != "00"); return(result); }
private static void CargaHistorico() { Log.GravarLinha("Iniciando carga do histórico de cotações"); DateTime dataAtual = Configuracoes.DataMaxima; DateTime dataCorte = Configuracoes.DataMinima; while (dataAtual >= dataCorte) { if (!Configuracoes.IncluirOtc) { while (Cotacao.EhOtc(dataAtual)) { Log.GravarLinha("Ignorando período OTC: " + dataAtual.ToString("dd-MM-yyyy HH:mm") + " (UTC)"); dataAtual = dataAtual.AddMinutes(-1); } } string processando = $"Consultando: {dataAtual.ToString("dd-MM-yyyy")} UTC"; processando += $" - Hora: {dataAtual.ToString("HH")}"; processando += " - Minuto: "; if (dataAtual.Minute == 0) { processando += "00 ao 16"; } else { processando += dataAtual.Minute.ToString().PadLeft(2, '0'); } Log.GravarLinha(processando); foreach (int idAtivo in Configuracoes.Ativos) { Log.GravarLinha($"Ativo: {Cotacao.ConverterCotacao(idAtivo)}"); ResultCotacoes result = Api.ObterCotacoes(dataAtual, idAtivo); if (Configuracoes.ExibirLogCotacao) { List <Cotacao> cotacoes = result.result.expirations; cotacoes.Reverse(); foreach (Cotacao cotacao in cotacoes) { Log.GravarLinha($"{cotacao.datetime} - {cotacao.value}"); } } BancoDados.GravarCotacao(idAtivo, result); } dataAtual = dataAtual.Minute == 17 ? dataAtual.AddMinutes(-17) : dataAtual.AddMinutes(-1); } }
/* * CREATE TABLE COTACAO( * IDATIVO INT, * DATA DATETIME, * VALOR FLOAT) * * CREATE INDEX COTACAO_IN_01 ON COTACAO(IDATIVO) * CREATE INDEX COTACAO_IN_02 ON COTACAO(DATA) * CREATE INDEX COTACAO_IN_03 ON COTACAO(IDATIVO, DATA) */ internal static void GravarCotacao(int idAtivo, ResultCotacoes result) { List <Cotacao> cotacoes = result.result.expirations; cotacoes.Reverse(); foreach (Cotacao cotacao in cotacoes) { DateTime dataRef = DateTime.ParseExact(cotacao.datetime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); double valorCotacao = Convert.ToDouble(cotacao.value); string sql = string.Empty; if (Configuracoes.Sobreescrever) { sql += "IF EXISTS(SELECT 1 FROM COTACAO WHERE IDATIVO = @IDATIVO AND DATA = @DATA)" + Environment.NewLine; sql += '\t' + "UPDATE COTACAO SET VALOR = @VALOR WHERE IDATIVO = @IDATIVO AND DATA = @DATA" + Environment.NewLine; sql += "ELSE" + Environment.NewLine; sql += '\t' + "INSERT INTO COTACAO(IDATIVO, DATA, VALOR) VALUES(@IDATIVO, @DATA, @VALOR)"; } else { sql += "IF NOT EXISTS(SELECT 1 FROM COTACAO WHERE IDATIVO = @IDATIVO AND DATA = @DATA)" + Environment.NewLine + '\t'; sql += '\t' + "INSERT INTO COTACAO(IDATIVO, DATA, VALOR) VALUES(@IDATIVO, @DATA, @VALOR)"; } if (Configuracoes.GravarBancoDados) { Log.GravarLinha("Gravando na base"); SqlConnection conexao = new SqlConnection(Configuracoes.CadeiaConexao); SqlCommand comando = new SqlCommand(sql, conexao); comando.Parameters.AddWithValue("@IDATIVO", idAtivo); comando.Parameters.AddWithValue("@DATA", dataRef); comando.Parameters.AddWithValue("@VALOR", valorCotacao); conexao.Open(); comando.ExecuteNonQuery(); conexao.Close(); } GravarScript(sql, idAtivo, dataRef, valorCotacao); } }