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