// 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); }
/// <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)); }
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)); }
// 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); }
// 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); }
// 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); } }
// 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); }
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); }
// 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); }
public void Test() { //DisplayGainers(25); //return; DisplayRealizedVolatility(25); return; var xs = new XSymbol("BINANCE", "IOTXBTC"); FindBreakout(xs); //FindAllBreakouts("HITBTC"); }
// 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); } }
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>()); } }
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 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(); }
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); }
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 }
// 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()); }
// 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); } } }
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"); }
/// <summary> /// 设置控制台的绘制符号 /// </summary> /// <param name="symbol"></param> public void SetDrawSymbol(XSymbol symbol) { this.m_symbol = symbol; }
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()); } }
// 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()); }
// 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()); }
public void RangeHeightsTest() { var xs = new XSymbol("BINANCE", "TRXBTC"); RangeHeights(xs, 60, 12, 252 * 24); // 12 x 1-hour bars }
/// <summary> /// 构造函数 /// </summary> public XDraw() { this.m_symbol = XSymbol.RECT_EMPTY; this.m_backColor = ConsoleColor.Black; }
/// <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); }
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); }