// 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);
        }
Beispiel #4
0
        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;
                }
            }
        }