/// <summary> /// attiva la vendita del ordine di acquisto effettuato /// </summary> /// <param name="regola"></param> /// <param name="order"></param> /// <param name="token"></param> /// <returns></returns> public async void VerificaVenditaTask(RulesBuySell regola, CompletedOrder order, CancellationToken token = default(CancellationToken)) { while (!token.IsCancellationRequested) { if (this.VerificaVendita(regola, order)) { try { using (UnitOfWork unitOfWork = new UnitOfWork()) { var item = unitOfWork.OrdiniDelBotRepository.Find(a => a.Exchange == order.Exchange).FirstOrDefault(); unitOfWork.OrdiniDelBotRepository.Delete(item); unitOfWork.Commit(); } } catch (Exception ex) { Log(ex); } //se ha venduto termina il task break; } try { await Task.Delay(TimeSpan.FromSeconds(10), token); } catch (TaskCanceledException) { break; } } }
private bool VerificaVendita(RulesBuySell regola, CompletedOrder order) { try { var valoreAttuale = Manager.Exchange.GetTicker(order.Exchange).Ask; Log("Il valore attuale moneta " + order.Exchange + " è di " + valoreAttuale + " BTC", LogType.ReadDataFromInternet); if (regola.VendiSeAumentaDiXPercento > 0) { if (order.PricePerUnit == 0) { order.PricePerUnit = order.Price / order.Quantity; } if (valoreAttuale > order.PricePerUnit * (regola.VendiSeAumentaDiXPercento + 100) / 100) { Log("Raggiunto aumento percentuale di " + regola.VendiSeAumentaDiXPercento + " per moneta " + order.Exchange, LogType.Sell); var orderSell = Manager.Exchange.PlaceSellOrder(order.Exchange, order.Quantity, valoreAttuale); var OrderSelList = Manager.Exchange.GetOrderHistory(order.Exchange); var orderFound = OrderSelList.Where(a => a.OrderUuid == orderSell.uuid).FirstOrDefault(); if (orderFound != null) { Log("Vendita completata dell'ordine " + orderFound.OrderUuid + " per moneta " + order.Exchange, LogType.Sell); return(true); } else { Manager.Exchange.CancelOrder(orderSell.uuid); return(false); } } } if (regola.VendiSeScendeDiXPercento > 0) { if (valoreAttuale > order.PricePerUnit * (100 - regola.VendiSeScendeDiXPercento) / 100) { Log("Raggiunto aumento percentuale di " + regola.VendiSeScendeDiXPercento + " per moneta " + order.Exchange, LogType.Sell); var orderSell = Manager.Exchange.PlaceSellOrder(order.Exchange, order.Quantity, valoreAttuale); var OrderSelList = Manager.Exchange.GetOrderHistory(order.Exchange); var orderFound = OrderSelList.Where(a => a.OrderUuid == orderSell.uuid).FirstOrDefault(); if (orderFound != null) { Log("Vendita completata dell'ordine " + orderFound.OrderUuid + " per moneta " + order.Exchange, LogType.Sell); return(true); } else { Manager.Exchange.CancelOrder(orderSell.uuid); return(false); } } } } catch (Exception ex) { Log(ex); } return(false); }
private bool FaiOrdineAcqusto(string moneta, RulesBuySell regola) { try { Log("Tentativo di acquisto " + moneta, LogType.Affermation); var btcAvaliable = Manager.Exchange.GetBalance("BTC").Available; if (btcAvaliable < 0.0005m) { Log("Fondi insufficienti per comprare " + moneta, LogType.Warning); return(false); } Log(string.Format("Disponibili {0} BTC", btcAvaliable) , LogType.Information); var valoreAttuale = Manager.Exchange.GetTicker(moneta).Last; Log("Il valore attuale moneta " + moneta + " è di " + valoreAttuale + " BTC", LogType.ReadDataFromInternet); var importobtcAcq = btcAvaliable; if (regola.AcquistaImportoMaxBtc != 0) { if (btcAvaliable > regola.AcquistaImportoMaxBtc) { importobtcAcq = regola.AcquistaImportoMaxBtc; Log(string.Format("Verrà acquistata la moneta " + moneta + " per una spesa massima di {0} BTC", importobtcAcq) , LogType.ReadDataFromInternet); } } var qta = Math.Round(importobtcAcq / valoreAttuale, 4); var prezzo = valoreAttuale; if (regola.AcquistaAlValoreDiLastPiuPercentuale == 0) { prezzo = prezzo * (100 + regola.AcquistaAlValoreDiLastPiuPercentuale) / 100; } Log(string.Format("Emissione ordine acquisto di moneta {0} al varore {1} rispetto all'attuale di {2} per la qta di {3}", moneta, valoreAttuale, qta, prezzo), LogType.Buy); var ordine = Manager.Exchange.PlaceBuyOrder(moneta, qta, prezzo); if (ordine.uuid != null) { Log("Ordine creato con successo " + ordine.uuid.ToString(), LogType.Buy); using (UnitOfWork unitOfWork = new UnitOfWork()) { unitOfWork.OrdiniDelBotRepository.Add(new OrdiniDelBot() { Uuid = ordine.uuid, Exchange = moneta }); unitOfWork.Commit(); Manager.AggiornaOrdini(); var ordineChiuso = Manager.Db.OrderHistory.Where(a => a.OrderUuid == ordine.uuid).ToList(); if (ordineChiuso != null) { //se è stata acquistato va alla vendita Vendita.Instance.Attiva(false); return(true); } else { Manager.Exchange.CancelOrder(ordine.uuid); return(false); } } } } catch (Exception ex) { Log(ex); } return(false); }