/// <summary>
        /// Lurkers the new offer.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The trade event.</param>
        private void Lurker_IncomingOffer(object sender, TradeEvent e)
        {
            if (this.TradeOffers.Any(o => o.Event.Equals(e)))
            {
                return;
            }

            if (this._settingsService.AlertEnabled)
            {
                this.PlayAlert();
            }

            Execute.OnUIThread(() =>
            {
                this.TradeOffers.Add(new OfferViewModel(e, this._keyboardHelper, this._context, this._settingsService, this.CheckIfOfferIsAlreadySold(e)));
            });
        }
Exemple #2
0
        private void FireOnUserAddItem(TradeEvent tradeEvent)
        {
            ulong itemID = tradeEvent.assetid;

            if (OtherInventory != null)
            {
                Inventory.Item item       = OtherInventory.GetItem(itemID);
                Schema.Item    schemaItem = CurrentSchema.GetItem(item.Defindex);
                OnUserAddItem(schemaItem, item);
            }
            else
            {
                var schemaItem = GetItemFromPrivateBp(tradeEvent, itemID);
                OnUserAddItem(schemaItem, null);
                // todo: figure out what to send in with Inventory item.....
            }
        }
        internal void Test_can_publish_events()
        {
            // Arrange
            const string testAddress = "tcp://127.0.0.1:56601";

            var publisher = new EventPublisher(
                this.container,
                new MsgPackEventSerializer(),
                new BypassCompressor(),
                EncryptionSettings.None(),
                new Label("test-publisher"),
                new Port(56601));

            publisher.Start().Wait();

            var subscriber = new SubscriberSocket(testAddress);

            subscriber.Connect(testAddress);
            subscriber.Subscribe("Event:Trade:TESTER-001");

            Task.Delay(100).Wait(); // Allow socket to subscribe

            var serializer = new MsgPackEventSerializer();
            var order      = new StubOrderBuilder().BuildMarketOrder();
            var rejected   = StubEventMessageProvider.OrderRejectedEvent(order);
            var tradeEvent = new TradeEvent(TraderId.FromString("TESTER-001"), rejected);

            // Act
            publisher.Endpoint.Send(tradeEvent);
            this.Output.WriteLine("Waiting for published events...");

            var topic   = subscriber.ReceiveFrameBytes();
            var message = subscriber.ReceiveFrameBytes();
            var @event  = serializer.Deserialize(message);

            // Assert
            Assert.Equal("Event:Trade:TESTER-001", Encoding.UTF8.GetString(topic));
            Assert.Equal(typeof(OrderRejected), @event.GetType());

            // Tear Down
            subscriber.Disconnect(testAddress);
            subscriber.Dispose();
            publisher.Stop().Wait();
            publisher.Dispose();
        }
        /// <summary>
        /// OnNext
        /// </summary>
        /// <param name="data"></param>
        /// <param name="sequence"></param>
        /// <param name="endOfBatch"></param>
        public void OnNext(byte[] data, long sequence, bool endOfBatch)
        {
            object getObject = ByteArrayToObject(data);

            if (getObject is Order)
            {
                //NOTE: Commented out due event store issues
                //_eventStore.StoreEvent(getObject as Order);

                // Raising Event to be handled by OrderEventListener. Moved here from ReceiveCommit.cs
                OrderEvent.Raise(getObject as Order);
            }
            if (getObject is Trade)
            {
                //NOTE: Commented out due event store issues
                //_eventStore.StoreEvent(getObject as Trade);

                // Raising Event to be handled by TradeEventListener. Moved here from ReceiveCommit.cs
                TradeEvent.Raise(getObject as Trade);
            }
            if (getObject is LimitOrderBook)
            {
                LimitOrderBook limitOrderBook = getObject as LimitOrderBook;
                // Raise the event for the memory event to catch
                LimitOrderBookEvent.Raise(limitOrderBook);
                // Store the LimitOrderBook in the event store if no last snapshot datetime has been assigned or if the snapshot
                // was taken yesterday and new day has begun

                /*if ((limitOrderBook.LastSnapshotTaken == DateTime.MinValue ||
                 *  limitOrderBook.LastSnapshotTaken.Day < DateTime.Today.Day))
                 * {
                 *  _eventStore.StoreEvent(limitOrderBook);
                 *  limitOrderBook.LastSnapshotTaken = DateTime.Now;
                 * }*/
            }
            if (getObject is Depth)
            {
                DepthEvent.Raise(getObject as Depth);
            }
            if (getObject is BBO)
            {
                BBOEvent.Raise(getObject as BBO);
            }
        }
Exemple #5
0
        /// <summary>
        /// Gets an item from a TradeEvent, and passes it into the UserHandler's implemented OnUserAddItem([...]) routine.
        /// Passes in null items if something went wrong.
        /// </summary>
        /// <param name="tradeEvent">TradeEvent to get item from</param>
        /// <returns></returns>
        private void FireOnUserAddItem(TradeEvent tradeEvent)
        {
            ulong itemID = tradeEvent.assetid;

            Inventory.Item item;

            if (OtherInventory != null)
            {
                item = OtherInventory.GetItem(itemID);
                if (item != null)
                {
                    Schema.Item schemaItem = CurrentSchema.GetItem(item.Defindex);
                    if (schemaItem == null)
                    {
                        Console.WriteLine("User added an unknown item to the trade.");
                    }

                    OnUserAddItem(schemaItem, item);
                }
                else
                {
                    item = new Inventory.Item()
                    {
                        Id        = itemID,
                        AppId     = tradeEvent.appid,
                        ContextId = tradeEvent.contextid
                    };
                    //Console.WriteLine("User added a non TF2 item to the trade.");
                    OnUserAddItem(null, item);
                }
            }
            else
            {
                var schemaItem = GetItemFromPrivateBp(tradeEvent, itemID);
                if (schemaItem == null)
                {
                    Console.WriteLine("User added an unknown item to the trade.");
                }

                OnUserAddItem(schemaItem, null);
                // todo: figure out what to send in with Inventory item.....
            }
        }
Exemple #6
0
        void HandleTradeItemAdded(TradeSession trade, TradeEvent @event)
        {
            if (@event.item.appid != TF2App)
            {
                Logger.WriteLine("Ignored item: not TF2 item...");
                return;
            }

            var asset = trade.ForeignInventory.LookupItem(@event.item);
            var item  = GetItemFromAsset(asset);

            if (item == null)
            {
                Logger.WriteLine("Unknown item added: " + @event.item);
                return;
            }

            Logger.WriteLine("Item added: " + item.ItemName);
        }
Exemple #7
0
        /// <summary>
        /// Gets an item from a TradeEvent, and passes it into the UserHandler's implemented OnUserAddItem([...]) routine.
        /// Passes in null items if something went wrong.
        /// </summary>
        /// <param name="tradeEvent">TradeEvent to get item from</param>
        /// <returns></returns>
        private void FireOnUserAddItem(TradeEvent tradeEvent, SteamID botId)
        {
            bool isCurrency = tradeEvent.currencyid != 0;
            var  item       = OtherInventory.GetItem(tradeEvent.appid, tradeEvent.contextid, isCurrency ? tradeEvent.currencyid : tradeEvent.assetid, isCurrency);

            if (item == null)
            {
                if (GenericInventory.ShouldFetchInventory(tradeEvent.appid, MySteamId))
                {
                    OtherInventory.AddForeignInventory(new SteamID(Convert.ToUInt64(tradeEvent.steamid)), botId, tradeEvent.appid, tradeEvent.contextid);
                    item = OtherInventory.GetItem(tradeEvent.appid, tradeEvent.contextid, isCurrency ? tradeEvent.currencyid : tradeEvent.assetid, isCurrency);
                }
            }
            else
            {
                item.Amount = tradeEvent.amount;
            }
            OnUserAddItem(item);
        }
Exemple #8
0
        /// <summary>
        /// Gets an item from a TradeEvent, and passes it into the UserHandler's implemented OnUserRemoveItem([...]) routine.
        /// Passes in null items if something went wrong.
        /// </summary>
        /// <param name="tradeEvent">TradeEvent to get item from</param>
        /// <returns></returns>
        private void FireOnUserRemoveItem(TradeEvent tradeEvent)
        {
            ulong itemID = (ulong)tradeEvent.assetid;

            Inventory.Item item;

            if (OtherInventory != null)
            {
                item = OtherInventory.GetItem(itemID);
                if (item != null)
                {
                    Schema.Item schemaItem = CurrentSchema.GetItem(item.Defindex);
                    if (schemaItem == null)
                    {
                        // TODO: Add log (counldn't find item in CurrentSchema)
                    }

                    OnUserRemoveItem(schemaItem, item);
                }
                else
                {
                    // TODO: Log this (Couldn't find item in user's inventory can't find item in CurrentSchema
                    item = new Inventory.Item()
                    {
                        Id        = itemID,
                        AppId     = tradeEvent.appid,
                        ContextId = tradeEvent.contextid
                    };
                    OnUserRemoveItem(null, item);
                }
            }
            else
            {
                var schemaItem = GetItemFromPrivateBp(tradeEvent, itemID);
                if (schemaItem == null)
                {
                    // TODO: Add log (counldn't find item in CurrentSchema)
                }

                OnUserRemoveItem(schemaItem, null);
            }
        }
        /// <summary>
        /// Checks if offer is already sold.
        /// </summary>
        /// <param name="tradeEvent">The trade event.</param>
        private bool CheckIfOfferIsAlreadySold(TradeEvent tradeEvent)
        {
            var location        = tradeEvent.Location.ToString();
            var defaultLocation = new Location().ToString();

            if (location != defaultLocation)
            {
                foreach (var lastOffer in this._lastOffers)
                {
                    if (tradeEvent.ItemName == lastOffer.ItemName)
                    {
                        if (location == lastOffer.Location.ToString())
                        {
                            return(true);
                        }
                    }
                }
            }

            return(false);
        }
Exemple #10
0
        void ProcessCurrentTrade()
        {
            if (CurrentTrade == null)
            {
                return;
            }

            CurrentTrade.Update();

            TradeEvent @event = null;

            while (CurrentTrade.Events.TryDequeue(out @event))
            {
                //Logger.WriteLine("Got event: " + evt.type);
                HandleTradeEvent(CurrentTrade, @event);
            }

            if (CurrentTrade.Status != ETradeTransactionStatus.InProgress)
            {
                CurrentTrade = null;
            }
        }
Exemple #11
0
        /// <summary>
        /// Handles the ClipboardChanged event of the ClipboardMonitor control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="SharpClipboard.ClipboardChangedEventArgs"/> instance containing the event data.</param>
        /// <exception cref="NotImplementedException"></exception>
        private void ClipboardMonitor_ClipboardChanged(object sender, SharpClipboard.ClipboardChangedEventArgs e)
        {
            if (e.ContentType == SharpClipboard.ContentTypes.Text)
            {
                var currentText = e.Content as string;
                if (string.IsNullOrEmpty(currentText))
                {
                    return;
                }

                if (this._lastClipboardText == currentText)
                {
                    return;
                }

                this._lastClipboardText = currentText;
                if (TradeEvent.IsTradeMessage(currentText))
                {
                    this.NewOffer?.Invoke(this, currentText);
                }
            }
        }
        /// <summary>
        /// Lurkers the new offer.
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The trade event.</param>
        private async void Lurker_IncomingOffer(object sender, TradeEvent e)
        {
            if (this.TradeOffers.Any(o => o.Event.Equals(e)))
            {
                return;
            }

            if (this.SettingsService.AlertEnabled)
            {
                this.PlayAlert();
            }

            if (PoeApplicationContext.IsAfk)
            {
                await this._pushBulletService.SendTradeMessageAsync(e);
            }

            Execute.OnUIThread(() =>
            {
                this.TradeOffers.Add(new OfferViewModel(e, this._keyboardHelper, this._context, this.SettingsService, this.CheckIfOfferIsAlreadySold(e), this.DockingHelper));
            });
        }
        /// <summary>
        /// Handles the ClipboardChanged event of the ClipboardMonitor control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="SharpClipboard.ClipboardChangedEventArgs"/> instance containing the event data.</param>
        /// <exception cref="NotImplementedException"></exception>
        private void ClipboardMonitor_ClipboardChanged(object sender, SharpClipboard.ClipboardChangedEventArgs e)
        {
            if (e.ContentType == SharpClipboard.ContentTypes.Text)
            {
                var currentText = e.Content as string;
                if (string.IsNullOrEmpty(currentText))
                {
                    return;
                }

                if (this._lastClipboardText == currentText)
                {
                    return;
                }

                if (Keyboard.IsKeyDown(Key.LeftShift))
                {
                    return;
                }

                var isTradeMessage = false;
                this._lastClipboardText = currentText;
                if (TradeEvent.IsTradeMessage(currentText))
                {
                    isTradeMessage = true;
                }
                else if (TradeEventHelper.IsTradeMessage(currentText))
                {
                    isTradeMessage = true;
                }

                if (isTradeMessage)
                {
                    this.NewOffer?.Invoke(this, currentText);
                }
            }
        }
Exemple #14
0
        void HandleTradeTextCommand(TradeSession trade, TradeEvent @event)
        {
            SendChatDelegate sendDelegate = (sender, entry, text) =>
            {
                trade.SendChatMessage(text);
            };

            TradeCommand cmd;

            if (!HandleCommandCommon(
                    @event.message, @event.sender, sendDelegate, out cmd))
            {
                return;
            }

            var messageMap = new Dictionary <TradeCommand, Action <string, TradeSession> >
            {
                { TradeCommand.Help, HandleTradeHelpCommand },
                { TradeCommand.Ready, HandleTradeReadyCommand },
                { TradeCommand.Add, HandleTradeAddCommand },
                { TradeCommand.Remove, HandleTradeRemoveCommand },
                { TradeCommand.Confirm, HandleTradeConfirmCommand },
                { TradeCommand.Items, HandleTradeItemsCommand },
                { TradeCommand.Cancel, HandleTradeCancelCommand },
            };

            Action <string, TradeSession> func;

            if (!messageMap.TryGetValue(cmd, out func))
            {
                Logger.WriteLine("Unhandled trade command: {0}", cmd);
                return;
            }

            func(@event.message, trade);
        }
Exemple #15
0
        //////////////////////////////////////////////////////////////////////////////////
        //交易测试
        static void TradeTest()
        {
            //创建 ITrade
            // char* path 指 xxx.exe 同级子目录中的 xxx.dll 文件
            int err = -1;

            trade = ITradeApi.XFinApi_CreateTradeApi("XTA_W64/Api/CTP_v6.3.6_20160606/XFinApi.CTPTradeApi.dll", out err);

            if (err > 0 || trade == null)
            {
                Console.WriteLine(string.Format("* Trade XFinApiCreateError={0};", StrCreateErrors[err]));
                return;
            }

            //注册事件
            tradeEvent = new TradeEvent();
            trade.SetListener(tradeEvent);

            //连接服务器
            //Cfg.SetNonTradeTime();//非交易时段
            OpenParams openParams = new OpenParams();

            openParams.HostAddress = Cfg.TradeAddress;
            openParams.BrokerID    = Cfg.BrokerID;
            openParams.UserID      = Cfg.UserName;
            openParams.Password    = Cfg.Password;
            openParams.IsUTF8      = true;
            trade.Open(openParams);

            /*
             * //连接成功后才能执行查询、委托等操作,检测方法有两种:
             * 1、ITrade.IsOpened()=true
             * 2、TradeListener.OnNotify中
             * (int)XFinApi.TradeApi.ActionKind.Open == notifyParams.ActionType &&
             *          (int)ResultKind.Success == notifyParams.ResultType
             */

            while (!trade.IsOpened())
            {
                Thread.Sleep(1000);
            }

            QueryParams qryParam = new QueryParams();

            qryParam.InstrumentID = Cfg.InstrumentID;

            //查询委托单
            Thread.Sleep(1000);//有些接口查询有间隔限制,如:CTP查询间隔为1秒
            Console.WriteLine("Press any key to QueryOrder.");
            Console.ReadKey();
            trade.QueryOrder(qryParam);

            //查询成交单
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryTradeOrder.");
            Console.ReadKey();
            trade.QueryTradeOrder(qryParam);

            //查询合约
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryInstrument.");
            Console.ReadKey();
            trade.QueryInstrument(qryParam);

            //查询持仓
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryPosition.");
            Console.ReadKey();
            trade.QueryPosition(qryParam);

            //查询账户
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryAccount.");
            Console.ReadKey();
            trade.QueryAccount(qryParam);

            //委托下单
            Thread.Sleep(1000);
            Console.WriteLine("Press any key to OrderAction.");
            Console.ReadKey();
            Order order = new Order();

            order.InstrumentID  = Cfg.InstrumentID;
            order.Price         = Cfg.SellPrice1;
            order.Volume        = 1;
            order.Direction     = DirectionKind.Buy;
            order.OpenCloseType = OpenCloseKind.Open;

            //下单高级选项,可选择性设置
            order.ActionType     = OrderActionKind.Insert;         //下单
            order.OrderType      = OrderKind.Order;                //标准单
            order.PriceCond      = PriceConditionKind.LimitPrice;  //限价
            order.VolumeCond     = VolumeConditionKind.AnyVolume;  //任意数量
            order.TimeCond       = TimeConditionKind.GFD;          //当日有效
            order.ContingentCond = ContingentCondKind.Immediately; //立即
            order.HedgeType      = HedgeKind.Speculation;          //投机
            order.ExecResult     = ExecResultKind.NoExec;          //没有执行

            trade.OrderAction(order);
        }
 public void ChangePosition(TradeEvent trade)
 {
     Trades.Add(trade);
 }
Exemple #17
0
        /// <summary>
        /// Called when [file changed].
        /// </summary>
        /// <param name="sender">The sender.</param>
        /// <param name="e">The <see cref="FileSystemEventArgs"/> instance containing the event data.</param>
        private void OnFileChanged(string newline)
        {
            if (string.IsNullOrEmpty(newline))
            {
                return;
            }

            // TradeEvent need to be parse before whisper
            var tradeEvent = TradeEvent.TryParse(newline);

            if (tradeEvent != null)
            {
                this.NewOffer?.Invoke(this, tradeEvent);
                return;
            }

            var whisperEvent = WhisperEvent.TryParse(newline);

            if (whisperEvent != null)
            {
                this.Whispered?.Invoke(this, whisperEvent);
                return;
            }

            var locationEvent = LocationChangedEvent.TryParse(newline);

            if (locationEvent != null)
            {
                this.LocationChanged?.Invoke(this, locationEvent);
                return;
            }

            var tradeAcceptedEvent = TradeAcceptedEvent.TryParse(newline);

            if (tradeAcceptedEvent != null)
            {
                this.TradeAccepted?.Invoke(this, tradeAcceptedEvent);
                return;
            }

            var monsterEvent = MonstersRemainEvent.TryParse(newline);

            if (monsterEvent != null)
            {
                this.RemainingMonsters?.Invoke(this, monsterEvent);
                return;
            }

            var playerJoinEvent = PlayerJoinedEvent.TryParse(newline);

            if (playerJoinEvent != null)
            {
                this.PlayerJoined?.Invoke(this, playerJoinEvent);
                return;
            }

            var playerLeftEvent = PlayerLeftEvent.TryParse(newline);

            if (playerLeftEvent != null)
            {
                this.PlayerLeft?.Invoke(this, playerLeftEvent);
                return;
            }

            Logger.Trace($"Not parsed: {newline}");
        }
Exemple #18
0
 protected override void AddTrade(TradeEvent tradeEvent)
 {
     Ticks.Add(tradeEvent.Tick);
 }
Exemple #19
0
        //////////////////////////////////////////////////////////////////////////////////
        //交易测试
        static void TradeTest()
        {
            //创建 ITrade
            // char* path 指 xxx.exe 同级子目录中的 xxx.dll 文件
            int err = -1;

            trade = ITradeApi.XFinApi_CreateTradeApi("XTA_W32/Api/XTP_v1.1.18.13_20180516/XFinApi.XTPTradeApi.dll", out err);

            if (err > 0 || trade == null)
            {
                Console.WriteLine(string.Format("* Trade XFinApiCreateError={0};", StrCreateErrors[err]));
                return;
            }

            //注册事件
            tradeEvent = new TradeEvent();
            trade.SetListener(tradeEvent);

            //连接服务器
            OpenParams openParams = new OpenParams();

            openParams.HostAddress = Cfg.TradeAddress;
            openParams.UserID      = Cfg.UserName;
            openParams.Password    = Cfg.Password;
            openParams.Configs.Add("AuthCode", Cfg.AuthCode);
            openParams.Configs.Add("ClientID", Cfg.ClientID);//可选
            openParams.IsUTF8 = true;
            trade.Open(openParams);

            /*
             * //连接成功后才能执行查询、委托等操作,检测方法有两种:
             * 1、ITrade.IsOpened()=true
             * 2、TradeListener.OnNotify中
             * (int)XFinApi.TradeApi.ActionKind.Open == notifyParams.ActionType &&
             *          (int)ResultKind.Success == notifyParams.ResultType
             */

            while (!trade.IsOpened())
            {
                Thread.Sleep(1000);
            }

            QueryParams qryParam = new QueryParams();

            //查询委托单
            Thread.Sleep(1000);//有些接口查询有间隔限制,如:CTP查询间隔为1秒
            Console.WriteLine("Press any key to QueryOrder.");
            Console.ReadKey();
            trade.QueryOrder(qryParam);

            //查询成交单
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryTradeOrder.");
            Console.ReadKey();
            trade.QueryTradeOrder(qryParam);

            //查询合约
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryInstrument.");
            Console.ReadKey();
            trade.QueryInstrument(qryParam);

            //查询持仓
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryPosition.");
            Console.ReadKey();
            trade.QueryPosition(qryParam);

            //查询账户
            Thread.Sleep(3000);
            Console.WriteLine("Press any key to QueryAccount.");
            Console.ReadKey();
            trade.QueryAccount(qryParam);

            //委托下单
            Thread.Sleep(1000);
            Console.WriteLine("Press any key to OrderAction.");
            Console.ReadKey();
            Order order = new Order();

            order.ExchangeID   = Cfg.MarketID;
            order.InstrumentID = Cfg.InstrumentID;
            order.Price        = Cfg.SellPrice1;
            order.Volume       = 100;
            order.Direction    = DirectionKind.Buy;

            //下单高级选项,可选择性设置
            order.ActionType = OrderActionKind.Insert;        //下单
            order.OrderType  = OrderKind.Order;               //标准单
            order.PriceCond  = PriceConditionKind.LimitPrice; //限价

            trade.OrderAction(order);
        }
Exemple #20
0
 void HandleTradeConfirmed(TradeSession trade, TradeEvent @event)
 {
     Logger.WriteLine("Trade confirmed.");
     trade.Confirm();
 }
Exemple #21
0
 /// <summary>
 /// Initializes a new instance of the <see cref="PositionViewModel"/> class.
 /// </summary>
 /// <param name="tradeEvent">The trade event.</param>
 public PositionViewModel(TradeEvent tradeEvent)
 {
     this._tradeEvent = tradeEvent;
 }
 /// <summary>
 /// Initializes a new instance of the <see cref="TradeValueViewModel" /> class.
 /// </summary>
 /// <param name="tradeEvent">The trade event.</param>
 /// <param name="settingsService">The settings service.</param>
 public TradeValueViewModel(TradeEvent tradeEvent, SettingsService settingsService)
 {
     this._tradeEvent      = tradeEvent;
     this._settingsService = settingsService;
 }
 public PositionViewModel(TradeEvent tradeEvent)
 {
     this._tradeEvent = tradeEvent;
     this._ItemClass  = ItemClassParser.Parse(tradeEvent.ItemName);
 }
Exemple #24
0
        private async Task <string> WriteOHLC(TradeEvent ev, DateTimeOffset?timestamp)
        {
            try
            {
                string     tokenSymbol;
                decimal    tokenAmount, ethAmount, price = 0;
                TokenModel token;
                if (ev.TokenGet == NullAddress)
                {
                    token = await _context.Token.FirstOrDefaultAsync(x => x.Token == ev.TokenGive);

                    tokenSymbol = token.Symbol;
                    var d = await _cache.GetOrCreateAsync(ev.TokenGive, entry =>
                    {
                        entry.SlidingExpiration = TimeSpan.FromSeconds(5);
                        var tokenContract       = new StandardTokenService(_nethereumClient, ev.TokenGive);
                        var decimals            = tokenContract.DecimalsQueryAsync(new DecimalsFunction()).Result;
                        return(Task.FromResult((decimal)Math.Pow(10, decimals)));
                    });

                    tokenAmount = (decimal)BigInteger.DivRem(ev.AmountGive, new BigInteger(d), out var remainder);
                    if (remainder > 0)
                    {
                        tokenAmount += (decimal)remainder / d;
                    }

                    ethAmount = UnitConversion.Convert.FromWei(ev.AmountGet, UnitConversion.EthUnit.Ether);
                    if (tokenAmount > 0)
                    {
                        price = ethAmount / tokenAmount;
                    }
                }
                else
                {
                    token = await _context.Token.FirstOrDefaultAsync(x => x.Token == ev.TokenGet);

                    tokenSymbol = token.Symbol;
                    var d = await _cache.GetOrCreateAsync(ev.TokenGet, entry =>
                    {
                        entry.SlidingExpiration = TimeSpan.FromSeconds(5);
                        var tokenContract       = new StandardTokenService(_nethereumClient, ev.TokenGive);
                        var decimals            = tokenContract.DecimalsQueryAsync(new DecimalsFunction()).Result;
                        return(Task.FromResult((decimal)Math.Pow(10, decimals)));
                    });

                    tokenAmount = (decimal)BigInteger.DivRem(ev.AmountGet, new BigInteger(d), out var remainder);
                    if (remainder > 0)
                    {
                        tokenAmount += (decimal)remainder / d;
                    }

                    ethAmount = UnitConversion.Convert.FromWei(ev.AmountGive, UnitConversion.EthUnit.Ether);
                    if (tokenAmount > 0)
                    {
                        price = ethAmount / tokenAmount;
                    }
                }
                _ohclService.WriteOHLC(price, tokenAmount, token.Symbol, timestamp.Value.UtcDateTime);
                return(tokenSymbol);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }
Exemple #25
0
 private void WsClient_OnTrade(TradeEvent tradeEvent)
 {
     Console.WriteLine(tradeEvent);
     //here you can make your trade decision
 }
Exemple #26
0
        private void processMessage(byte[] receivedData)
        {
            // parsing response
            using (MemoryStream responseStream = new MemoryStream(receivedData))
            {
                protobuf.ws.WsResponse response = ProtoBuf.Serializer.Deserialize <protobuf.ws.WsResponse>(responseStream);
                if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.TickerChannelSubscribed)
                {
                    using (MemoryStream messageStream = new MemoryStream(response.Msg))
                    {
                        protobuf.ws.TickerChannelSubscribedResponse message = ProtoBuf.Serializer.Deserialize <protobuf.ws.TickerChannelSubscribedResponse>(messageStream);
                        string channelId = "Ticker_" + message.CurrencyPair;
                        WsClient_OnSubscribe(channelId);
                        message.Datas.ForEach(delegate(protobuf.ws.TickerEvent evt) {
                            TickerEvent preparedEvent = prepareTickerEvent(evt);
                            preparedEvent.ChannelId   = channelId;
                            WsClient_OnTicker(preparedEvent);
                        });
                    }
                }
                else if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.TickerNotify)
                {
                    using (MemoryStream messageStream = new MemoryStream(response.Msg))
                    {
                        protobuf.ws.TickerNotification message = ProtoBuf.Serializer.Deserialize <protobuf.ws.TickerNotification>(messageStream);
                        string channelId = "Ticker_" + message.CurrencyPair;
                        message.Datas.ForEach(delegate(protobuf.ws.TickerEvent evt) {
                            TickerEvent preparedEvent = prepareTickerEvent(evt);
                            preparedEvent.ChannelId   = channelId;
                            WsClient_OnTicker(preparedEvent);
                        });
                    }
                }
                if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.TradeChannelSubscribed)
                {
                    using (MemoryStream messageStream = new MemoryStream(response.Msg))
                    {
                        protobuf.ws.TradeChannelSubscribedResponse message = ProtoBuf.Serializer.Deserialize <protobuf.ws.TradeChannelSubscribedResponse>(messageStream);
                        string channelId = "Trade_" + message.CurrencyPair;
                        WsClient_OnSubscribe(channelId);
                        message.Datas.ForEach(delegate(protobuf.ws.TradeEvent evt) {
                            TradeEvent preparedEvent = prepareTradeEvent(evt);
                            preparedEvent.ChannelId  = channelId;
                            WsClient_OnTrade(preparedEvent);
                        });
                    }
                }
                else if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.TradeNotify)
                {
                    using (MemoryStream messageStream = new MemoryStream(response.Msg))
                    {
                        protobuf.ws.TradeNotification message = ProtoBuf.Serializer.Deserialize <protobuf.ws.TradeNotification>(messageStream);
                        string channelId = "Trade_" + message.CurrencyPair;
                        message.Datas.ForEach(delegate(protobuf.ws.TradeEvent evt) {
                            TradeEvent preparedEvent = prepareTradeEvent(evt);
                            preparedEvent.ChannelId  = channelId;
                            WsClient_OnTrade(preparedEvent);
                        });
                    }
                }
                else if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.Error)
                {
                    using (MemoryStream messageStream = new MemoryStream(response.Msg))
                    {
                        protobuf.ws.ErrorResponse message = ProtoBuf.Serializer.Deserialize <protobuf.ws.ErrorResponse>(messageStream);
                        WsClient_OnError(response.Meta.Token, message.Code, message.Message);
                    }
                }
                else if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.ChannelUnsubscribed)
                {
                    using (MemoryStream messageStream = new MemoryStream(response.Msg)) {
                        protobuf.ws.ChannelUnsubscribedResponse message = ProtoBuf.Serializer.Deserialize <protobuf.ws.ChannelUnsubscribedResponse>(messageStream);
                        if (message.Type == protobuf.ws.UnsubscribeRequest.ChannelType.Ticker)
                        {
                            WsClient_OnUnsubscribe("Ticker_" + message.CurrencyPair);
                        }
                        else if (message.Type == protobuf.ws.UnsubscribeRequest.ChannelType.Trade)
                        {
                            WsClient_OnUnsubscribe("Trade_" + message.CurrencyPair);
                        }
                    }
                }
                else if (response.Meta.ResponseType == protobuf.ws.WsResponseMetaData.WsResponseMsgType.LoginResponse)
                {
                    WsClient_OnLogin();
                }

                // here you can make your trade decision
            }
        }
Exemple #27
0
        private void HandleTradeItem(object sender, MessageData item)
        {
            var data = JsonSerializer.Deserialize <Trade>(item.Data);

            TradeEvent?.Invoke(sender, data);
        }
Exemple #28
0
 /// <summary>
 /// Initializes a new instance of the <see cref="TradeValueViewModel"/> class.
 /// </summary>
 /// <param name="tradeEvent">The trade event.</param>
 public TradeValueViewModel(TradeEvent tradeEvent)
 {
     this._tradeEvent = tradeEvent;
 }
Exemple #29
0
        /// <summary>
        /// Called when [file changed].
        /// </summary>
        /// <param name="newline">The newline.</param>
        private void OnFileChanged(string newline)
        {
            if (string.IsNullOrEmpty(newline))
            {
                return;
            }

            try
            {
                // TradeEvent need to be parse before whisper
                var tradeEvent = TradeEvent.TryParse(newline);
                if (tradeEvent != null)
                {
                    this.HandleLeague(tradeEvent);
                    this.IncomingOffer?.Invoke(this, tradeEvent);
                    return;
                }

                var outgoingTradeEvent = OutgoingTradeEvent.TryParse(newline);
                if (outgoingTradeEvent != null)
                {
                    this.HandleLeague(outgoingTradeEvent);
                    this.OutgoingOffer?.Invoke(this, outgoingTradeEvent);
                    return;
                }

                var levelUpEvent = PlayerLevelUpEvent.TryParse(newline);
                if (levelUpEvent != null)
                {
                    this.PlayerLevelUp?.Invoke(this, levelUpEvent);
                    return;
                }

                var whisperEvent = WhisperEvent.TryParse(newline);
                if (whisperEvent != null)
                {
                    this.Whispered?.Invoke(this, whisperEvent);
                    return;
                }

                var locationEvent = LocationChangedEvent.TryParse(newline);
                if (locationEvent != null)
                {
                    Models.PoeApplicationContext.Location = locationEvent.Location;
                    this.LocationChanged?.Invoke(this, locationEvent);
                    return;
                }

                var afkEvent = AfkEvent.TryParse(newline);
                if (afkEvent != null)
                {
                    if (Models.PoeApplicationContext.IsAfk != afkEvent.AfkEnable)
                    {
                        Models.PoeApplicationContext.IsAfk = afkEvent.AfkEnable;
                    }

                    this.AfkChanged?.Invoke(this, afkEvent);
                    return;
                }

                var tradeAcceptedEvent = TradeAcceptedEvent.TryParse(newline);
                if (tradeAcceptedEvent != null)
                {
                    this.TradeAccepted?.Invoke(this, tradeAcceptedEvent);
                    return;
                }

                var monsterEvent = MonstersRemainEvent.TryParse(newline);
                if (monsterEvent != null)
                {
                    this.RemainingMonsters?.Invoke(this, monsterEvent);
                    return;
                }

                var playerJoinEvent = PlayerJoinedEvent.TryParse(newline);
                if (playerJoinEvent != null)
                {
                    this.PlayerJoined?.Invoke(this, playerJoinEvent);
                    return;
                }

                var playerLeftEvent = PlayerLeftEvent.TryParse(newline);
                if (playerLeftEvent != null)
                {
                    this.PlayerLeft?.Invoke(this, playerLeftEvent);
                    return;
                }

                Logger.Trace($"Not parsed: {newline}");
            }
            catch (Exception ex)
            {
                var lineError = $"Line in error: {newline}";
                var exception = new Exception(lineError, ex);
                Logger.Error(exception, exception.Message);

#if !DEBUG
                SentrySdk.AddBreadcrumb(message: lineError, level: BreadcrumbLevel.Error);
                SentrySdk.CaptureException(ex);
#endif
            }
        }
Exemple #30
0
        /// <summary>
        /// This updates the trade.  This is called at an interval of a
        /// default of 800ms, not including the execution time of the
        /// method itself.
        /// </summary>
        /// <returns><c>true</c> if the other trade partner performed an action; otherwise <c>false</c>.</returns>
        public bool Poll()
        {
            bool otherDidSomething = false;

            if (!TradeStarted)
            {
                tradeStarted = true;

                // since there is no feedback to let us know that the trade
                // is fully initialized we assume that it is when we start polling.
                if (OnAfterInit != null)
                {
                    OnAfterInit();
                }
            }

            TradeStatus status = session.GetStatus();

            if (status == null)
            {
                throw new TradeException("The web command to get the trade status failed.");
            }

            switch (status.trade_status)
            {
            // Nothing happened. i.e. trade hasn't closed yet.
            case 0:
                break;

            // Successful trade
            case 1:
                HasTradeCompletedOk = true;
                return(otherDidSomething);

            // All other known values (3, 4) correspond to trades closing.
            default:
                if (OnError != null)
                {
                    OnError("Trade was closed by other user. Trade status: " + status.trade_status);
                }
                OtherUserCancelled = true;
                return(otherDidSomething);
            }

            if (status.newversion)
            {
                // handle item adding and removing
                session.Version = status.version;

                TradeEvent     trdEvent   = status.GetLastEvent();
                TradeEventType actionType = (TradeEventType)trdEvent.action;
                HandleTradeVersionChange(status);
                return(true);
            }
            else if (status.version > session.Version)
            {
                // oh crap! we missed a version update abort so we don't get
                // scammed. if we could get what steam thinks what's in the
                // trade then this wouldn't be an issue. but we can only get
                // that when we see newversion == true
                throw new TradeException("The trade version does not match. Aborting.");
            }

            var events = status.GetAllEvents();

            foreach (var tradeEvent in events)
            {
                if (eventList.Contains(tradeEvent))
                {
                    continue;
                }

                //add event to processed list, as we are taking care of this event now
                eventList.Add(tradeEvent);

                bool isBot = tradeEvent.steamid == MySteamId.ConvertToUInt64().ToString();

                // dont process if this is something the bot did
                if (isBot)
                {
                    continue;
                }

                otherDidSomething = true;

                /* Trade Action ID's
                 * 0 = Add item (itemid = "assetid")
                 * 1 = remove item (itemid = "assetid")
                 * 2 = Toggle ready
                 * 3 = Toggle not ready
                 * 4 = ?
                 * 5 = ? - maybe some sort of cancel
                 * 6 = ?
                 * 7 = Chat (message = "text")        */
                switch ((TradeEventType)tradeEvent.action)
                {
                case TradeEventType.ItemAdded:
                    FireOnUserAddItem(tradeEvent);
                    break;

                case TradeEventType.ItemRemoved:
                    FireOnUserRemoveItem(tradeEvent);
                    break;

                case TradeEventType.UserSetReady:
                    otherIsReady = true;
                    OnUserSetReady(true);
                    break;

                case TradeEventType.UserSetUnReady:
                    otherIsReady = false;
                    OnUserSetReady(false);
                    break;

                case TradeEventType.UserAccept:
                    OnUserAccept();
                    break;

                case TradeEventType.UserChat:
                    OnMessage(tradeEvent.text);
                    break;

                default:
                    // Todo: add an OnWarning or similar event
                    if (OnError != null)
                    {
                        OnError("Unknown Event ID: " + tradeEvent.action);
                    }
                    break;
                }
            }

            // Update Local Variables
            if (status.them != null)
            {
                otherIsReady = status.them.ready == 1;
                meIsReady    = status.me.ready == 1;
            }

            if (status.logpos != 0)
            {
                session.LogPos = status.logpos;
            }

            return(otherDidSomething);
        }