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