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); }
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"); }