private string PrimaryValue(DateTime Time, Candle_Interval Interval) { string result = ""; switch (Interval) { case Candle_Interval.oneMin: result = Time.Minute.ToString(); break; case Candle_Interval.fiveMin: result = Time.Minute.ToString(); break; case Candle_Interval.thirtyMin: result = Time.Minute.ToString(); break; case Candle_Interval.hour: result = Time.Hour.ToString(); break; case Candle_Interval.day: result = Time.Day.ToString(); break; } return(result); }
/// <summary> /// Период через которое вызывать таймер Update /// </summary> /// <returns></returns> public static TimeSpan TimerPeriod(Candle_Interval Interval) { TimeSpan timeSpan = TimeSpan.FromMinutes(1); switch (Interval) { case Candle_Interval.oneMin: timeSpan = TimeSpan.FromMinutes(1); break; case Candle_Interval.fiveMin: timeSpan = TimeSpan.FromMinutes(5); break; case Candle_Interval.thirtyMin: timeSpan = TimeSpan.FromMinutes(30); break; case Candle_Interval.hour: timeSpan = TimeSpan.FromHours(1); break; case Candle_Interval.day: timeSpan = TimeSpan.FromDays(1); break; } return(timeSpan); }
static public DateTime AddPeriod(DateTime Time, Candle_Interval Interval) { DateTime result = Time; switch (Interval) { case Candle_Interval.oneMin: result = result.AddMinutes(1); break; case Candle_Interval.fiveMin: result = result.AddMinutes(5); break; case Candle_Interval.thirtyMin: result = result.AddMinutes(30); break; case Candle_Interval.hour: result = result.AddHours(1); break; case Candle_Interval.day: result = result.AddDays(1); break; } return(result); }
private TimeInterval GetTimeInterval(Candle_Interval cinterval) { var tinterv = TimeInterval.Hours_1; switch (cinterval) { case Candle_Interval.oneMin: tinterv = TimeInterval.Minutes_1; break; case Candle_Interval.fiveMin: tinterv = TimeInterval.Minutes_5; break; case Candle_Interval.thirtyMin: tinterv = TimeInterval.Minutes_30; break; case Candle_Interval.hour: tinterv = TimeInterval.Hours_1; break; case Candle_Interval.day: tinterv = TimeInterval.Days_1; break; } return(tinterv); }
private async Task <Candle> GetLastCandle(BaseTypes.Market Market, Candle_Interval Interval, InvokePrint Print) { try { var tmp = await bittrex.GetLastCandle(Market.MarketName, Interval.ToString()); Candle result = new Candle { Open = tmp.Open, Hight = tmp.Hight, Low = tmp.Low, Close = tmp.Close, Time = tmp.Time }; return(result); } catch (Exception ex) { System.Media.SystemSounds.Beep.Play(); Print("Ошибка BittrexApi GetLastCandle: " + ex.Message); return(null); } }
/// <summary> /// Количество секунд до первого запуска таймера Update /// </summary> /// <returns></returns> public static TimeSpan NextTimerTick(Candle_Interval Interval, InvokePrint Print) { int TimeShift = rand.Next(1, 10); DateTime NextTickTime = DateTime.Now; //ближайшее подходящее время для запуска TimeSpan resspan = new TimeSpan(); //осталось до NextTickTime switch (Interval) { case Candle_Interval.oneMin: { TimeSpan tspan = new TimeSpan(NextTickTime.Hour, NextTickTime.Minute, TimeShift); tspan = tspan.Add(TimeSpan.FromMinutes(1)); NextTickTime = NextTickTime.Date + tspan; resspan = NextTickTime - DateTime.Now; } break; case Candle_Interval.fiveMin: { TimeSpan tspan = new TimeSpan(NextTickTime.Hour, 5 * (int)Math.Truncate((double)NextTickTime.Minute / 5), TimeShift); tspan = tspan.Add(TimeSpan.FromMinutes(5)); NextTickTime = NextTickTime.Date + tspan; resspan = NextTickTime - DateTime.Now; } break; case Candle_Interval.thirtyMin: { TimeSpan tspan = new TimeSpan(NextTickTime.Hour, 30 * (int)Math.Truncate((double)NextTickTime.Minute / 30), TimeShift); tspan = tspan.Add(TimeSpan.FromMinutes(30)); NextTickTime = NextTickTime.Date + tspan; resspan = NextTickTime - DateTime.Now; } break; case Candle_Interval.hour: { TimeSpan tspan = new TimeSpan(NextTickTime.Hour, 0, TimeShift); tspan = tspan.Add(TimeSpan.FromHours(1)); NextTickTime = NextTickTime.Date + tspan; resspan = NextTickTime - DateTime.Now; } break; case Candle_Interval.day: { TimeSpan tspan = new TimeSpan(0, 0, TimeShift); tspan = tspan.Add(TimeSpan.FromDays(1)); NextTickTime = NextTickTime.Date + tspan; resspan = NextTickTime - DateTime.Now; } break; default: return(TimeSpan.FromMinutes(1)); } if (resspan < TimeSpan.FromSeconds(5)) { resspan.Add(TimerPeriod(Interval)); //уже здесь, вызов на следующий раз } Print("Следущее обновление через: " + resspan.ToString(@"hh\:mm\:ss")); return(resspan); }
/// <summary> /// Формирование последней свечи по MarketHistory /// </summary> /// <returns></returns> private async Task <List <BaseTypes.Candle> > CandleByMarketHistory(BaseTypes.Market Market, Candle_Interval Interval, InvokePrint Print) { try { List <Trade> mhist = await GetMarketHistory(Market, Print); Candle lastCandle = await GetLastCandle(Market, Interval, Print); List <BaseTypes.Candle> resCandles = new List <BaseTypes.Candle>(); DateTime NTime = StrategyTool.AddPeriod(lastCandle.Time, Interval); if (mhist[0].Timestamp > NTime && ConvertTime(mhist[0].Timestamp) != ConvertTime(NTime)) { resCandles.Add(new BaseTypes.Candle { Open = mhist[0].Price, Low = mhist[0].Price, Hight = mhist[0].Price, Close = mhist[0].Price, Time = NTime }); } else { return(null); } List <DateTime> times = new List <DateTime>(); times.Add(NTime); while (times.Last() < mhist[0].Timestamp) { times.Add(StrategyTool.AddPeriod(times.Last(), Interval)); } times.RemoveAt(times.Count - 1); int Cpos = times.Count - 1; decimal Hval = mhist[0].Price; decimal Lval = mhist[0].Price; for (int i = 1; i < mhist.Count - 1; i++) { if (mhist[i].Timestamp < times[Cpos]) //оформление свечи { resCandles.Last().Hight = Hval; resCandles.Last().Low = Lval; resCandles.Last().Open = mhist[i - 1].Price; Hval = mhist[i].Price; Lval = mhist[i].Price; Cpos = Cpos - 1; if (Cpos < 0) { break; } resCandles.Add(new BaseTypes.Candle { Open = mhist[i].Price, Low = mhist[i].Price, Hight = mhist[i].Price, Close = mhist[i].Price, Time = times[Cpos] }); } else //обновление max/min текущей свечи { if (Hval < mhist[i].Price) { Hval = mhist[i].Price; } if (Lval > mhist[i].Price) { Lval = mhist[i].Price; } } } if (Cpos >= 0) { resCandles.Last().Hight = Hval; resCandles.Last().Low = Lval; resCandles.Last().Open = mhist[mhist.Count - 1].Price; } resCandles.Reverse(); if (resCandles.Count > 0) { var tmp = await bittrex.GetTicker(Market.MarketName); decimal lastValue = tmp.Last.Value; if (lastValue > resCandles.Last().Hight) { resCandles.Last().Hight = lastValue; } else if (lastValue < resCandles.Last().Low) { resCandles.Last().Low = lastValue; } else { resCandles.Last().Close = lastValue; } } return(resCandles); } catch (Exception ex) { System.Media.SystemSounds.Beep.Play(); Print("Ошибка BittrexApi CandleByMarketHistory: " + ex.Message); return(null); } }
public async Task <List <BaseTypes.Candle> > GetCandles(BaseTypes.Market Market, Candle_Interval Interval, int Limit, InvokePrint Print) { try { var tmp = await bittrex.GetCandles(Market.MarketName, Interval.ToString()); List <Candle> BCandles = tmp.ToList(); List <BaseTypes.Candle> lastByHistory = await CandleByMarketHistory(Market, Interval, Print); List <BaseTypes.Candle> Candles = new List <BaseTypes.Candle>(BCandles.Count); foreach (var t in BCandles) { Candles.Add(new BaseTypes.Candle { Open = t.Open, Hight = t.Hight, Low = t.Low, Close = t.Close, Time = t.Time }); } if (lastByHistory != null) { Candles.AddRange(lastByHistory); } return(Candles); } catch (Exception ex) { System.Media.SystemSounds.Beep.Play(); Print(String.Format("Ошибка BittrexApi GetCandles: {0}.\r\nMarket: {1}, Interval: {2}", ex.Message, Market.ToString(), Interval.ToString())); return(null); } }
//max Limit=1000 public async Task <List <BaseTypes.Candle> > GetCandles(BaseTypes.Market Market, Candle_Interval Interval, int Limit, InvokePrint Print) { try { var tinterval = GetTimeInterval(Interval); var BCandles = await binanceClient.GetCandleSticks(Market.MarketName.Replace("-", ""), tinterval, null, null, Limit); var Candles = new List <BaseTypes.Candle>(); foreach (var t in BCandles) { Candles.Add(new BaseTypes.Candle { Open = t.Open, Hight = t.High, Low = t.Low, Close = t.Close, Time = TimeFromUTC(t.OpenTime) }); } return(Candles); } catch (Exception ex) { System.Media.SystemSounds.Beep.Play(); Print(String.Format("Ошибка BinanceApi GetCandles: {0}.\r\nMarket: {1}, Interval: {2}", ex.Message, Market.ToString(), Interval.ToString())); return(null); } }