/// <summary> /// Add a new supported granularity to an existing instrument /// </summary> /// <param name="instrumentName">Name of the instrument to add the granularity to</param> /// <param name="granularity">Granularity to add</param> /// <returns>The whole instrument with the new granularity added</returns> public Contracts.Instrument AddGranularity(Contracts.InstrumentName instrumentName, Contracts.InstrumentGranularityCreation granularity) { // Check if instrument is in the DB var instrumentInDb = GetInstumentFromDbByName(instrumentName); if (instrumentInDb == null) { throw new ProblemDetailsException(HttpStatusCode.NotFound, $"Instrument '{instrumentName}' not found."); } // Check if granularity is in DB var granularityInDb = GetGranularityFromDbByName(instrumentName, granularity.Granularity); if (granularityInDb != null) { // If yes just return the whole instrument object return(_mapper.Map <Database.Instrument, Contracts.Instrument>(instrumentInDb)); } // If not then create it in the DB var granularityToAdd = _mapper.Map <Contracts.InstrumentGranularityCreation, Database.InstrumentGranularity>(granularity); granularityToAdd.State = Database.GranularityState.New; // With the state of new instrumentInDb.Granularities.Add(granularityToAdd); _dbContext.Update(instrumentInDb); _dbContext.SaveChanges(); // Return the entity saved in the DB return(_mapper.Map <Database.Instrument, Contracts.Instrument>(instrumentInDb)); }
private async Task PostCandlesToTheEngine(Contracts.InstrumentName instrument, Contracts.Granularity granularity, IEnumerable <Contracts.Candle> candles) { var client = _httpClientFactory.CreateClient(_configuration["forex-miner-thor:Name"]); await _retryPolicy.ExecuteAsync(async() => { await client.PostAsync($"instruments/{instrument}/granularities/{granularity}", CreateHttpContent(candles)); }); }
/// <summary> /// Get the candles in monthly packages /// </summary> /// <returns>Candles in a month</returns> private async Task <ICollection <Contracts.Candle> > GetCandlesBetween(Contracts.InstrumentName instrument, Contracts.Granularity granularity, DateTime utcFrom, DateTime utcTo) { // Authenticate to OANDA with the master account var oandaConnection = _oandaApiConnectionFactory.CreateConnection(OandaConnectionType.FxPractice, _configuration["Oanda-MasterToken"]); // Get candles var oandaInstrument = _mapper.Map <InstrumentName>(instrument); var oandaGranularity = _mapper.Map <CandlestickGranularity>(granularity); var candles = await oandaConnection.GetInstrument(oandaInstrument).GetCandlesByTimeAsync(oandaGranularity, utcFrom, utcTo); return(_mapper.Map <ICollection <Contracts.Candle> >(candles)); }
/// <summary> /// Get granularity from DB /// </summary> /// <param name="instrumentName">Name of the instrument</param> /// <param name="granularityName">Granularity</param> /// <returns>Granularity</returns> private Database.InstrumentGranularity GetGranularityFromDbByName(Contracts.InstrumentName instrumentName, Contracts.Granularity granularityName) { return(_dbContext.Instruments.Include(instrument => instrument.Granularities) .SingleOrDefault(instrument => instrument.Name == instrumentName)?.Granularities .SingleOrDefault(granularity => granularity.Granularity == granularityName)); }
/// <summary> /// Get an instrument from the DB by it's name /// </summary> /// <param name="name">Name of the instrument</param> /// <returns>Instrument in DB</returns> private Database.Instrument GetInstumentFromDbByName(Contracts.InstrumentName name) { return(_dbContext.Instruments.SingleOrDefault(instrument => instrument.Name == name)); }