IScalableDataManager CreateRandomDataManager(int trynumber = 0) { //В зависимости от типа мэнеджера должен выбираться нужный тайм-фрейм Period[] values = { /* Period.Minute, */ Period.Hour, Period.Day }; Period randomValue = values[UnityEngine.Random.Range(0, values.Length)]; int[] availablePeriodSizes; switch (randomValue) { case Period.Minute: { availablePeriodSizes = new int[] { 1, 5 }; // { 1, 5 ,10,15,20,30}; } break; case Period.Hour: { availablePeriodSizes = new int[] { 1, 3, 4 }; //{ 1, 3, 4, 6, 12 }; } break; case Period.Day: { availablePeriodSizes = new int[] { 1, 3 }; } break; default: { throw new ArgumentOutOfRangeException("Enum присвоено не верное значение"); } } int periodSize = availablePeriodSizes[UnityEngine.Random.Range(0, availablePeriodSizes.Length)]; int randAssetId = UnityEngine.Random.Range(0, assets.Length); /*//////////////////////////// * //Для теста рабочей области// * ////////////////////////////// * randomValue = Period.Minute; * periodSize = 1; * //*/ TimeFrame timeFrame = new TimeFrame(randomValue, periodSize); //TODO: Здесь должен быть случайный выбор из любых доступных менеджеров IScalableDataManager dm = new CryptoCompareDataManager(timeFrame, assets[randAssetId].base_currency, assets[randAssetId].reciprocal_currency, assets[randAssetId].exchange); int fluctuations = DateTimeTools.CountFramesInPeriod(dm.TFrame, dm.DataBeginTime, dm.DataEndTime, TimeSpan.Zero); if (fluctuations < MIN_FLUCTUATIONS_AMOUNT && trynumber < 10) { Debug.Log("Недостаточное количество свечей пробуем загрузить другой"); dm = CreateRandomDataManager(trynumber++); } if (trynumber > 10) { Debug.LogError("Не удалось загрузить подходящий условиям график"); return(null); } return(dm); }
public void LoadGame(Mode mode = Mode.Simple) { gameMode = mode; switch (gameMode) { case Mode.Simple: { //Создаём отрисовщик графика chartDataManager = CreateRandomDataManager(); //Задаём рандомную временнУю область игры. Некоторое количество свечей предыстории, некоторое количество свечей на игру int fluctuationCount = DateTimeTools.CountFramesInPeriod(chartDataManager.TFrame, chartDataManager.DataBeginTime, chartDataManager.DataEndTime, TimeSpan.Zero); SetRandomGameTime(fluctuationCount); chartDataManager.SetWorkDataRange(fluctuation1ID, fluctuationsCountToLoad); } break; default: { Debug.LogError("Не создан сценарий для данного мода"); } break; } //задаём систему координат coordGrid = new CoordinateGrid(chartDataManager.WorkBeginTime, chartDataManager.TFrame); chartDrawer.ReloadData(); chartDrawer.ChartDataManager = chartDataManager; chartDrawer.CoordGrid = coordGrid; chartDrawer.CalculateMovingAverage(0, gamePrefs.Fast_ma_length); chartDrawer.CalculateMovingAverage(1, gamePrefs.Slow_ma_length); coordGrid.OnScaleChange += chartDrawer.UpdateInNextFrame; //Передаём ссылки на необходимые классы контроллеру навигации на графике NavigationController.Instance.ChartDataManager = chartDataManager; NavigationController.Instance.CoordGrid = coordGrid; NavigationController.Instance.Initialize(); PlayerManager.Instance.InitializeData(chartDataManager); PlayerManager.Instance.TradeIsClosed += ClosedTradeEffect; PlayerManager.Instance.TradeIsOpened += (price, position) => { current_price = (double)price; }; UpdatePlayersInfoFields(); chartDataManager.WorkFlowChanged += () => { chartDrawer.UpdateMovingAverage(0, gamePrefs.Fast_ma_length); }; chartDataManager.WorkFlowChanged += () => { chartDrawer.UpdateMovingAverage(1, gamePrefs.Slow_ma_length); }; gamePrefs.FastMALengthChanged += (x) => { chartDrawer.CalculateMovingAverage(0, x); }; gamePrefs.SlowMALengthChanged += (x) => { chartDrawer.CalculateMovingAverage(1, x); }; GameButtonsSetActive(true); chartInterface.InterfaceSetActive(true); }
public void DrawVolume(Rect camRect) { if (!IsSettingsSet) { return; } float worldRealToScreen = (CoordGrid.FromDateToXAxis(visibleEndDate) - CoordGrid.FromDateToXAxis(visibleStartDate)) / (worldPointInRightUpCorner.x - worldPointInLeftDownCorner.x); int count = DateTimeTools.CountFramesInPeriod(chartDataManager.TFrame, visibleStartDate, visibleEndDate, TimeSpan.Zero); float pixelLenghtFrame = camRect.width * worldRealToScreen / count; float maxVolume = (float)visibleFluctuations.Max(x => x.Volume); //Если свечка видна только частично, то необходимо смещать отрисовку объёма на равную долю видимости float diff = (worldPointInLeftDownCorner.x - CoordGrid.FromDateToXAxis(visibleStartDate)) * camRect.width / (worldPointInRightUpCorner.x - worldPointInLeftDownCorner.x); Vector2 barLeftDownCorner = camRect.min - new Vector2(diff + pixelLenghtFrame / 2, 0); Vector2 barRightUpCorner; Vector2 bordersOffset = new Vector2((20 / count < 1 ? 1 : 20 / count), 0); if (chartDataManager.WorkBeginTime > visibleStartDate) { int shift = DateTimeTools.CountFramesInPeriod(chartDataManager.TFrame, visibleStartDate, chartDataManager.WorkBeginTime, TimeSpan.Zero); barLeftDownCorner += new Vector2(shift * pixelLenghtFrame, 0); } foreach (var fluctuation in visibleFluctuations) { float pixelHeightFrame = (float)fluctuation.Volume / maxVolume * camRect.height; barRightUpCorner = barLeftDownCorner + new Vector2(pixelLenghtFrame, pixelHeightFrame); DrawTools.DrawRectangle(barLeftDownCorner + bordersOffset, barRightUpCorner - bordersOffset, fluctuation.Close - fluctuation.Open > 0 ? volumeUpColor : volumeDownColor); barLeftDownCorner = new Vector2(barRightUpCorner.x, camRect.min.y); } }