示例#1
0
 public TurningPoint(double delta)
 {
     PatternState    = EPatternState.init;
     PatternPt0      = 0;
     PatternPt1      = 0;
     cntNewUp        = 0;
     cntNewDown      = 0;
     cntTurns        = 0;
     dblPatternDelta = delta;
 }
示例#2
0
        public void Calculate(Double val)
        {
            double dif;

            //
            // Pattern calculation
            //
            switch (PatternState)
            {
            case EPatternState.init:
                PatternPt1   = val;
                PatternPt0   = val;
                PatternState = EPatternState.start;
                //dsPattern.Add( quote.DateTime, val );
                //Console.WriteLine( "{0} Pattern init {1}", SmartQuant.Clock.Now, PatternState );
                break;

            case EPatternState.start:
                if (Math.Abs(val - PatternPt1) >= dblPatternDelta)
                {
                    dtPatternPt1 = Clock.Now;
                    PatternPt0   = val;
                    if (val > PatternPt1)
                    {
                        PatternState = EPatternState.up;
                        //gpstrategy.BuySignal = true;
                        //Console.WriteLine( "{0} Pattern start {1}", SmartQuant.Clock.Now, PatternState );
                    }
                    else
                    {
                        PatternState = EPatternState.down;
                        //gpstrategy.SellSignal = true;
                        //Console.WriteLine( "{0} Pattern start {1}", SmartQuant.Clock.Now, PatternState );
                    }
                    PatternPt1 = val;
                }
                break;

            case EPatternState.up:
                PatternPt0 = val;
                if (val > PatternPt1)
                {
                    PatternPt1   = val;
                    dtPatternPt1 = Clock.Now;
                    cntNewUp++;
                    if (null != OnUpDecisionPointFound)
                    {
                        OnUpDecisionPointFound(this);
                    }
                }
                dif = PatternPt1 - PatternPt0;
                //dsPt0Ratio.Add( quote.DateTime, dif / dblPatternDelta  );
                if (dif >= dblPatternDelta)
                {
                    //dsPattern.Add( dtPatternPt1, PatternPt1 );
                    cntTurns++;
                    if (null != OnPeakFound)
                    {
                        OnPeakFound(this, dtPatternPt1, PatternPt1, PatternState);
                    }
                    //mp.ClassifyDoubleSeriesEnd( dsPattern );
                    if (PatternPt1 > PatternPt0)
                    {
                        //Console.WriteLine( "{0} Pattern from {1}", SmartQuant.Clock.Now, PatternState );
                        PatternState = EPatternState.down;
                    }
                    else
                    {
                        //Console.WriteLine( "{0} Pattern already {1}", SmartQuant.Clock.Now, PatternState );
                    }
                }
                else
                {
//						rPatternDeltaDistance[ (int) Math.Round( dif * 100 ) ]++;
                }
                break;

            case EPatternState.down:
                PatternPt0 = val;
                if (val < PatternPt1)
                {
                    PatternPt1   = val;
                    dtPatternPt1 = Clock.Now;
                    cntNewDown++;
                    if (null != OnDownDecisionPointFound)
                    {
                        OnDownDecisionPointFound(this);
                    }
                }
                dif = PatternPt0 - PatternPt1;
                //dsPt0Ratio.Add( quote.DateTime, dif / dblPatternDelta );
                if (dif >= dblPatternDelta)
                {
                    //dsPattern.Add( dtPatternPt1, PatternPt1 );
                    cntTurns++;
                    if (null != OnPeakFound)
                    {
                        OnPeakFound(this, dtPatternPt1, PatternPt1, PatternState);
                    }
                    //mp.ClassifyDoubleSeriesEnd( dsPattern );
                    if (PatternPt1 < PatternPt0)
                    {
                        //Console.WriteLine( "{0} Pattern from {1}", SmartQuant.Clock.Now, PatternState );
                        PatternState = EPatternState.up;
                    }
                    else
                    {
                        //Console.WriteLine( "{0} Pattern already {1}", SmartQuant.Clock.Now, PatternState );
                    }
                }
                else
                {
                    //rPatternDeltaDistance[ (int) Math.Round( dif * 100 ) ]++;
                }
                break;
            }
        }