public CargoRun(ref MarketData data, double capital, double minVolume, double maxVolume, bool safeOnly) { TypeVolume = data.TypeVolume; Calculate(ref data, capital, minVolume, maxVolume, safeOnly); }
MarketDataOrder GetSellOrder(ref MarketData data, double minVolume = 1, bool safeOnly = false) { var trueMin = minVolume * data.TypeVolume; try { var sellOrders = from o in data.Orders from s in StaticDB.Instance.SolarSystems where o.Bid == false && s.solarSystemID == o.SolarSystemID && s.security >= (safeOnly ? 0.5 : -100.0) && o.VolumeRemaining >= trueMin select o; if (sellOrders.Count() == 0) return null; var sellOrder = sellOrders.FirstOrDefault(); foreach (var order in sellOrders) { if (order.Price < sellOrder.Price) sellOrder = order; } return sellOrder; } finally { } }
void Calculate(ref MarketData data, double capital, double minVolume, double maxVolume, bool safeOnly) { var trueMax = maxVolume / TypeVolume; var trueMin = minVolume / TypeVolume; var sellOrders = (from o in data.Orders from s in StaticDB.Instance.SolarSystems where o.Bid == false && s.solarSystemID == o.SolarSystemID && s.security >= (safeOnly ? 0.5 : -100.0) && o.VolumeRemaining >= trueMin select o); var buyOrders = from o in data.Orders from s in StaticDB.Instance.SolarSystems where o.Bid == true && s.solarSystemID == o.SolarSystemID && s.security >= (safeOnly ? 0.5 : -100.0) && o.VolumeRemaining >= trueMin select o; var profitable = (from s in sellOrders from b in buyOrders where s.Price < b.Price let sellVolume = s.VolumeRemaining >= trueMax ? trueMax : s.VolumeRemaining let buyVolume = sellVolume > b.VolumeRemaining ? b.VolumeRemaining : sellVolume let volume = buyVolume > trueMax ? trueMax : buyVolume let buyPrice = s.Price * volume let sellPrice = b.Price * volume let p = sellPrice - buyPrice select new { sell = s, buy = b, profit = p }) .OrderByDescending(p => p.profit); var best = profitable.FirstOrDefault(); if(best != null) { var v = (best.sell.VolumeRemaining > trueMax) ? trueMax : best.sell.VolumeRemaining; v = (v <= (capital / best.sell.Price)) ? v : (capital / best.sell.Price); Volume = (int)v; Cost = Volume * best.sell.Price; SellOrder = best.sell; BuyOrder = best.buy; var jumps = GetJumps(safeOnly); if (!HighRisk) { foreach (var jump in jumps) { if (jump.security < 0.5) HighRisk = true; } } Jumps = jumps.Count(); Waypoints = jumps; Volume = (int)((best.buy.VolumeRemaining > Volume) ? Volume : best.buy.VolumeRemaining); Profit = (best.buy.Price - best.sell.Price) * Volume; Profit = Profit - (Profit * 0.015); TypeName = data.TypeName; TypeID = data.TypeID; } }
MarketDataOrder GetBuyOrder(ref MarketData data, double volume = 1, bool safeOnly = false) { try { var buyOrders = from o in data.Orders from s in StaticDB.Instance.SolarSystems where o.Bid == true && s.solarSystemID == o.SolarSystemID && s.security >= (safeOnly ? 0.5 : -100.0) && o.VolumeRemaining >= volume select o; if (buyOrders.Count() == 0) return null; var buyOrder = buyOrders.FirstOrDefault(); foreach (var order in buyOrders) { if (order.Price > buyOrder.Price) buyOrder = order; } return buyOrder; } finally { } }
private void Watcher_Created(object sender, FileSystemEventArgs e) { Thread.Sleep(100); MarketData data = new MarketData(); data.Parse(e.FullPath); var path = e.FullPath; List<MarketData> markedForRemoval = new List<MarketData>(); lock (mutex) { foreach (var md in Market) { if (md.RegionName == data.RegionName && md.TypeName == data.TypeName && md.Date < data.Date) { markedForRemoval.Add(md); } } foreach(var m in markedForRemoval) { Market.Remove(m); } Market.Add(data); cache = null; } File.Delete(path); }