public async Task <InstanceDataDTO> SaveInstance(AlgoDataDTO algoData, AlgoInstanceType instanceType, bool useExistingWallet = true)
        {
            if (instanceType == AlgoInstanceType.Live)
            {
                walletDTO = useExistingWallet == true ? await GetExistingWallet() : await CreateTestWallet();
            }

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(instanceType);

            // Build InstanceParameters
            instanceParameters = InstanceConfig.ValidMetaData;

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, instanceType, instanceParameters, daysOffsetDTO);

            // Build save instance url
            var url = instanceType == AlgoInstanceType.Live ? ApiPaths.ALGO_STORE_SAVE_ALGO_INSTANCE : ApiPaths.ALGO_STORE_FAKE_TRADING_INSTANCE_DATA;

            string requestBody          = JsonUtils.SerializeObject(instanceForAlgo);
            var    saveInstanceResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, requestBody, Method.POST);

            message = $"POST {url} returned status: {saveInstanceResponse.Status} and response: {saveInstanceResponse.ResponseJson}. Expected: {HttpStatusCode.OK}";
            Assert.That(saveInstanceResponse.Status, Is.EqualTo(HttpStatusCode.OK), message);

            var instanceData = JsonUtils.DeserializeJson <InstanceDataDTO>(saveInstanceResponse.ResponseJson);

            // Add Instance to the list so that it can be deleted in the the TearDown
            instancesList.Add(instanceData);

            return(instanceData);
        }
        public async Task CheckTailLogsForStoppedInstances(AlgoInstanceType algoInstanceType)
        {
            // Create an algo
            AlgoDataDTO algoData = await CreateAlgo();

            // Create algo instance
            var instanceData = await SaveInstance(algoData, algoInstanceType);

            // Wait up to 3 minutes for the instance to start
            await WaitAlgoInstanceToStart(instanceData.InstanceId);

            // Stop the instance
            await StopAlgoInstance(instanceData);

            //Get the instance
            ClientInstanceEntity instanceDataFromDB = await ClientInstanceRepository.TryGetAsync($"algo_{algoData.Id}", instanceData.InstanceId) as ClientInstanceEntity;

            Assert.That(instanceDataFromDB.AlgoInstanceStatus, Is.EqualTo(AlgoInstanceStatus.Stopped));

            // Wait 30 seconds
            Wait.ForPredefinedTime(30 * 1000);
            var tailLog = await GetInstanceTailLogFromApi(instanceData);

            Assert.That(tailLog, Is.Not.Null);
        }
 public DaysOffsetDTO BuildDaysOffsetByInstanceType(AlgoInstanceType algoInstanceType)
 {
     if (algoInstanceType != AlgoInstanceType.Test)
     {
         return(new DaysOffsetDTO()
         {
             AlgoStartOffset = -1,
             AlgoEndOffset = 60,
             SmaShortStartOffset = -30,
             SmaShortEndOffset = -3,
             SmaLongStartOffset = -30,
             SmaLongEndOffset = -3,
             AdxStartOffset = -30,
             AdxEndOffset = -3
         });
     }
     else
     {
         return(new DaysOffsetDTO()
         {
             AlgoStartOffset = -60,
             AlgoEndOffset = -2,
             SmaShortStartOffset = -59,
             SmaShortEndOffset = -3,
             SmaLongStartOffset = -59,
             SmaLongEndOffset = -3,
             AdxStartOffset = -59,
             AdxEndOffset = -3
         });
     }
 }
        public async Task PostInvalidAlgoId(AlgoInstanceType algoInstanceType)
        {
            WalletDTO walletDTO = null;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                walletDTO = await GetExistingWallet();
            }

            // Create algo
            var algoData = await CreateAlgo();

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(algoInstanceType);
            // Build InstanceParameters
            InstanceParameters instanceParameters = InstanceConfig.UseInvalidAlgoId;

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, algoInstanceType, instanceParameters, daysOffsetDTO);

            var url = algoInstanceType == AlgoInstanceType.Live ? ApiPaths.ALGO_STORE_SAVE_ALGO_INSTANCE : ApiPaths.ALGO_STORE_FAKE_TRADING_INSTANCE_DATA;

            var postInstanceDataResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, JsonUtils.SerializeObject(instanceForAlgo), Method.POST);

            Assert.That(postInstanceDataResponse.Status, Is.EqualTo(HttpStatusCode.NotFound), "we should receive not found response code");
        }
        public async Task PostInvalidInstanceTradedAsset(AlgoInstanceType algoInstanceType)
        {
            WalletDTO walletDTO = null;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                walletDTO = await GetExistingWallet();
            }

            // Create algo
            var algoData = await CreateAlgo();

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(algoInstanceType);
            // Build InstanceParameters
            InstanceParameters instanceParameters = InstanceConfig.InvalidInstanceTradedAsset;

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, algoInstanceType, instanceParameters, daysOffsetDTO);

            var url = algoInstanceType == AlgoInstanceType.Live ? ApiPaths.ALGO_STORE_SAVE_ALGO_INSTANCE : ApiPaths.ALGO_STORE_FAKE_TRADING_INSTANCE_DATA;

            var postInstanceDataResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, JsonUtils.SerializeObject(instanceForAlgo), Method.POST);

            AlgoErrorDTO postInstanceDataResponseDTO = JsonUtils.DeserializeJson <AlgoErrorDTO>(postInstanceDataResponse.ResponseJson);

            Assert.That(postInstanceDataResponse.Status, Is.EqualTo(HttpStatusCode.BadRequest), "should be bad response erorr code");

            Assert.That(postInstanceDataResponseDTO.ErrorMessage, Does.Contain("ValidationError Message:Asset <USD> is not valid for asset pair <BTCEUR>"), "we should receive erorr for the invalid traded asset");
        }
        public async Task PostInvalidInstanceAssetPair(AlgoInstanceType algoInstanceType)
        {
            WalletDTO walletDTO = null;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                walletDTO = await GetExistingWallet();
            }

            // Create algo
            var algoData = await CreateAlgo();

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(algoInstanceType);
            // Build InstanceParameters
            InstanceParameters instanceParameters = InstanceConfig.InvalidInstanceAssetPair;

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, algoInstanceType, instanceParameters, daysOffsetDTO);

            var url = algoInstanceType == AlgoInstanceType.Live ? ApiPaths.ALGO_STORE_SAVE_ALGO_INSTANCE : ApiPaths.ALGO_STORE_FAKE_TRADING_INSTANCE_DATA;

            var postInstanceDataResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, JsonUtils.SerializeObject(instanceForAlgo), Method.POST);

            AlgoErrorDTO postInstanceDataResponseDTO = JsonUtils.DeserializeJson <AlgoErrorDTO>(postInstanceDataResponse.ResponseJson);

            Assert.That(postInstanceDataResponse.Status, Is.EqualTo(HttpStatusCode.InternalServerError), "responce should equals internal server erorr");

            Assert.That(postInstanceDataResponseDTO.ErrorMessage, Does.Contain("NotFound from asset service calling AssetPairGetWithHttpMessagesAsync"), "we should receive erorr for not found asset pair");
        }
        public async Task BackTestWithLongFunctionPeriod(AlgoInstanceType algoInstanceType)
        {
            WalletDTO walletDTO = null;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                walletDTO = await GetExistingWallet();
            }

            // Create algo
            var algoData = await CreateAlgo();

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(algoInstanceType);

            // Set Instance start date to be three years ago and end date to be 10 days ago
            int start = 365 * -3;
            int end   = -10;

            daysOffsetDTO.AlgoStartOffset     = start;
            daysOffsetDTO.AlgoEndOffset       = end;
            daysOffsetDTO.SmaShortStartOffset = start;
            daysOffsetDTO.SmaShortEndOffset   = end;
            daysOffsetDTO.SmaShortStartOffset = start;
            daysOffsetDTO.SmaLongEndOffset    = end;

            // Build InstanceParameters
            InstanceParameters instanceParameters = InstanceConfig.ValidMetaData;

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, algoInstanceType, instanceParameters, daysOffsetDTO);

            // Build save instance url
            var url = algoInstanceType == AlgoInstanceType.Live ? ApiPaths.ALGO_STORE_SAVE_ALGO_INSTANCE : ApiPaths.ALGO_STORE_FAKE_TRADING_INSTANCE_DATA;

            var postInstanceDataResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, JsonUtils.SerializeObject(instanceForAlgo), Method.POST);

            AlgoErrorDTO postInstanceDataResponseDTO = JsonUtils.DeserializeJson <AlgoErrorDTO>(postInstanceDataResponse.ResponseJson);

            // Get instance data from DB
            ClientInstanceEntity instanceDataFromDB = await ClientInstanceRepository.TryGetAsync(t => t.AlgoId == algoData.Id) as ClientInstanceEntity;

            Assert.Multiple(() =>
            {
                Assert.That(postInstanceDataResponse.Status, Is.EqualTo(HttpStatusCode.InternalServerError));
                Assert.That(postInstanceDataResponseDTO.ErrorMessage, Does.StartWith("Code:511-InitialWalletBalanceNotCalculated Message:Initial wallet balance could not be calculated. Could not get history price for"));
                // Verify intance is not created in DB
                Assert.That(instanceDataFromDB, Is.Null);
            });
        }
        public async Task <InstanceDataDTO> SaveInstance(AlgoDataDTO algoData, AlgoInstanceType instanceType, bool useExistingWallet = true)
        {
            if (instanceType == AlgoInstanceType.Live)
            {
                walletDTO = useExistingWallet == true ? await GetExistingWallet() : await CreateTestWallet();
            }

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(instanceType);

            // Build InstanceParameters
            instanceParameters = new InstanceParameters()
            {
                AssetPair                   = "BTCUSD",
                TradedAsset                 = "USD",
                InstanceTradeVolume         = 4,
                InstanceCandleInterval      = CandleTimeInterval.Minute,
                FunctionCandleInterval      = CandleTimeInterval.Day,
                FunctionCandleOperationMode = CandleOperationMode.CLOSE,
                FunctionCapacity            = 4,
                InstanceFunctions           = new List <FunctionType>()
                {
                    FunctionType.SMA_Short, FunctionType.SMA_Long
                }
            };

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, instanceType, instanceParameters, daysOffsetDTO);

            // Build save instance url
            var url = instanceType == AlgoInstanceType.Live ? ApiPaths.ALGO_STORE_SAVE_ALGO_INSTANCE : ApiPaths.ALGO_STORE_FAKE_TRADING_INSTANCE_DATA;

            string requestBody          = JsonUtils.SerializeObject(instanceForAlgo);
            var    saveInstanceResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, requestBody, Method.POST);

            message = $"POST {url} returned status: {saveInstanceResponse.Status} and response: {saveInstanceResponse.ResponseJson}. Expected: {HttpStatusCode.OK}";
            Assert.That(saveInstanceResponse.Status, Is.EqualTo(HttpStatusCode.OK), message);

            var instanceData = JsonUtils.DeserializeJson <InstanceDataDTO>(saveInstanceResponse.ResponseJson);

            // Add Instance to the list so that it can be deleted in the the TearDown
            instancesList.Add(instanceData);

            return(instanceData);
        }
Exemple #9
0
        public async Task PostInvalidInstanceTradedAsset(AlgoInstanceType algoInstanceType)
        {
            WalletDTO walletDTO = null;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                walletDTO = await GetExistingWallet();
            }

            // Create algo
            var algoData = await CreateAlgo();

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(algoInstanceType);
            // Build InstanceParameters
            InstanceParameters instanceParameters = new InstanceParameters()
            {
                AssetPair                   = "BTCUSD",
                TradedAsset                 = "EUR",
                InstanceTradeVolume         = 2,
                InstanceCandleInterval      = CandleTimeInterval.Minute,
                FunctionCandleInterval      = CandleTimeInterval.Day,
                FunctionCandleOperationMode = CandleOperationMode.CLOSE,
                FunctionCapacity            = 4,
                InstanceFunctions           = new List <FunctionType>()
                {
                    FunctionType.SMA_Short, FunctionType.SMA_Long
                }
            };

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, algoInstanceType, instanceParameters, daysOffsetDTO);

            string url = ApiPaths.ALGO_STORE_ALGO_INSTANCE_DATA;

            var postInstanceDataResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, JsonUtils.SerializeObject(instanceForAlgo), Method.POST);

            AlgoErrorDTO postInstanceDataResponseDTO = JsonUtils.DeserializeJson <AlgoErrorDTO>(postInstanceDataResponse.ResponseJson);

            Assert.That(postInstanceDataResponse.Status, Is.EqualTo(HttpStatusCode.BadRequest), "should be bad response erorr code");

            Assert.That(postInstanceDataResponseDTO.ErrorMessage, Does.Contain("ValidationError Message:Asset <USD> is not valid for asset pair <BTCEUR>"), "we should receive erorr for the invalid traded asset");
        }
        public async Task AttemptToDeleteActiveAlgoInstance(AlgoInstanceType algoInstanceType)
        {
            // Create an algo
            AlgoDataDTO algoData = await CreateAlgo();

            // Start an instance
            var instanceData = await SaveInstance(algoData, algoInstanceType);

            // Build the body for the request
            var model = new DeleteAlgoInstanceDTO
            {
                AlgoId       = instanceData.AlgoId,
                InstanceId   = instanceData.InstanceId,
                AlgoClientId = instanceData.AlgoClientId
            };

            // Send the request
            var deleteAlgoInstance = await Consumer.ExecuteRequest(ApiPaths.ALGO_STORE_DELETE_INSTANCE,
                                                                   Helpers.EmptyDictionary, JsonUtils.SerializeObject(model), Method.DELETE);

            Assert.That(deleteAlgoInstance.Status, Is.EqualTo(HttpStatusCode.BadRequest));

            // Get instance data from DB
            ClientInstanceEntity instanceDataFromDB = await ClientInstanceRepository.TryGetAsync($"algo_{algoData.Id}", instanceData.InstanceId) as ClientInstanceEntity;

            Assert.That(instanceDataFromDB, Is.Not.Null);

            // Wait up to 3 minutes for the instance to start
            await WaitAlgoInstanceToStart(instanceData.InstanceId);

            // Send the request
            deleteAlgoInstance = await Consumer.ExecuteRequest(ApiPaths.ALGO_STORE_DELETE_INSTANCE,
                                                               Helpers.EmptyDictionary, JsonUtils.SerializeObject(model), Method.DELETE);

            Assert.That(deleteAlgoInstance.Status, Is.EqualTo(HttpStatusCode.BadRequest));

            // Get instance data from DB
            instanceDataFromDB = await ClientInstanceRepository.TryGetAsync($"algo_{algoData.Id}", instanceData.InstanceId) as ClientInstanceEntity;

            Assert.That(instanceDataFromDB, Is.Not.Null);
        }
Exemple #11
0
        public InstanceDataDTO(AlgoDataDTO algoData, WalletDTO wallet, AlgoInstanceType algoInstanceType, AlgoMetaDataInformation algoMetaDataInformation, string instanceName = null)
        {
            AlgoId                  = algoData.Id;
            AlgoClientId            = algoData.ClientId;
            InstanceName            = instanceName ?? $"{algoInstanceType} {Helpers.GetTimestampIso8601()}{GlobalConstants.AutoTest}_IntanceName";
            AlgoInstanceType        = algoInstanceType;
            AlgoMetaDataInformation = algoMetaDataInformation;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                WalletId = wallet.Id;
                FakeTradingTradingAssetBalance = null;
                FakeTradingAssetTwoBalance     = null;
            }
            else
            {
                WalletId = null;
                FakeTradingTradingAssetBalance = 8192;
                FakeTradingAssetTwoBalance     = 2.048;
            }
        }
Exemple #12
0
        public async Task PostInvalidAlgoId(AlgoInstanceType algoInstanceType)
        {
            WalletDTO walletDTO = null;

            if (algoInstanceType == AlgoInstanceType.Live)
            {
                walletDTO = await GetExistingWallet();
            }

            // Create algo
            var algoData = await CreateAlgo();

            // Build days offset
            DaysOffsetDTO daysOffsetDTO = BuildDaysOffsetByInstanceType(algoInstanceType);
            // Build InstanceParameters
            InstanceParameters instanceParameters = new InstanceParameters()
            {
                AssetPair                   = "BTCUSD",
                TradedAsset                 = "EUR",
                InstanceTradeVolume         = 2,
                InstanceCandleInterval      = CandleTimeInterval.Minute,
                FunctionCandleInterval      = CandleTimeInterval.Day,
                FunctionCandleOperationMode = CandleOperationMode.CLOSE,
                FunctionCapacity            = 4,
                InstanceFunctions           = new List <FunctionType>()
                {
                    FunctionType.SMA_Short, FunctionType.SMA_Long
                }
            };

            // Build instance request payload
            var instanceForAlgo = InstanceDataBuilder.BuildInstanceData(algoData, walletDTO, algoInstanceType, instanceParameters, daysOffsetDTO, true);

            string url = ApiPaths.ALGO_STORE_ALGO_INSTANCE_DATA;

            var postInstanceDataResponse = await Consumer.ExecuteRequest(url, Helpers.EmptyDictionary, JsonUtils.SerializeObject(instanceForAlgo), Method.POST);

            Assert.That(postInstanceDataResponse.Status, Is.EqualTo(HttpStatusCode.NotFound), "we should receive not found response code");
        }
        public async Task CheckTcBuildData(AlgoInstanceType algoInstanceType)
        {
            // Create an algo
            AlgoDataDTO algoData = await CreateAlgo();

            // Create an instance
            var instanceData = await SaveInstance(algoData, algoInstanceType);

            // Wait up to 3 minutes for the instance to start
            await WaitAlgoInstanceToStart(instanceData.InstanceId);

            // Get the Instance
            ClientInstanceEntity instanceDataFromDB = await ClientInstanceRepository.TryGetAsync($"algo_{algoData.Id}", instanceData.InstanceId) as ClientInstanceEntity;

            Assert.That(instanceDataFromDB, Is.Not.Null);

            // Get TcBuild log
            TcBuildEntity tcBuildDataFromDB = await TcBuildRepository.TryGetAsync("TcBuildEntity", instanceDataFromDB.TcBuildId) as TcBuildEntity;

            Assert.That(tcBuildDataFromDB.InstanceId, Is.EqualTo(instanceDataFromDB.Id));
            Assert.That(tcBuildDataFromDB.ClientId, Is.EqualTo(instanceDataFromDB.ClientId));
            Assert.That(tcBuildDataFromDB.TcBuildId, Is.EqualTo(instanceDataFromDB.TcBuildId));
        }
        public static InstanceDataDTO BuildInstanceData(AlgoDataDTO algoData, WalletDTO walletDTO, AlgoInstanceType instanceType, InstanceParameters instanceParameters, DaysOffsetDTO daysOffsetDTO, string instanceName = null)
        {
            AlgoMetaDataInformation algoMetaDataInformation = BuildAlgoMetaDataInformation(instanceParameters, daysOffsetDTO);

            if (instanceParameters.UseInvalidAlgoId)
            {
                algoData.Id = $"NonExistingAlgoId - {Helpers.GetFullUtcTimestamp()}";
            }

            return(new InstanceDataDTO(algoData, walletDTO, instanceType, algoMetaDataInformation, instanceName));
        }
        public async Task CreateAlgoWithInstanceAndCheckTrades(AlgoInstanceType algoInstanceType)
        {
            // Create algo
            var algoData = await CreateAlgo();

            // Create Live instance
            var instanceData = await SaveInstance(algoData, algoInstanceType, useExistingWallet : false);

            // Wait up to 3 minutes for the instance to start
            await WaitAlgoInstanceToStart(instanceData.InstanceId);

            // Get actual values from statistics endpoint 6 times within 1 minute
            StatisticsDTO statistics = null;

            for (int i = 0; i < 6; i++)
            {
                statistics = await GetStatisticsResponseAsync(instanceData);
            }

            Assert.That(statistics.TotalNumberOfTrades, Is.GreaterThan(0));

            // Get trades fram algo store api
            Dictionary <string, string> algoStoreTradesParams = new Dictionary <string, string>()
            {
                { "instanceId", instanceData.InstanceId }
            };
            var instanceTradesAlgoStoreRequest = await Consumer.ExecuteRequest(ApiPaths.ALGO_STORE_GET_INSTANCE_TRADES, algoStoreTradesParams, null, Method.GET);

            Assert.That(instanceTradesAlgoStoreRequest.Status, Is.EqualTo(HttpStatusCode.OK));
            List <InstanceTradeDTO> instanceTradesAlgoStore = JsonUtils.DeserializeJson <List <InstanceTradeDTO> >(instanceTradesAlgoStoreRequest.ResponseJson);

            // Get trades from DB
            //List<AlgoInstanceTradesEntity> algoInstanceTrades = await AlgoInstanceTradesRepository.GetAllAsync(t => t.PartitionKey.StartsWith(instanceData.InstanceId)) as List<AlgoInstanceTradesEntity>;

            // Assert there is at least one trade for the instance
            Assert.That(instanceTradesAlgoStore.Count, Is.GreaterThan(0));
            Assert.That(instanceTradesAlgoStore.Count, Is.GreaterThanOrEqualTo(statistics.TotalNumberOfTrades));

            // Get trades from HFT api only if instance is Live
            if (algoInstanceType == AlgoInstanceType.Live)
            {
                var hftTradesUrl = $"{BaseUrl.HftApiBaseUrl}{ApiPaths.HFT_HISTORY_TRADES}";

                // Build HFT History trades query params
                Dictionary <string, string> hftHistoryTradeQueryParams = new Dictionary <string, string>
                {
                    { "assetId", instanceParameters.TradedAsset },
                    { "assetPairId", instanceParameters.AssetPair },
                    { "skip", "0" },
                    { "take", "100" }
                };

                var apiKey = (await GetAllWalletsOfUser()).Find(w => w.Id == walletDTO.Id).ApiKey;

                Dictionary <string, string> hftHistoryTradeHeaders = new Dictionary <string, string>
                {
                    { "accept", "text/plain" },
                    { "api-key", apiKey }
                };

                var instanceTradesHftRequest = await Consumer.ExecuteRequestCustomEndpoint(hftTradesUrl, hftHistoryTradeQueryParams, null, Method.GET, headers : hftHistoryTradeHeaders);

                Assert.That(instanceTradesHftRequest.Status, Is.EqualTo(HttpStatusCode.OK));
                List <InstanceTradeDTO> instanceTradesHFT = JsonUtils.DeserializeJson <List <InstanceTradeDTO> >(instanceTradesAlgoStoreRequest.ResponseJson);

                Assert.That(instanceTradesHFT.Count, Is.GreaterThan(0));
                Assert.That(instanceTradesHFT.Count, Is.GreaterThanOrEqualTo(statistics.TotalNumberOfTrades));

                List <string> algoStoreTradeIds = instanceTradesAlgoStore.Select(x => x.OrderId).ToList();
                List <string> hftTradeIds       = instanceTradesHFT.Select(x => x.OrderId).ToList();

                algoStoreTradeIds.Sort();
                hftTradeIds.Sort();

                Assert.That(algoStoreTradeIds, Is.SubsetOf(hftTradeIds));
            }
        }
Exemple #16
0
        public static InstanceDataDTO BuildInstanceData(AlgoDataDTO algoData, WalletDTO walletDTO, AlgoInstanceType instanceType, InstanceParameters instanceParameters, DaysOffsetDTO daysOffsetDTO, bool withInvalidAlgoId = false, bool withoutMetadaData = false)
        {
            AlgoMetaDataInformation algoMetaDataInformation = BuildAlgoMetaDataInformation(instanceParameters, daysOffsetDTO);

            if (withInvalidAlgoId)
            {
                algoData.Id = $"NonExistingAlgoId - {Helpers.GetFullUtcTimestamp()}";
            }

            return(new InstanceDataDTO(algoData, walletDTO, instanceType, algoMetaDataInformation));
        }
        public async Task CheckHistoryCandles(AlgoInstanceType algoInstanceType)
        {
            int daysBack = -2;

            // Create an algo
            AlgoDataDTO algoData = await CreateAlgo();

            // Start an instance
            var instanceData = await SaveInstance(algoData, algoInstanceType);

            // Wait up to 3 minutes for the instance to start
            await WaitAlgoInstanceToStart(instanceData.InstanceId);

            // Build History Api candles url
            var historyApiCandlesUrl = $"{BaseUrl.AlgoStoreHistoryApiBaseUrl}{ApiPaths.ALGO_STORE_HISTORY_API_CANDLES}";

            // Build params dictionary
            Dictionary <string, string> historyApiCandlesRequestParams = new Dictionary <string, string>
            {
                { "StartFrom", InstanceDataBuilder.FunctionsDictionary[FunctionType.SMA_Short.ToString()].StartingDate.ToString(GlobalConstants.ISO_8601_DATE_FORMAT) },
                { "EndOn", InstanceDataBuilder.FunctionsDictionary[FunctionType.SMA_Long.ToString()].EndingDate.AddDays(daysBack).ToString(GlobalConstants.ISO_8601_DATE_FORMAT) },
                { "IndicatorName", FunctionType.SMA_Short.ToString() }
            };

            // Get instance data from DB
            ClientInstanceEntity instanceDataFromDB = await ClientInstanceRepository.TryGetAsync(t => t.Id == instanceData.InstanceId) as ClientInstanceEntity;

            // Get instance history candles
            var histiryApiCandles = await Consumer.ExecuteRequestCustomEndpoint(historyApiCandlesUrl, historyApiCandlesRequestParams, null, Method.GET, instanceDataFromDB.AuthToken);

            Assert.That(histiryApiCandles.Status, Is.EqualTo(HttpStatusCode.OK));
            List <CandleDTO> actualResult = JsonUtils.DeserializeJson <List <CandleDTO> >(histiryApiCandles.ResponseJson);

            // Build Api v2 candles url
            var apiV2CandlesUrl = $"{BaseUrl.ApiV2BaseUrl}{ApiPaths.API_V2_CANDLES_HISTORY}";

            // Build params dictionary
            Dictionary <string, string> apiV2CandlesRequestParams = new Dictionary <string, string>
            {
                { "Type", "Spot" },
                { "PriceType", "Mid" },
                { "AssetPairId", InstanceDataBuilder.FunctionsDictionary[FunctionType.SMA_Short.ToString()].AssetPair },
                { "TimeInterval", InstanceDataBuilder.FunctionsDictionary[FunctionType.SMA_Short.ToString()].CandleTimeInterval.ToString() },
                { "FromMoment", InstanceDataBuilder.FunctionsDictionary[FunctionType.SMA_Long.ToString()].StartingDate.ToString(GlobalConstants.ISO_8601_DATE_FORMAT) },
                { "ToMoment", InstanceDataBuilder.FunctionsDictionary[FunctionType.SMA_Long.ToString()].EndingDate.AddDays(daysBack).ToString(GlobalConstants.ISO_8601_DATE_FORMAT) }
            };

            // Get expected history candles
            var apiV2Candles = await Consumer.ExecuteRequestCustomEndpoint(apiV2CandlesUrl, apiV2CandlesRequestParams, null, Method.GET);

            Assert.That(apiV2Candles.Status, Is.EqualTo(HttpStatusCode.OK));
            ApiV2HistoryCandles apiV2HistoryCandles = JsonUtils.DeserializeJson <ApiV2HistoryCandles>(apiV2Candles.ResponseJson);

            // Get expected result
            List <CandleDTO> expectedResult = apiV2HistoryCandles.History.Select(c => new CandleDTO()
            {
                DateTime = c.DateTime,
                Open     = c.Open,
                Close    = c.Close,
                High     = c.High,
                Low      = c.Low
            }).ToList();

            // Sort actual and expected result by DateTime
            actualResult.Sort((x, y) => x.DateTime.CompareTo(y.DateTime));
            expectedResult.Sort((x, y) => x.DateTime.CompareTo(y.DateTime));

            // Assert actual result equals expected result
            Assert.That(actualResult.Count, Is.EqualTo(expectedResult.Count));
            Assert.Multiple(() =>
            {
                for (int i = 0; i < actualResult.Count; i++)
                {
                    Assert.Multiple(() =>
                    {
                        Assert.That(actualResult[i].DateTime, Is.EqualTo(expectedResult[i].DateTime));
                        Assert.That(actualResult[i].Open, Is.EqualTo(expectedResult[i].Open));
                        Assert.That(actualResult[i].Close, Is.EqualTo(expectedResult[i].Close));
                        Assert.That(actualResult[i].High, Is.EqualTo(expectedResult[i].High));
                        Assert.That(actualResult[i].Low, Is.EqualTo(expectedResult[i].Low));
                    });
                }
            });
        }
 public async Task CheckHistoryCandlesNeagtiveTests(AlgoInstanceType algoInstanceType)
 {
     // EndOn should be before the Indicator end date
     // StartFrom should be after the Indicator start date
     // StartFrom should be before EndOn
 }