public void SendUpdateTrade(bool trader_data = true) { TradeData view_trade = trader_data ? GetPlayer().GetTradeData().GetTraderData() : GetPlayer().GetTradeData(); TradeUpdated tradeUpdated = new TradeUpdated(); tradeUpdated.WhichPlayer = (byte)(trader_data ? 1 : 0); tradeUpdated.ClientStateIndex = view_trade.GetClientStateIndex(); tradeUpdated.CurrentStateIndex = view_trade.GetServerStateIndex(); tradeUpdated.Gold = view_trade.GetMoney(); tradeUpdated.ProposedEnchantment = (int)view_trade.GetSpell(); for (byte i = 0; i < (byte)TradeSlots.Count; ++i) { Item item = view_trade.GetItem((TradeSlots)i); if (item) { TradeUpdated.TradeItem tradeItem = new TradeUpdated.TradeItem(); tradeItem.Slot = i; tradeItem.Item = new ItemInstance(item); tradeItem.StackCount = (int)item.GetCount(); tradeItem.GiftCreator = item.GetGiftCreator(); if (!item.HasItemFlag(ItemFieldFlags.Wrapped)) { tradeItem.Unwrapped.HasValue = true; TradeUpdated.UnwrappedTradeItem unwrappedItem = tradeItem.Unwrapped.Value; unwrappedItem.EnchantID = (int)item.GetEnchantmentId(EnchantmentSlot.Perm); unwrappedItem.OnUseEnchantmentID = (int)item.GetEnchantmentId(EnchantmentSlot.Use); unwrappedItem.Creator = item.GetCreator(); unwrappedItem.Charges = item.GetSpellCharges(); unwrappedItem.Lock = item.GetTemplate().GetLockID() != 0 && !item.HasItemFlag(ItemFieldFlags.Unlocked); unwrappedItem.MaxDurability = item.m_itemData.MaxDurability; unwrappedItem.Durability = item.m_itemData.Durability; byte g = 0; foreach (SocketedGem gemData in item.m_itemData.Gems) { if (gemData.ItemId != 0) { ItemGemData gem = new ItemGemData(); gem.Slot = g; gem.Item = new ItemInstance(gemData); tradeItem.Unwrapped.Value.Gems.Add(gem); } ++g; } } tradeUpdated.Items.Add(tradeItem); } } SendPacket(tradeUpdated); }
private async Task <Trade> UpdateTrade(Trade trade) { if (TraderState.Trades.Count > 1) { Strategy.Settings.FirstBuyLowerPercentage = Strategy.Settings.BuyLowerPercentage; } var tradeAction = Strategy.CalculateTradeAction(Ticker, trade); var emaAdvice = GetEmaAdvice(); bool isEmaOrder = false, isEmaOrderAllowed = false; isEmaOrderAllowed = trade.ChildTrades.Count < Strategy.Settings.MaxChildTrades; if (TraderState.Trades.Count == 1 && trade.Status == TradeStatus.Empty) { if (emaAdvice != TradeAdvice.Buy) { return(Trade.Empty); } } if (emaAdvice == TradeAdvice.Buy && isEmaOrderAllowed) { isEmaOrder = true; tradeAction.TradeAdvice = TradeAdvice.Buy; tradeAction.Reason = TradeReason.EmaBuy; tradeAction.OrderPricePerUnit = Ticker.Bid * 0.99M; } Ticker.LatestEmaAdvice = emaAdvice; switch (tradeAction.TradeAdvice) { case TradeAdvice.Buy: if (emaAdvice == TradeAdvice.Sell) { break; } var buyOrder = await CreateBuyOrder(tradeAction.OrderPricePerUnit); if (tradeAction.Reason == TradeReason.BuyTrigger || tradeAction.Reason == TradeReason.EmaBuy) { var newTrade = new Trade { BuyOrder = buyOrder, Status = TradeStatus.Buying, BuyReason = tradeAction.Reason }; trade.ChildTrades.Add(newTrade.Id); return(newTrade); } trade.BuyReason = tradeAction.Reason; trade.BuyOrder = buyOrder; trade.Status = TradeStatus.Buying; break; case TradeAdvice.Sell: trade.SellReason = tradeAction.Reason; await CreateSellOrder(trade, tradeAction.OrderPricePerUnit); break; case TradeAdvice.Cancel: var cancelResponse = await _cryptoApi.CancelOrder(trade.BuyOrder.Uuid); if (cancelResponse.IsSuccessful) { Strategy.Settings.BuyLowerPercentage = 0; TraderState.Budget.Available += trade.BuyOrder.Price; trade.Status = TradeStatus.Canceled; } break; } TradeUpdated.OnNext(trade); return(Trade.Empty); }