コード例 #1
0
ファイル: Extremum.cs プロジェクト: mielk/shares
        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);
        }
コード例 #2
0
ファイル: PriceProcessor.cs プロジェクト: mielk/waluty
        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;
        }
コード例 #3
0
ファイル: PriceProcessor.cs プロジェクト: mielk/waluty
        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);
        }
コード例 #4
0
ファイル: Price.cs プロジェクト: mielk/waluty
 public void ApplyExtremumValue(Extremum extremum)
 {
     ExtremumType type = extremum.Type;
     ApplyExtremumValue(type, extremum);
 }
コード例 #5
0
ファイル: Price.cs プロジェクト: mielk/waluty
 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;
     }
 }
コード例 #6
0
ファイル: Extremum.cs プロジェクト: mielk/waluty
        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;
        }