public void criaOrdens() { if (api.saldo.saldoBRL > 0 || api.saldo.saldoBTC > 0) { TickerBitstamp bitstamp = api.obterTickerBitstamp(); decimal dolar = api.obterCotacaoDolar(); decimal precoBitstamp = Convert.ToDecimal(bitstamp.last); OrderList orderList = null; decimal precoCompra = ((precoBitstamp * api.parametros.spreadCompra / 100) + precoBitstamp) * dolar; if (api.saldo.saldoBRL > api.parametros.quantidadeOrdem * precoCompra) { orderList = api.criarOrdemCompra(api.parametros.quantidadeOrdem, precoCompra); foreach (Ordem ordem in orderList.oReturn) { api.imprimirOrdem("Nova ordem", ordem); ListaOrdem.Add(ordem); } } if (api.saldo.saldoBTC > api.parametros.quantidadeOrdem) { decimal precoVenda = ((precoBitstamp * api.parametros.spreadVenda / 100) + precoBitstamp) * dolar; orderList = api.criarOrdemVenda(api.parametros.quantidadeOrdem, precoVenda); foreach (Ordem ordem in orderList.oReturn) { api.imprimirOrdem("Nova ordem", ordem); ListaOrdem.Add(ordem); } } } }
public void monitorarArbitragem() { //Se preço variar em 0.1% cancela ordens e cria outra TickerBitstamp bitstamp = api.obterTickerBitstamp(); decimal dolar = api.obterCotacaoDolar(); decimal precoBitstamp = Convert.ToDecimal(bitstamp.last); bool temOC = false; bool temOV = false; popularListaOrdens(); Console.WriteLine("Inicio monitorando ordens Arbitragem: " + ListaOrdem.oReturn.Count); for (int i = ListaOrdem.oReturn.Count - 1; i >= 0; --i) { Ordem ordem = ListaOrdem.oReturn[i]; api.imprimirOrdem("", ordem); if (ordem.action == Constantes.TIPO_ORDEM_COMPRA) { temOC = true; decimal precoCompraBRL = obterPrecoCompraBRL(); decimal precoOrdemAtual = Convert.ToDecimal(ordem.price); decimal limitePrecoCompraPermitido = (precoCompraBRL * 0.1M / 100) + precoCompraBRL; if (precoOrdemAtual > limitePrecoCompraPermitido) { deletarOrdem(ordem, i); criarOrdemResidualNovoPreco(ordem, obterPrecoCompraBRL()); } } else if (ordem.action == Constantes.TIPO_ORDEM_VENDA) { temOV = true; decimal precoVendaBRL = obterPrecoVendaBRL(); decimal precoOrdemAtual = Convert.ToDecimal(ordem.price); decimal limitePrecoVendaPermitido = precoVendaBRL - (precoVendaBRL * 0.1M / 100); if (precoOrdemAtual < limitePrecoVendaPermitido) { deletarOrdem(ordem, i); criarOrdemResidualNovoPreco(ordem, obterPrecoVendaBRL()); } } } if (!temOC) { temOC = false; criarOrdemCompraArbitragem(); } if (!temOV) { temOV = false; criarOrdemVendaArbitragem(); } Console.WriteLine("Fim do ciclo arbitragem, qtd ordens :" + ListaOrdem.oReturn.Count); System.Threading.Thread.Sleep(3000); monitorarArbitragem(); }
private void tratarOrdemDolar(ref bool criarOCDolar, ref bool criarOVDolar, Ordem ordemAtualizada, int i) { if (ordemAtualizada.action == Constantes.TIPO_ORDEM_COMPRA) { criarOCDolar = false; } else if (ordemAtualizada.action == Constantes.TIPO_ORDEM_VENDA) { criarOVDolar = false; } api.imprimirOrdem("Ordem dolar encontrada", ordemAtualizada); if (ordemAtualizada.status.ToUpper().Trim() == Constantes.STATUS_ORDEM_CANCELADA) { removerOrdem(ordemAtualizada, i); criarOrdemDolarDoMesmoTipo(ordemAtualizada); } else if (ordemAtualizada.status.ToUpper().Trim() == Constantes.STATUS_ORDEM_EXECUTADA) { removerOrdem(ordemAtualizada, i); criarOrdemDolarDoMesmoTipo(ordemAtualizada); criarOrdemInversa(ordemAtualizada); api.atualizarSaldoOrdemExecutada(ordemAtualizada); } else if (ordemAtualizada.status.ToUpper().Trim() == Constantes.STATUS_ORDEM_PENDENTE && Convert.ToDecimal(ordemAtualizada.executedAmount) > 0) { cancelarOrdem(ordemAtualizada, i); criarOrdemDolarDoMesmoTipo(ordemAtualizada); //Criar nova ordem dolar cheia do mesmo tipo criarOrdemInversaResidual(ordemAtualizada); //criar ordem inversa de trade api.atualizarSaldoOrdemExecutada(ordemAtualizada); } else { ajustarPrecoDolar(ordemAtualizada, i); } }