protected double FindLaterPriceAmplitude(ExtremumType type, DataItem item, DataItem nextExtremum) { int startIndex = item.Index + 1; int endIndex = nextExtremum.Index - 1; var itemsRange = analyzer.getDataItems().Where(i => i.Index >= startIndex && i.Index <= endIndex); if (itemsRange.Count() == 0) return 0; double oppositeValue = (type.IsPeak() ? itemsRange.Min(i => i.Quotation.Low) : itemsRange.Max(i => i.Quotation.High)); double baseValue = item.Quotation.ProperValue(type); return Math.Abs(oppositeValue - baseValue) / Math.Max(oppositeValue, baseValue); }
protected bool CheckForExtremum(DataItem item, ExtremumType type, bool fromScratch) { Extremum extremum; if (!fromScratch) { //Jeżeli analiza nie jest przeprowadzana od początku, sprawdzane jest czy dla tego DataItemu //przypisany jest obieket ExtremumCalculator danego typu. Jeżeli nie, oznacza to, że już //wcześniej został zdyskwalifikowany i nie ma sensu go sprawdzać. extremum = item.Price.GetExtremumObject(type); if (extremum == null) return false; if (!extremum.IsOpen) return false; //Sprawdź czy notowania późniejsze względem tego pozwalają uznać je za ekstremum. var laterCounter = CountSerie(item.Index, type.IsPeak(), type.ByClose(), false); if (laterCounter < MinRange && laterCounter < (analyzer.getDataItemsLength() - 1 - item.Index)) { extremum.Cancelled = true; item.Price.ApplyExtremumValue(type, null); item.Price.IsUpdated = true; return true; } else { extremum.LaterCounter = laterCounter; } } else { //Wartości oparte na wcześniejszych notowaniach obliczane są tylko, jeżeli analiza wykonywana jest od zera. var earlierCounter = CountSerie(item.Index, type.IsPeak(), type.ByClose(), true); var laterCounter = CountSerie(item.Index, type.IsPeak(), type.ByClose(), false); //Jeżeli liczba wcześniejszych lub późniejszych notowań gorszych od tego notowania nie osiągnęła //minimalnego poziomu, to notowanie jest dyskwalifikowane jako ekstremum i nie ma sensu go dalej sprawdzać. if (earlierCounter < MinRange) return false; if (laterCounter < MinRange && laterCounter < (analyzer.getDataItemsLength() - 1 - item.Index)) return false; extremum = new Extremum(item.Date, atf, type.IsPeak(), type.ByClose()); extremum.EarlierCounter = earlierCounter; extremum.LaterCounter = laterCounter; extremum.EarlierAmplitude = FindEarlierPriceAmplitude(type, item, getCurrentExtremum(type)); extremum.EarlierChange1 = GetPriceChange(item, extremum, true, 1); extremum.EarlierChange2 = GetPriceChange(item, extremum, true, 2); extremum.EarlierChange3 = GetPriceChange(item, extremum, true, 3); extremum.EarlierChange5 = GetPriceChange(item, extremum, true, 5); extremum.EarlierChange10 = GetPriceChange(item, extremum, true, 10); extremum.Volatility = item.Quotation.Volatility(); //Calculate [LaterAmplitude] for previous extremum. var prevExtremumDataItem = getCurrentExtremum(type); if (prevExtremumDataItem != null) { var prevExtremum = prevExtremumDataItem.Extremum(type); if (prevExtremum != null) { var laterAmplitude = FindLaterPriceAmplitude(type, prevExtremumDataItem, item); prevExtremum.LaterAmplitude = laterAmplitude; prevExtremumDataItem.Price.IsUpdated = true; } } } //Właściwie, to już wcześniej zostało zapewnione, że do tego miejsca wykonanie programu dotrze //tylko, jeżeli extremum nie jest puste, ale mimo to kompilator nie przepuszcza bez takiego warunku tutaj. if (extremum != null) { //extremum.LaterAmplitude = FindPriceAmplitude(item, extremum, false); if (extremum.LaterChange1 == null) extremum.LaterChange1 = GetPriceChange(item, extremum, false, 1); if (extremum.LaterChange2 == null) extremum.LaterChange2 = GetPriceChange(item, extremum, false, 2); if (extremum.LaterChange3 == null) extremum.LaterChange3 = GetPriceChange(item, extremum, false, 3); if (extremum.LaterChange5 == null) extremum.LaterChange5 = GetPriceChange(item, extremum, false, 5); if (extremum.LaterChange10 == null) extremum.LaterChange10 = GetPriceChange(item, extremum, false, 10); extremum.IsOpen = (item.Index + extremum.LaterCounter == analyzer.getDataItemsLength() - 1) || quotationsLeft(item) < 10; if (extremum.IsConfirmed()) { setCurrentExtremum(type, item); } item.Price.ApplyExtremumValue(type, extremum); item.Price.IsUpdated = true; } return true; }
protected double FindEarlierPriceAmplitude(ExtremumType type, DataItem item, DataItem prevExtremum) { int startIndex; int endIndex; startIndex = (prevExtremum == null ? 0 : prevExtremum.Index); endIndex = item.Index - 1; IEnumerable<DataItem> items = analyzer.getDataItems(); var itemsRange = items.Where(i => i.Index >= startIndex && i.Index <= endIndex); if (itemsRange.Count() == 0) return 0; double oppositeValue = (type.IsPeak() ? itemsRange.Min(i => i.Quotation.Low) : itemsRange.Max(i => i.Quotation.High)); double baseValue = item.Quotation.ProperValue(type); return Math.Abs(oppositeValue - baseValue) / Math.Max(oppositeValue, baseValue); }