예제 #1
0
        public IEnumerator getData(TimeFrame timeFrame)
        {
            int limit = MaxLimit;

            switch (timeFrame.period)
            {
            case Period.Minute:
            {
                data_frame = "histominute";
            }
            break;

            case Period.Hour:
            {
                data_frame = "histohour";
            }
            break;

            case Period.Day:
            {
                data_frame = "histoday";
            }
            break;

            default:
            {
                Debug.LogError("Для тайм фрейма с периодом " + timeFrame.period + " данные не доступны");
                yield break;
            }
            }

            string url = url_base + data_frame + "?fsym=" + base_currency_acronym +
                         "&tsym=" + reciprocal_currency_acronym +
                         "&limit=" + limit.ToString() +
                         //"&aggregate=" + aggregate.ToString() +
                         "&e=" + market_acronym;

            using (WWW www = new WWW(url))
            {
                yield return(www);

                while (!www.isDone)
                {
                    ;
                }

                if (www.error != null)
                {
                    throw new Exception(www.error);
                }
                else
                {
                    Debug.Log(www.text);
                    dc          = JsonUtility.FromJson <JsonData>(www.text);
                    dataEndTime = DateTimeTools.TimestampToDate(dc.TimeTo);
                    if (dataEndTime != dataEndTime.FloorToTimeFrame(TFrame))
                    {
                        dataEndTime = dataEndTime.UpToNextFrame(TFrame);
                    }
                    workEndTime = dataEndTime;

                    int i = 0;
                    try
                    { while (dc.Data[i].open == 0 && dc.Data[i].close == 0)
                      {
                          i++;
                      }
                    }
                    catch
                    {
                        Debug.Log(base_currency_acronym + ":" + reciprocal_currency_acronym);
                        Debug.Log("Количество данных:" + dc.Data.Length);
                        for (int j = 0; j != dc.Data.Length; j++)
                        {
                            Debug.Log("Цена открытия " + j + "й свечи:" + dc.Data[j].open + " Дата:" + DateTimeTools.TimestampToDate(dc.Data[j].time));
                        }
                        throw new ArgumentOutOfRangeException("dc.Data вышла за границы");
                    }
                    dataBeginTime = DateTimeTools.TimestampToDate(dc.Data[i].time).FloorToTimeFrame(TFrame);
                    workBeginTime = dataBeginTime;

                    candles = new List <PriceFluctuation>();
                    DateTime dt_current = dataBeginTime;
                    DateTime dt_next;
                    double   volume, open, close, low, high;


                    open = high = low = close = volume = 0;
                    double next_date_ts;
                    while (dt_current <= DataEndTime)
                    {
                        dt_next      = dt_current.UpToNextFrame(TFrame);
                        next_date_ts = DateTimeTools.DateToTimestamp(dt_next);
                        if (i != dc.Data.Length && dc.Data[i].time < next_date_ts)
                        {
                            open   = dc.Data[i].open;
                            low    = dc.Data[i].low;
                            high   = dc.Data[i].high;
                            volume = dc.Data[i].volumefrom;
                            i++;
                        }

                        while (i != dc.Data.Length && dc.Data[i].time < next_date_ts)
                        {
                            if (dc.Data[i].high > high)
                            {
                                high = dc.Data[i].high;
                            }
                            if (dc.Data[i].low < low)
                            {
                                low = dc.Data[i].low;
                            }
                            volume += dc.Data[i].volumefrom;
                            i++;
                        }

                        if (i == dc.Data.Length || dc.Data[i].time >= next_date_ts)
                        {
                            close = dc.Data[i - 1].close;
                        }

                        if (open != 0)
                        {
                            candles.Add(new PriceFluctuation(dt_current, volume, open, close, low, high));
                        }


                        dt_current = dt_next;
                        open       = high = low = close = volume = 0;
                    }
                    www.Dispose();
                    initialized = true;
                }
            }
        }