public static Extremum FromDto(ExtremumDto dto) { var extremum = new Extremum { ExtremumId = dto.ExtremumId, DateIndex = dto.DateIndex, AssetId = dto.AssetId, TimeframeId = dto.TimeframeId, ExtremumTypeId = dto.ExtremumTypeId, Value = dto.Value, IsEvaluationOpen = dto.IsEvaluationOpen, EarlierCounter = dto.EarlierCounter, EarlierAmplitude = dto.EarlierAmplitude, EarlierTotalArea = dto.EarlierTotalArea, EarlierAverageArea = dto.EarlierAverageArea, EarlierChange1 = dto.EarlierChange1, EarlierChange2 = dto.EarlierChange2, EarlierChange3 = dto.EarlierChange3, EarlierChange5 = dto.EarlierChange5, EarlierChange10 = dto.EarlierChange10, LaterCounter = dto.LaterCounter, LaterAmplitude = dto.LaterAmplitude, LaterTotalArea = dto.LaterTotalArea, LaterAverageArea = dto.LaterAverageArea, LaterChange1 = dto.LaterChange1, LaterChange2 = dto.LaterChange2, LaterChange3 = dto.LaterChange3, LaterChange5 = dto.LaterChange5, LaterChange10 = dto.LaterChange10 }; return(extremum); }
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? GetPriceChange(DataItem item, Extremum extremum, bool earlier, int counter) { if (!earlier && quotationsLeft(item) < counter) return null; var index = earlier ? Math.Max(0, item.Index - counter) : Math.Min(item.Index + counter, analyzer.getDataItemsLength() - 1); double comparedValue = analyzer.getDataItem(index).Quotation.ProperValue(extremum.Type); double baseValue = item.Quotation.ProperValue(extremum.Type); double difference = (baseValue - comparedValue) / Math.Max(comparedValue, baseValue); return difference * (extremum.Type.IsPeak() ? 1 : -1); }
public void ApplyExtremumValue(Extremum extremum) { ExtremumType type = extremum.Type; ApplyExtremumValue(type, extremum); }
public void ApplyExtremumValue(ExtremumType type, Extremum extremum) { switch (type) { case ExtremumType.PeakByClose: PeakByCloseExtremum = extremum; PeakByClose = extremum == null ? 0 : extremum.Evaluate(); break; case ExtremumType.PeakByHigh: PeakByHighExtremum= extremum; PeakByHigh = extremum == null ? 0 : extremum.Evaluate(); break; case ExtremumType.TroughByClose: TroughByCloseExtremum = extremum; TroughByClose = extremum == null ? 0 : extremum.Evaluate(); break; case ExtremumType.TroughByLow: TroughByLowExtremum = extremum; TroughByLow = extremum == null ? 0 : extremum.Evaluate(); break; } }
public static Extremum FromDto(ExtremumDto dto) { var extremum = new Extremum(); extremum.ExtremumId = dto.ExtremumId; extremum.Symbol = dto.Symbol; extremum.Type = (ExtremumType)dto.Type; extremum.PriceDate = dto.PriceDate; extremum.EarlierCounter = dto.EarlierCounter; extremum.EarlierAmplitude = dto.EarlierAmplitude; extremum.EarlierChange1 = dto.EarlierChange1; extremum.EarlierChange2 = dto.EarlierChange2; extremum.EarlierChange3 = dto.EarlierChange3; extremum.EarlierChange5 = dto.EarlierChange5; extremum.EarlierChange10 = dto.EarlierChange10; extremum.LaterCounter = dto.LaterCounter; extremum.LaterAmplitude = dto.LaterAmplitude; extremum.LaterChange1 = dto.LaterChange1; extremum.LaterChange2 = dto.LaterChange2; extremum.LaterChange3 = dto.LaterChange3; extremum.LaterChange5 = dto.LaterChange5; extremum.LaterChange10 = dto.LaterChange10; extremum.Volatility = dto.Volatility; extremum.IsOpen = dto.IsOpen; extremum.Cancelled = dto.Cancelled; return extremum; }