// Code Copyright (2007) Ray Burkholder & One Unified // May not be used without attribution // ray@oneunified.net double dblPatternDelta = 0.30; // pt1 becomes new anchor when abs(pt0-pt1)>delta double PatternPt0; // pattern end point, drags pt1 away from anchor, but can retrace at will double PatternPt1; // pattern mid point, can only move away from anchor point DateTime dtPatternPt1; // when it was last encountered DoubleSeries dsPattern; enum EPatternState { init, start, down, up }; EPatternState PatternState; // // 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; //Console.WriteLine( "{0} Pattern start {1}", SmartQuant.Clock.Now, PatternState ); } else { PatternState = EPatternState.down; //Console.WriteLine( "{0} Pattern start {1}", SmartQuant.Clock.Now, PatternState ); } PatternPt1 = val; } break; case EPatternState.up: val = quote.Bid; // will need to sell on the bid PatternPt0 = val; if ( val > PatternPt1 ) { PatternPt1 = val; dtPatternPt1 = Clock.Now; cntNewUp++; } dif = PatternPt1 - PatternPt0; if ( dif >= dblPatternDelta ) { dsPattern.Add( dtPatternPt1, PatternPt1 ); 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 { } break; case EPatternState.down: val = quote.Ask; // will need to buy on the ask PatternPt0 = val; if ( val < PatternPt1 ) { PatternPt1 = val; dtPatternPt1 = Clock.Now; cntNewDown++; } dif = PatternPt0 - PatternPt1; dsPt0Ratio.Add( quote.DateTime, dif / dblPatternDelta ); if ( dif >= dblPatternDelta ) { dsPattern.Add( dtPatternPt1, PatternPt1 ); 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 { } break; }