public List<ForexDto> PrepareData(int splitPeriodSeconds) { var forexRecords = _forexCsvRepository.CsvLinesNormalized; var firstRecord = forexRecords[0]; var options = ForexHelper.InitializeForexTrackData(firstRecord); int index = 0; var forexSplitData = new List<ForexDto>(); var currentDto = new ForexDto { FileName = index.ToString(), ForexData = new List<ForexTreeData>() }; DateTime differenceTime = DateTime.ParseExact(firstRecord.Date, "yyyyMMdd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture); for (var i = 0; i < forexRecords.Count; i++) { var record = forexRecords[i]; var dateTime = DateTime.ParseExact(record.Date, "yyyyMMdd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture).Subtract(differenceTime); var seconds = (int)dateTime.TotalSeconds; if (seconds >= splitPeriodSeconds) { if (i < forexRecords.Count) { differenceTime = DateTime.ParseExact(forexRecords[i + 1].Date, "yyyyMMdd HH:mm:ss.fff", System.Globalization.CultureInfo.InvariantCulture); } options = ForexHelper.InitializeForexTrackData(record, options); forexSplitData.Add(currentDto); ForexHelper.SetCorrectMarketActions(currentDto); index++; currentDto = new ForexDto { FileName = index.ToString(), ForexData = new List<ForexTreeData>() }; } var treeRecord = ForexHelper.BuildForexTreeRecord(record, options); currentDto.ForexData.Add(treeRecord); options.CurrentRecord++; } if (forexSplitData.Contains(currentDto)) { return forexSplitData; } forexSplitData.Add(currentDto); ForexHelper.SetCorrectMarketActions(currentDto); return forexSplitData; }
public static void SetCorrectMarketActions(ForexDto currentDto) { const int ticks = 30; var forexData = currentDto.ForexData; for (var i = 0; i < forexData.Count; i++) { var record = forexData[i]; if (record.Action != default(MarketAction)) { continue; } var baseBid = record.Bid; var maxDifference = 0.0; var maxIndex = -1; for (var j = 1; j < ticks; j++) { var index = i + j; if (index >= forexData.Count) { continue; } var observableRecord = forexData[index]; var ask = observableRecord.Ask; var difference = baseBid - ask; if (observableRecord.Action == default(MarketAction) && difference > maxDifference) { maxDifference = difference; maxIndex = index; } } if (maxIndex > -1) { record.Action = MarketAction.Buy; forexData[maxIndex].Action = MarketAction.Sell; } else { record.Action = MarketAction.Hold; } } }