예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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);
            }
        }