Example #1
0
        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);
        }
Example #2
0
        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);
        }