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