Exemplo n.º 1
0
        public async Task <Unit> UpdateOrder(CryptoOrder cryptoOrder)
        {
            try
            {
                Console.WriteLine($"Closed order {cryptoOrder.Uuid} as {cryptoOrder.OrderType} at {cryptoOrder.Limit}");
                switch (cryptoOrder.OrderType)
                {
                case CryptoOrderType.LimitSell:
                    Budget.Available += cryptoOrder.Price;
                    var tradeForSellOrder = Trades.FirstOrDefault(t => t.SellOrder.Uuid == cryptoOrder.Uuid);
                    if (tradeForSellOrder != null)
                    {
                        if (cryptoOrder.Canceled)
                        {
                            tradeForSellOrder.Status             = TradeStatus.Bought;
                            tradeForSellOrder.SellOrder.IsOpened = false;
                            return(await Task.FromResult(Unit.Default));
                        }
                        var tradeProfit = tradeForSellOrder.BuyOrder.Price.GetReadablePercentageChange(tradeForSellOrder.SellOrder.Price);
                        Budget.Profit += tradeProfit;
                        Budget.Earned += tradeForSellOrder.SellOrder.Price - tradeForSellOrder.BuyOrder.Price;
                        Console.WriteLine($"{cryptoOrder.Uuid}: SELL - {tradeProfit}");
                        await _pushManager.TriggerPush(PushMessage.FromMessage($"Sold {Market} for profit {tradeProfit}%"));

                        tradeForSellOrder.Profit    = tradeProfit;
                        tradeForSellOrder.Status    = TradeStatus.Completed;
                        tradeForSellOrder.SellOrder = cryptoOrder;
                    }
                    break;

                case CryptoOrderType.LimitBuy:
                    var tradeForBuyOrder = Trades.FirstOrDefault(t => t.BuyOrder.Uuid == cryptoOrder.Uuid);
                    if (tradeForBuyOrder != null)
                    {
                        await _pushManager.TriggerPush(PushMessage.FromMessage($"Bought {Market} at {cryptoOrder.Limit} BTC"));

                        if (cryptoOrder.Canceled)
                        {
                            tradeForBuyOrder.Status   = TradeStatus.Empty;
                            tradeForBuyOrder.BuyOrder = new CryptoOrder();
                            return(await Task.FromResult(Unit.Default));
                        }
                        tradeForBuyOrder.Status   = TradeStatus.Bought;
                        tradeForBuyOrder.BuyOrder = cryptoOrder;
                    }
                    break;
                }
            }
            finally
            {
                if (!IsInTestMode)
                {
                    var traderData = await _traderGrain.GetTraderData();

                    traderData.CurrentTicker = Ticker;
                    await _hubNotifier.UpdateTrader(traderData);
                }
            }
            return(await Task.FromResult(Unit.Default));
        }
Exemplo n.º 2
0
        protected StrategyTransaction CreateExitTransaction(Transaction t, string instrument, string side, string time, string type, double price, string id, string tradeId)
        {
            ITrade openTrade = Trades.FirstOrDefault(ot => ot.id == t.tradeId);

            if (openTrade != null)
            {
                ((MarketMinerTrade)openTrade).Closed = true;
            }

            return(CreateStrategyTransaction(instrument, side, time, type, price, null, null, id, null, tradeId));
        }
Exemplo n.º 3
0
        private void DrawEntryAndExit(Point canvasPoint, int slotNumber)
        {
            if (!(0 <= canvasPoint.Y && canvasPoint.Y <= AvailableHeight))
            {
                return;
            }

            var barsPlot = Plots.FirstOrDefault(p => p.Type == PlotType.Candlestick);

            if (barsPlot == null)
            {
                return;
            }

            var pb = PlotBoundaries[barsPlot];

            var i = SlotOffset + slotNumber - pb.Left;

            if (i < 0)
            {
                return;
            }
            var bar   = ((DataSeries <Bar>)barsPlot.DataSeries)[i];
            var trade = Trades.FirstOrDefault(t => t.EntryTime.Date == bar.Timestamp);

            if (trade == null)
            {
                return;
            }

            //var p1 = PointToCanvas(0, trade.Entry, ViewRegion);
            //var xBase = slotNumber * ParentChart.SlotPxWidth;
            var p1    = PointToCanvas(slotNumber, trade.Entry, ViewRegion);
            var xBase = p1.X - ParentChart.SlotPxWidth / 2;

            var entryColor = trade.PositionDirection == PositionDirection.Long ? CandleGreen : CandleRed;

            EntryArrow = AddPolygon(Brushes.Black, 1, entryColor,
                                    new Point(xBase, p1.Y),
                                    new Point(xBase - 8, p1.Y - 8),
                                    new Point(xBase - 8, p1.Y + 8));

            var p2 = PointToCanvas(0, trade.Exit, ViewRegion);

            xBase += ParentChart.SlotPxWidth;
            var exitColor = trade.PositionDirection == PositionDirection.Short ? CandleGreen : CandleRed;

            ExitArrow = AddPolygon(Brushes.Black, 1, exitColor,
                                   new Point(xBase, p2.Y),
                                   new Point(xBase + 8, p2.Y - 8),
                                   new Point(xBase + 8, p2.Y + 8));
        }
Exemplo n.º 4
0
        /// <summary>
        /// Clears the state items associated with an inactive thrust.
        /// </summary>
        /// <param name="chart">The chart containing the thrust pattern to be purged.</param>
        /// <param name="thrust">The inactive thrust pattern to be purged.</param>
        /// <returns></returns>
        protected virtual async Task PurgeThrust(Chart chart, Thrust thrust)
        {
            // kill and save the signal
            MCE.Signal signal = await SubscriptionCaller.Instance().GetSignalAsync(thrust.SignalID);

            signal.Active = false;
            await SubscriptionCaller.Instance().UpdateSignalAsync(signal);

            // clear the chart
            chart.Patterns.RemoveAll(p => p.Type == MACC.Constants.SignalType.Thrust);
            Orders.Remove(Orders.FirstOrDefault(o => ((MarketMinerOrder)o).SignalID == signal.SignalID));
            Trades.Remove(Trades.FirstOrDefault(t => ((MarketMinerTrade)t).SignalID == signal.SignalID));
        }
Exemplo n.º 5
0
 public ITrade GetTradeById(string tradeId)
 {
     return(Trades.FirstOrDefault(tr => tr.Id == tradeId));
 }
        public MainViewModel()
        {
            Events = new ObservableCollection <string>();

            _authService = ApiServiceBuilder <IUserService>
                           .Build(TradeServiceReferential.ServiceHost)
                           .Create();

            _userToken = _authService.Login(new Credentials()
            {
                Username = "******",
                Password = "******"
            }).Result;

            AppCore.Instance.ObjectProvider.Configure(config => config.For <TradeServiceToken>().Use(_userToken));

            _tradeService = ApiServiceBuilder <ITradeService> .Build(TradeServiceReferential.ServiceHost)
                            .AddAuthorizationHeader(() => _userToken.Digest)
                            .Create();

            _priceEventService = SignalRServiceBuilder <Price, PriceRequest>
                                 .Create()
                                 .Build(new PriceRequest((p) => true), (opts) =>
            {
                opts.AccessTokenProvider = () => Task.FromResult(_userToken.Digest);
            });

            _priceEventService
            .Connect(Scheduler.Default, 1000)
            .Subscribe((priceEvent) =>
            {
                foreach (var trade in Trades.Where(trade => trade.Asset == priceEvent.Asset).ToList())
                {
                    Application.Current.Dispatcher.Invoke(() => trade.CurrentPrice = priceEvent.Value);
                }

                var ev = MakeEvent("PRICE", "PRICE", priceEvent.Asset, priceEvent.Value);
                this.Notify(ev);
            });


            _tradeEventService = SignalRServiceBuilder <TradeEvent, TradeEventRequest>
                                 .Create()
                                 .Build(new TradeEventRequest((p) => true), (opts) =>
            {
                opts.AccessTokenProvider = () => Task.FromResult(_userToken.Digest);
            });

            _tradeEventService
            .Connect(Scheduler.Default, 500)
            .Subscribe((tradeEvent) =>
            {
                Application.Current.Dispatcher.Invoke(() =>
                {
                    var trade = Trades.FirstOrDefault(t => t.Id == tradeEvent.TradeId);
                    if (null == trade)
                    {
                        return;
                    }
                    trade.Status = tradeEvent.Status;
                });

                this.Notify(MakeEvent("TRADE", _tradeEventService.Current.Endpoint, tradeEvent.TradeId, tradeEvent.Status));
            });


            Trades = new ObservableCollection <TradeViewModel>();

            MakeTrade = new Command(async() =>
            {
                var asset        = TradeServiceReferential.Assets.Random();
                var counterparty = TradeServiceReferential.Counterparties.Random();

                var rand = new Random();

                var request = new TradeCreationRequest()
                {
                    Counterparty = counterparty,
                    Asset        = asset.Name,
                    Price        = asset.Price,
                    Volume       = rand.Next(1, 50),
                    Way          = TradeWay.Buy
                };

                var tradeEvent = await _tradeService.CreateTrade(request);

                var trade = await _tradeService.GetTradeById(tradeEvent.TradeId);

                Application.Current.Dispatcher.Invoke(() => Trades.Add(new TradeViewModel(trade)));
            });

            Application.Current.Dispatcher.Invoke(async() =>
            {
                var trades = await _tradeService.GetAllTrades();

                foreach (var trade in trades)
                {
                    var vm = new TradeViewModel(trade);
                    Trades.Add(vm);
                }
            });
        }