// Display realized volatility for top-ranked (by market cap) cryptos from CoinMarketCap private void DisplayRealizedVolatility(int limit = 50) { int numberOfBars = 12; var top = m_cmc.GetRankings(limit); foreach (var t in top) { var exchange = "BINANCE"; string symbol; string[] mainSymbols = { "ADA", "BCC", "BNB", "BTC", "EOS", "ETH", "IOTA", "LTC", "NEO", "QTUM", "TUSD", "XLM", "XRP" }; if (mainSymbols.Contains(t.symbol)) { symbol = t.symbol + "USDT"; } else { symbol = t.symbol + "BTC"; } var xs = new XSymbol(exchange, symbol); var candles = m_maker.GetCandles(xs, 1440, 1); if (candles.Count < numberOfBars) { continue; } var rvol = new RealizedVolatility(candles, numberOfBars); //var mr = CoinMarketCapApi.GetMarkets(t.name); //var marketExchanges = mr.Select(m => m.exchange).Distinct(); Console.WriteLine("{0,4} {1,-7} {2,6:0.00}", t.rank, t.symbol, rvol.Value); } }
public decimal RVol(XSymbol xs, int minutes = 1440, int numberOfBars = 12, int numerator = 252, int iterationCount = 1) { var candles = GetCandles(xs, minutes, iterationCount, true); var rvol = new RealizedVolatility(candles, numberOfBars, numerator); var value = rvol.Value; var t = m_api.bina.GetTicker(xs.Symbol); //rvol.Range(out var low, out var high, t.MidPrice(), 2.0M); //Console.WriteLine("[{0,-8} {1,-6}] minutes:{2} nbars:{3} Range: {4:0.00000000} - {5:0.00000000}", exchange, symbol, minutes, numberOfBars, low, high); //Console.WriteLine("[{0,-8} {1,-6}] minutes:{2} nbars:{3} RealizedVol={4:0.00000000}", exchange, symbol, minutes, numberOfBars, value); var rangeHeight = rvol.RangeHeight(t.MidPrice(), 2.0M); // height of +/- 2 stddev range around current Ticker price Console.WriteLine("[{0,-8} {1,-6}] minutes:{2} nbars:{3} RangeHeight: {4:0.00000000}", xs.Exchange, xs.Symbol, minutes, numberOfBars, rangeHeight); return(rangeHeight); }
public void RangeHeights(XSymbol xs, int minutes = 1440, int numberOfBars = 12, int numerator = 252, int iterationCount = 1) { var candles = GetCandles(xs, minutes, iterationCount, true); var rvol = new RealizedVolatility(candles, numberOfBars, numerator); var heights = rvol.RangeStdValues; var candleMap = rvol.CandleMap; var minuteCandles = GetCandles(xs, 1, 10, true); var nstddev = 2.0M; // two standard deviations foreach (var kv in heights) { var ts = kv.Key; var stdValue = kv.Value; var candle = candleMap[ts]; Console.WriteLine("{0} {1:0.00000000}", ts, 2 * nstddev * stdValue); // stddev goes up and down, so multiply by 2 } //var t = m_api.bina.GetTicker(symbol); }
private void ConstructRenko() { cout("Exchange: {0} Symbol: {1} lookback: {2}", m_exchange, m_symbol, m_nbars); //m_hourCandles = m_maker.GetCandles(m_exchange, m_symbol, minutes: 60, iterationCount: 1, force: true); m_hourCandles = m_maker.ReadCandles(m_exchange, m_symbol, minutes: 60); var rvol = new RealizedVolatility(m_hourCandles, m_nbars, numerator: 252 * 24); var heights = rvol.RangeStdValues; var candleMap = rvol.CandleMap; /*var nstddev = 2.0M; // two standard deviations * foreach (var kv in heights) * { * var ts = kv.Key; * var stdValue = kv.Value; * var candle = candleMap[ts]; * cout("{0} {1:0.00000000}", ts, 2 * nstddev * stdValue); // stddev goes up and down, so multiply by 2 * }*/ // Now iterate through the 1-minute bars to construct the Renko boxes //m_minuteCandles = m_maker.GetCandles(m_exchange, m_symbol, minutes: 1, iterationCount: 20, force: true); m_minuteCandles = m_maker.ReadCandles(m_exchange, m_symbol, minutes: 1); //cout("minute candles count: {0}", m_minuteCandles.Count); //var stdMult = 2.0M; // multiply stddev * 2 (+/- 2 stddev of price will be used) var stdMult = 2.8M; // multiply stddev * 2 (+/- 2 stddev of price will be used) decimal price = decimal.MinValue; decimal boxHeight; decimal triggerUp = 0, triggerDown = 0; DateTime startTime = DateTime.MinValue, endTime = DateTime.MinValue; foreach (var mc in m_minuteCandles) { var hourTimestamp = m_hourCandles.Where(c => c.Timestamp <= mc.Timestamp).Last().Timestamp; if (price == decimal.MinValue) { price = mc.OpenPrice; boxHeight = stdMult * heights[hourTimestamp]; triggerUp = price + boxHeight; triggerDown = price - boxHeight; startTime = mc.Timestamp; } var h = mc.HighPrice; var l = mc.LowPrice; if (h > triggerUp || l < triggerDown) { endTime = mc.Timestamp; var startTimeStr = startTime.ToString("MM/dd HH:mm"); var endTimeStr = endTime.ToString("MM/dd HH:mm"); if (h > triggerUp && l < triggerDown) { cout("ERROR! These should not BOTH be true!"); } if (h > triggerUp) { //cout("HIGH minute bar timestamp: {0} hour bar timestamp: {1} {2:0.00000000} {3:0.00000000} {4} to {5}", mc.Timestamp, hourTimestamp, h, triggerUp, startTime, endTime); cout("UP bar {0:0.00000000} {1:0.00000000} {2:0.00000000} {3} to {4} {5,6:0.0} minutes", price, triggerUp, triggerUp - price, startTimeStr, endTimeStr, endTime.Subtract(startTime).TotalMinutes); price = triggerUp; } else if (l < triggerDown) { //cout("LOW minute bar timestamp: {0} hour bar timestamp: {1} {2:0.00000000} {3:0.00000000} {4} to {5}", mc.Timestamp, hourTimestamp, l, triggerDown, startTime, endTime); cout("DOWN bar {0:0.00000000} {1:0.00000000} {2:0.00000000} {3} to {4} {5,6:0.0} minutes", price, triggerDown, price - triggerDown, startTimeStr, endTimeStr, endTime.Subtract(startTime).TotalMinutes); price = triggerDown; } boxHeight = stdMult * heights[hourTimestamp]; triggerUp = price + boxHeight; triggerDown = price - boxHeight; startTime = mc.Timestamp; } } }