コード例 #1
0
        // Given a Global market symbol ("ADA-BTC", "ETH-BTC", "LTC-BTC", ...)
        // Return the ExchangeSymbol for the exchange on which this market trades
        private XSymbol GetExchangeSymbol(string gsymbol)
        {
            XSymbol xs;

            if (m_api.GlobalSymbols("BINANCE").Contains(gsymbol))
            {
                xs = new XSymbol("BINANCE", gsymbol);
            }
            else if (m_api.GlobalSymbols("BITTREX").Contains(gsymbol))
            {
                xs = new XSymbol("BITTREX", gsymbol);
            }
            else if (m_api.GlobalSymbols("HITBTC").Contains(gsymbol))
            {
                xs = new XSymbol("HITBTC", gsymbol);
            }
            //else if (m_api.GlobalSymbols("HUOBI").Contains(gsymbol))
            //    xs = new ExchangeSymbol("HUOBI", symbol, gsymbol);
            else if (m_api.GlobalSymbols("YOBIT").Contains(gsymbol))
            {
                xs = new XSymbol("YOBIT", gsymbol);
            }
            else if (m_api.GlobalSymbols("CRYPTOPIA").Contains(gsymbol))
            {
                xs = new XSymbol("CRYPTOPIA", gsymbol);
            }
            else
            {
                xs = new XSymbol("", gsymbol);
            }
            return(xs);
        }
コード例 #2
0
        /// <summary>
        /// 根据符号值获取其字符串表示
        /// </summary>
        /// <param name="symbol"></param>
        /// <returns></returns>
        public static String GetStringFromSymbol(XSymbol symbol)
        {
            UInt16 symbolVal = (UInt16)symbol;

            Byte[] bytes = { (Byte)((symbolVal & 0xFF00) >> 8), (Byte)(symbolVal & 0x00FF) };
            return(Encoding.Default.GetString(bytes));
        }
コード例 #3
0
        public void AnalyzeATR(XSymbol xs, int minutes, int atrLength)
        {
            var candles = m_maker.ReadCandles(xs.Exchange, xs.Symbol, minutes);
            var atr     = new AverageTrueRange(candles, atrLength);

            atr.Values.ToList().ForEach(kv => Console.WriteLine("{0,20}   {1:0.00000000}", kv.Key, kv.Value));
        }
コード例 #4
0
        // Retrieve the current list of ATR values
        private AverageTrueRange GetCurrentATR(XSymbol xs, int minutes, int atrLength)
        {
            var candles = m_maker.GetRecentCandles(xs, minutes);
            var atr     = new AverageTrueRange(candles, atrLength);

            return(atr);
        }
コード例 #5
0
        // where exchange like "BINANCE" and symbol like "BNBUSDT"
        public void CreateCandlesFile(XSymbol xs, int minutes, int iterationCount = 10)
        {
            var candles = GetCandles(xs, minutes, iterationCount, true);

            Console.WriteLine("Total candles: {0}", candles.Count);
            WriteCandles(xs, minutes, candles);
        }
コード例 #6
0
        // 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);
            }
        }
コード例 #7
0
 // where exchange like "BINANCE" and symbol like "ETHUSDT"
 public void CreateCandlesFiles(XSymbol xs)
 {
     CreateCandlesFile(xs, 24 * 60, 3);
     CreateCandlesFile(xs, 60, 5);
     CreateCandlesFile(xs, 30, 10);
     CreateCandlesFile(xs, 5, 20);
     CreateCandlesFile(xs, 1, 40);
 }
コード例 #8
0
        public void RealizedVolTest()
        {
            var xs    = new XSymbol("BINANCE", "TRXBTC");
            var rvol0 = RVol(xs, 60, 12, 252 * 24);                // 12 x 1-hour bars

            //var rvol1 = RVol("BINANCE", "TRXBTC", 1440, 12);          // 12 x 1-day bars
            //var rvol2 = RVol("BINANCE", "BTCUSDT", 1440, 12);
            //var rvol3 = RVol("BINANCE", "ETHUSDT", 1440, 12);
        }
コード例 #9
0
        // where exchange like "BINANCE"
        // where symbol like "TRXBTC"
        public void DownloadHistoricalData(XSymbol xs)
        {
            m_maker.CreateCandlesFile(xs, 60 * 24, 3);
            var it = 5;

            m_maker.CreateCandlesFile(xs, 60, it);
            m_maker.CreateCandlesFile(xs, 30, 2 * it);
            m_maker.CreateCandlesFile(xs, 15, 4 * it);
            m_maker.CreateCandlesFile(xs, 5, 12 * it);
            m_maker.CreateCandlesFile(xs, 1, 60 * it);
        }
コード例 #10
0
        public void Test()
        {
            //DisplayGainers(25);
            //return;

            DisplayRealizedVolatility(25);
            return;

            var xs = new XSymbol("BINANCE", "IOTXBTC");

            FindBreakout(xs);
            //FindAllBreakouts("HITBTC");
        }
コード例 #11
0
 // Check a given ExchangeSymbol for breakout
 public void FindBreakout(XSymbol xs)
 {
     try
     {
         int periodMinutes = 1;
         var candles       = m_api[xs.Exchange].GetCandles(xs.Symbol, periodMinutes * 60, null, null, 1000);
         Console.WriteLine("[{0} {1}] candles count: {2}", xs.Exchange, xs.Symbol, candles.Count());
     }
     catch (Exception ex)
     {
         Console.WriteLine("ERROR: {0}", ex.Message);
     }
 }
コード例 #12
0
 private IEnumerable <XCandle> Candles(XSymbol xs, int periodMinutes = 1, DateTime?startDate = null, DateTime?endDate = null, int?limit = null)
 {
     try
     {
         int periodSeconds = periodMinutes * 60;
         var candles       = m_api[xs.Exchange].GetCandles(xs.Symbol, periodSeconds, startDate, endDate, limit);
         return(candles.ToXCandles());
     }
     catch (Exception ex)
     {
         Console.WriteLine("{0}", ex.Message);
         return(new List <XCandle>());
     }
 }
コード例 #13
0
        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);
        }
コード例 #14
0
        public void WriteCandles(XSymbol xs, int minutes, List <XCandle> candles)
        {
            string filename = string.Format("candles_{0}_{1}_{2}", xs.Exchange, xs.Symbol, GetBarPeriod(minutes * 60));
            var    fout     = new OutputFile <MarketCandle>(filename, Folder.crypto_folder, false);

            // Write candles to file
            foreach (var c in candles)
            {
                var propValues = Reflection.GetPropertyValues <XCandle>(c);
                var svalues    = propValues.Select(p => string.Format("{0}", p));
                var csv        = string.Join(",", svalues);
                //Console.WriteLine(csv);
                fout.WriteLine(csv);
            }
            fout.Close();
        }
コード例 #15
0
        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);
        }
コード例 #16
0
        public void StartScalper(XSymbol xs, OrderSide initSide, decimal size, int minutes = 30)
        {
            var     candles   = m_maker.GetRecentCandles(xs, minutes);
            var     c         = candles.Last();
            decimal initPrice = c.ClosePrice;
            //var atr = GetCurrentATR(xs, minutes, atrLength: 12);
            var     atr      = new AverageTrueRange(candles, atrLength: 12);
            var     atrDate  = atr.Values.Last().Key;
            var     atrValue = atr.Values.Last().Value;
            decimal scalp    = (decimal)atrValue / 2.0M;     // scalp is half of ATR
            var     kv       = atr.Values.Last();
            var     pct      = (kv.Value / (double)c.ClosePrice) * 100;

            Console.WriteLine("[{0,-8} {1,8}] {2,2} minutes     ATR: {3}   {4:0.00000000}   {5:0.0000}% ({6,3:0} bips)   scalp:{7:0.00000000}  size:{8,5}  init_side:{9}", xs.Exchange, xs.Symbol, minutes, kv.Key, kv.Value, pct, pct * 100, scalp, size, initSide);

            if (m_testOnly == false)
            {
                Task.Run(() => ScalperTask(xs, initSide, initPrice, size, scalp));
            }

            Thread.Sleep(m_testOnly ? 3500 : 1500);                 // slight delay so we don't choke the API
        }
コード例 #17
0
        // Returns List of candles sorted by Timestamp
        public List <XCandle> GetCandles(XSymbol xs, int minutes = 60, int iterationCount = 1, bool force = false, bool display = false)
        {
            var candles = Candles(xs, minutes).ToList();
            int count   = candles.Count;

            if (count == 0)
            {
                return(candles);
            }
            DateTime firstTime = candles.First().Timestamp;

            for (int i = 0; i < iterationCount; ++i)
            {
                if (display)
                {
                    Console.WriteLine("[{0,-8} {1,-6}] Retrieved {2} candles", xs.Exchange, xs.Symbol, count);
                }
                //Console.WriteLine("first: {0}", firstTime);
                var st       = firstTime.Subtract(TimeSpan.FromMinutes(count * minutes));
                var c        = Candles(xs, minutes, st);
                var lastTime = c.Last().Timestamp;
                if (lastTime >= firstTime)
                {
                    var subset = c.Where(r => r.Timestamp < firstTime);
                    candles.InsertRange(0, subset.ToList());
                }
                else
                {
                    candles.InsertRange(0, c);
                }
                if (xs.Exchange == "BINANCE" && c.Count() < 1000)
                {
                    break;
                }
                firstTime = candles.First().Timestamp;
            }
            return(candles.OrderBy(c => c.Timestamp).ToList());
        }
コード例 #18
0
 // Display the ATR value for different bar periods (60, 30, 5, 1) along with their value relative to price as %/bips
 private void DisplayATRs(XSymbol xs)
 {
     Console.WriteLine(new string('-', 100));
     //int[] periods = { 60, 30, 5, 1 };
     int[] periods = { 30 };
     foreach (int minutes in periods)
     {
         try
         {
             var candles = m_maker.GetRecentCandles(xs, minutes);
             var c       = candles.Last();
             //var atr = GetCurrentATR(xs, minutes, atrLength: 12);
             var atr = new AverageTrueRange(candles, atrLength: 12);
             var kv  = atr.Values.Last();
             var pct = (kv.Value / (double)c.ClosePrice) * 100;
             Console.WriteLine("[{0,-8} {1,8}] {2,2} minutes     ATR: {3}   {4:0.00000000}   {5:0.0000}% ({6:0} bips)", xs.Exchange, xs.Symbol, minutes, kv.Key, kv.Value, pct, pct * 100);
         }
         catch (Exception ex)
         {
             Console.WriteLine("[{0,-8} {1,8}] {2}", xs.Exchange, xs.Symbol, ex.Message);
         }
     }
 }
コード例 #19
0
        public void AnalyzerTest()
        {
            m_maker = new CandlestickMaker();

            //DownloadHistoricalData("BINANCE", "XMRBTC"); return;

            /*var pathname = Path.Combine(Folder.crypto_folder, "analyzer_output.txt");
             * OpenCoutFile(pathname);
             *
             * var renko = new Renko("BINANCE", "TRXBTC", 12);
             * //var renko = new Renko("BINANCE", "NEOUSDT", 12);
             *
             * CloseCoutFile();*/


            var xsym = new XSymbol("BINANCE", "BNBUSDT");

            AnalyzeATR(xsym, 30, 12);

            return;

            BinanceRenko("XLMBTC");

            BinanceRenko("ADAUSDT");
            BinanceRenko("BCCUSDT");
            BinanceRenko("BNBUSDT");
            BinanceRenko("BTCUSDT");
            BinanceRenko("ETHUSDT");
            BinanceRenko("LTCUSDT");
            BinanceRenko("NEOUSDT");
            BinanceRenko("QTUMUSDT");
            BinanceRenko("XRPUSDT");

            BinanceRenko("XMRBTC");
            BinanceRenko("ZECBTC");
            BinanceRenko("ZRXBTC");
        }
コード例 #20
0
 /// <summary>
 /// 设置控制台的绘制符号
 /// </summary>
 /// <param name="symbol"></param>
 public void SetDrawSymbol(XSymbol symbol)
 {
     this.m_symbol = symbol;
 }
コード例 #21
0
        private void ScalperTask(XSymbol xs, OrderSide initSide, decimal initPrice, decimal amount, decimal scalp)
        {
            Console.WriteLine("\n===== Starting Scalper  {0}   init_price:{1:0.00000000}  amount:{2}  scalp:{3:0.00000000} =====", xs, initPrice, amount, scalp);

            var api = m_api[xs.Exchange];

            string strategyId = "scalper";
            ExchangeOrderResult working;

            if (initSide == OrderSide.Sell)
            {
                working = m_om.PlaceOrder(api, xs.Symbol, initSide, initPrice + scalp, amount, strategyId);
            }
            else
            {
                working = m_om.PlaceOrder(api, xs.Symbol, initSide, initPrice - scalp, amount, strategyId);
            }
            Console.WriteLine("\n   NEW working order >>> {0} ", working.ToStr());

            int count = 0;

            while (true)
            {
                Thread.Sleep(m_testOnly ? 25000 : 15000);

                var t = api.GetTicker(xs.Symbol);

                //if (working.Result == ExchangeAPIOrderResult.Filled)
                // If our working order has been filled
                if (m_orders.Where(o => o.OrderId == working.OrderId).Count() == 0)
                {
                    var buySell  = working.IsBuy ? "BOT" : "SOLD";
                    var prowlEvt = string.Format("Fill {0} {1} {2:0.00000000}", working.Symbol, buySell, working.Price);
                    if (working.IsBuy)
                    {
                        working = m_om.PlaceOrder(api, xs.Symbol, OrderSide.Sell, initPrice + scalp, amount, strategyId);
                    }
                    else
                    {
                        working = m_om.PlaceOrder(api, xs.Symbol, OrderSide.Buy, initPrice - scalp, amount, strategyId);
                    }
                    Console.WriteLine("\n*** {0} ***\n   NEW working order >>> {1}", prowlEvt, working.ToStr());
                    m_prowl.Send(prowlEvt, working.ToMsgStr());
                }
                else if (Math.Abs(t.Last - initPrice) > 2 * scalp)  // if price breakout of range
                {
                    string dir = "up";
                    if (t.Last < initPrice)
                    {
                        dir = "down";
                    }
                    if (working.Side() == initSide)
                    {
                        m_om.Cancel(working);
                    }
                    initPrice = t.Last;
                    if (initSide == OrderSide.Sell)
                    {
                        working = m_om.PlaceOrder(api, xs.Symbol, initSide, initPrice + scalp, amount, strategyId);
                    }
                    else
                    {
                        working = m_om.PlaceOrder(api, xs.Symbol, initSide, initPrice - scalp, amount, strategyId);
                    }
                    Console.WriteLine("\n*** Price Breakout {0} {1} ***\n   NEW working order >>> {2} ", xs.Symbol, dir, working.ToStr());
                    //m_prowl.Send(string.Format("Breakout {0} {1}", working.Symbol, dir), working.ToMsgStr());
                }

                if (count % 4 == 0)
                {
                    Console.Write(".");
                }
                //if (count % 10 == 0) Console.WriteLine("{0}", working.ToStr());
            }
        }
コード例 #22
0
        // Retrieve the current candle for the given bar period (minutes)
        private XCandle GetCurrentCandle(XSymbol xs, int minutes)
        {
            var candles = m_maker.GetRecentCandles(xs, minutes);

            return(candles.Last());
        }
コード例 #23
0
        // Get the most recent candles with the specified bar period (minutes)
        // Returns List of candles sorted by Timestamp
        public List <XCandle> GetRecentCandles(XSymbol xs, int minutes = 60)
        {
            var candles = Candles(xs, minutes).ToList();

            return(candles.OrderBy(c => c.Timestamp).ToList());
        }
コード例 #24
0
        public void RangeHeightsTest()
        {
            var xs = new XSymbol("BINANCE", "TRXBTC");

            RangeHeights(xs, 60, 12, 252 * 24);                // 12 x 1-hour bars
        }
コード例 #25
0
 /// <summary>
 /// 构造函数
 /// </summary>
 public XDraw()
 {
     this.m_symbol    = XSymbol.RECT_EMPTY;
     this.m_backColor = ConsoleColor.Black;
 }
コード例 #26
0
 /// <summary>
 /// 使用指定颜色清屏
 /// </summary>
 public void Clear(ConsoleColor color)
 {
     this.m_symbol    = XSymbol.DEFAULT;
     this.m_backColor = color;
     FillRect(0, 0, Console.WindowWidth >> 1, Console.WindowHeight, color);
 }
コード例 #27
0
        public static XSourceEntity FindElementInFile(XFile file, XPETypeSymbol petype, XSymbol element)
        {
            var walker = new SourceWalker(file, false);

            walker.Parse(false);
            var           entities = walker.EntityList;
            XSourceEntity result   = null;

            if (petype.IsFunctionsClass)
            {
                foreach (var entity in entities)
                {
                    if (entity.Prototype == element.Prototype)
                    {
                        result = entity;
                        break;
                    }
                }
            }
            else
            {
                foreach (var entity in entities)
                {
                    if (entity.FullName == element.FullName)
                    {
                        result = entity;
                        break;
                    }
                }
            }
            return(result);
        }