コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
            }
        }
コード例 #6
0
        /// <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);
        }
コード例 #7
0
        /// <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);
            }
        }
コード例 #8
0
        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);
            }
        }
コード例 #9
0
        //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);
            }
        }