Exemplo n.º 1
0
        public async Task <Ticker> GetTicker(string market)
        {
            var ticker = await _api.GetTickerAsync(market);

            if (ticker != null)
            {
                return new Ticker
                       {
                           Ask    = ticker.Ask,
                           Bid    = ticker.Bid,
                           Last   = ticker.Last,
                           Volume = ticker.Volume.ConvertedVolume
                       }
            }
            ;

            return(null);
        }
Exemplo n.º 2
0
        public async Task doWork(object objState)
        {
            logger.Trace("Start getCandles");

            // retry 10 times and if still fails, just skip this timestamp.
            for (int retry = 0; retry < 10; retry++)
            {
                try
                {
                    // update the wallet.
                    this.myWallet = await getWallet();

                    logger.Trace($"Wallet: {myWallet[QUOTECURRENCY]}");
                    break;
                }
                catch (Exception ex)
                {
                    logger.Trace($"retry-{retry} wallet. {ex}");

                    if (retry >= 9)
                    {
                        throw new Exception("Give up after 10 tries");
                    }

                    Thread.Sleep(30000);
                }
            }

            int numTickers = this.Assets.Count();

            for (int i = 0; i < numTickers; i++)
            {
                var asset  = this.Assets[i];
                var ticker = asset.Ticker;
                try
                {
                    Console.Write(".");
                    var candles = (await api.GetCandlesAsync(ticker, CANDLEPERIODSECS, null, null, 300)).ToArray();
                    var cc      = candles[candles.Count() - 2];

                    IList <Quote> history = new List <Quote>();
                    foreach (var candle in candles)
                    {
                        history.Add(new Quote
                        {
                            Date   = candle.Timestamp,
                            Open   = candle.OpenPrice,
                            High   = candle.HighPrice,
                            Low    = candle.LowPrice,
                            Close  = candle.ClosePrice,
                            Volume = (decimal)candle.QuoteCurrencyVolume
                        });
                    }

                    // calculate RSI(14)
                    IList <RsiResult>        rsi      = Indicator.GetRsi(history, 14).ToArray();
                    IList <HeikinAshiResult> ha       = Indicator.GetHeikinAshi(history).ToArray();
                    IList <HeikinAshi>       ashiList = new List <HeikinAshi>();
                    foreach (var item in ha)
                    {
                        ashiList.Add(new HeikinAshi(item));
                    }

                    // remember to throw out the last candle because that is the active candle that is not completed yet.
                    var completedRSI  = rsi[rsi.Count - 2];
                    var previousRSI   = rsi[rsi.Count - 3];
                    var completedAshi = ashiList[ashiList.Count - 2];
                    var previousAshi  = ashiList[ashiList.Count - 3];

                    asset.UpdateOHLC(cc.Timestamp, cc.OpenPrice, cc.HighPrice, cc.LowPrice, cc.ClosePrice, cc.QuoteCurrencyVolume);
                    asset.RSI = completedRSI.Rsi.Value;

                    //var isBuy = this.checkRSI30UpCrossing(previousRSI.Rsi, completedRSI.Rsi) && !asset.HasTrade;
                    //var isBuy = completedRSI.Rsi < 20;
                    //var isSellProfit = completedRSI.Rsi > 69;
                    var isBuy        = completedAshi.Signal == HeikinAshi.HeikinAshiSignal.STRONGBUY && previousAshi.Signal != HeikinAshi.HeikinAshiSignal.STRONGBUY;
                    var isSellProfit = completedAshi.Signal == HeikinAshi.HeikinAshiSignal.STRONGSELL || previousAshi.Signal == HeikinAshi.HeikinAshiSignal.SELL;

                    if (isBuy && !asset.HasTrade)
                    {
                        var et = await api.GetTickerAsync(asset.Ticker);

                        asset.UpdatePrices(et.Last, et.Ask, et.Bid);
                        doBuy(asset);
                    }
                    else if (isSellProfit && asset.HasTrade)
                    {
                        var et = await api.GetTickerAsync(asset.Ticker);

                        asset.UpdatePrices(et.Last, et.Ask, et.Bid);
                        doSell(asset);
                    }
                }
                catch (Exception ex)
                {
                    logger.Trace(ex);
                }
            }

            // print out some trade summary
            var tradedAssets = this.Assets.Where(a => a.HasTrade);
            var timeStamps   = this.Assets.Select(a => a.TimeStamp).Distinct();

            logger.Trace(String.Join(",", timeStamps));
            foreach (var tA in tradedAssets)
            {
                logger.Trace($"{tA.Ticker}, BuyPrice: {tA.BuyPrice:0.000}, ClosePrice:{tA.ClosePrice:0.000}");
            }

            logger.Trace("End getCandles");
        }