public static string TimespanToDurationString(TimeSpan t, BarSize minFreq) { // duration: // This is the time span the request will cover, and is specified using the // format: , i.e., 1 D, where valid units are: S (seconds) D (days) W (weeks) // M (months) Y (years) If no unit is specified, seconds are used. "years" is // currently limited to one. if (minFreq > BarSize.OneMonth) { return(Math.Ceiling(Math.Max(1, t.TotalDays / 365)).ToString("0") + " Y"); } if (minFreq >= BarSize.OneMonth) { return(Math.Ceiling(Math.Max(1, t.TotalDays / 29)).ToString("0") + " M"); } if (minFreq >= BarSize.OneWeek) { return(Math.Ceiling(Math.Max(1, t.TotalDays / 7)).ToString("0") + " W"); } if (minFreq >= BarSize.OneDay || t.TotalSeconds > 86400) { if (t.TotalDays > 14) { //This is a ridiculous hack made necessary by the incredibly bad TWS API //For longer periods, if we specify the period as a # of days, the request is rejected! //so instead we do it as the number of weeks and everything is A-OK return(Math.Ceiling(t.TotalDays / 7).ToString("0") + " W"); } return(Math.Ceiling(Math.Max(1, t.TotalDays)).ToString("0") + " D"); } return(Math.Abs(Math.Ceiling(t.TotalSeconds)).ToString("0") + " S"); }
/// <summary> /// Returns the maximum period length of a historical data request, in seconds, depending on the data frequency. /// </summary> /// <param name="frequency"></param> /// <returns>Maximum allowed length in </returns> public static int MaxRequestLength(BarSize frequency) { //The limitations are laid out here: https://www.interactivebrokers.com/en/software/api/apiguide/tables/historical_data_limitations.htm if (frequency <= BarSize.OneSecond) { return(1800); } if (frequency <= BarSize.FiveSeconds) { return(7200); } if (frequency <= BarSize.FifteenSeconds) { return(14400); } if (frequency <= BarSize.ThirtySeconds) { return(24 * 3600); } if (frequency <= BarSize.OneMinute) { return(2 * 24 * 3600); } if (frequency <= BarSize.ThirtyMinutes) { return(7 * 24 * 3600); } if (frequency <= BarSize.OneHour) { return(29 * 24 * 3600); } return(365 * 24 * 3600); }
public static Krs.Ats.IBNet.BarSize BarSizeConverter(BarSize freq) { switch (freq) { case BarSize.Tick: throw new Exception("Bar size conversion impossible, TWS does not suppor tick BarSize"); case BarSize.OneSecond: return(Krs.Ats.IBNet.BarSize.OneSecond); case BarSize.FiveSeconds: return(Krs.Ats.IBNet.BarSize.FiveSeconds); case BarSize.FifteenSeconds: return(Krs.Ats.IBNet.BarSize.FifteenSeconds); case BarSize.ThirtySeconds: return(Krs.Ats.IBNet.BarSize.ThirtySeconds); case BarSize.OneMinute: return(Krs.Ats.IBNet.BarSize.OneMinute); case BarSize.TwoMinutes: return(Krs.Ats.IBNet.BarSize.TwoMinutes); case BarSize.FiveMinutes: return(Krs.Ats.IBNet.BarSize.FiveMinutes); case BarSize.FifteenMinutes: return(Krs.Ats.IBNet.BarSize.FifteenMinutes); case BarSize.ThirtyMinutes: return(Krs.Ats.IBNet.BarSize.ThirtyMinutes); case BarSize.OneHour: return(Krs.Ats.IBNet.BarSize.OneHour); case BarSize.OneDay: return(Krs.Ats.IBNet.BarSize.OneDay); case BarSize.OneWeek: return(Krs.Ats.IBNet.BarSize.OneWeek); case BarSize.OneMonth: return(Krs.Ats.IBNet.BarSize.OneMonth); case BarSize.OneQuarter: throw new Exception("Bar size conversion impossible, TWS does not suppor quarter BarSize."); case BarSize.OneYear: return(Krs.Ats.IBNet.BarSize.OneYear); default: return(Krs.Ats.IBNet.BarSize.OneDay); } }
/// <summary> /// Sets the appropriate closing time for each bar, since IB only gives us the opening time. /// </summary> private static void GenerateIntradayBarClosingTimes(List <OHLCBar> bars, BarSize frequency) { var freqTs = frequency.ToTimeSpan(); for (var i = 0; i < bars.Count; i++) { var bar = bars[i]; if (i == bars.Count - 1) { //if it's the last bar we are basically just guessing the //closing time by adding the duration of the frequency if (bar.DateTimeOpen != null) { bar.DateTimeClose = bar.DateTimeOpen.Value + freqTs; } } else { //if it's not the last bar, we set the closing time to the //earliest of the open of the next bar and the period of the frequency //e.g. if hourly bar opens at 9:30 and the next bar opens at 10:00 //we set the close at the earliest of 10:00 and 10:30 if (bar.DateTimeOpen != null) { var openPlusBarSize = bar.DateTimeOpen.Value + freqTs; DateTime?dateTime = bars[i + 1].DateTimeOpen; if (dateTime != null) { bar.DateTimeClose = dateTime.Value < openPlusBarSize ? dateTime.Value : openPlusBarSize; } } } } }