//============================================================================ // Author : Ray Burkholder, ray@oneunified.net // Copyright : (c) 2007 One Unified // License : Released under GPL3 // Status : No warranty, express or implied. Supplied as is. // Note : Please contact author for commercial use rights // Date : 2007/10/07 // First File : 2006/01/10 //============================================================================ using System; using System.ComponentModel; using System.Drawing; using System.Collections; using SmartQuant.Data; using SmartQuant.Series; using SmartQuant.Indicators; using SmartQuant.Instruments; using SmartQuant.Trading; using SmartQuant.Optimization; namespace OneUnified { /// /// Summary description for CandleList. /// public class CandleList { private Queue qBodySum; private int maxQBodySumElements; private double sumBody; // body is the box, difference between open and close private double avgBody; // avg = sum/count private Hashtable htSignals; //private int maxRecentBarElements; //private Bar[] rRecentBars; //ArrayList rRecentBars; Bar bar0, bar1, bar2, bar3, bar4, bar5; // bar 0 is most recent private Candle.ETrend trendDir; private Bar lastTrendBar; int trendDuration; //BarSeries bs = DataManager.GetBarSeries( public int cntRecentBars { get { return qBodySum.Count; } } public double AvgBody { get { return avgBody; } } public CandleList( int i ) { qBodySum = new Queue( i * 2 ); // i controls size of queue maxQBodySumElements = i * 2; sumBody = 0.0; avgBody = 0.0; htSignals = new Hashtable( 20 ); // maxRecentBarElements = 6; //qRecentBars = new Queue( maxQRecentBarElements ); //rRecentBars = new ArrayList( maxRecentBarElements ); trendDir = Candle.ETrend.Neutral; trendDuration = 0; } public Bar Track( Bar bar ) { Bar oldbar; Candle.ETrend dirBar; htSignals.Clear(); if ( qBodySum.Count == maxQBodySumElements ) { oldbar = ( Bar ) qBodySum.Dequeue(); sumBody -= Candle.Body( oldbar ); } //if ( qRecentBars.Count == maxQRecentBarElements ) { // qRecentBars.Dequeue(); //} if ( 0 == qBodySum.Count ) { lastTrendBar = bar; } dirBar = Candle.Direction( bar ); bool bTrending = false; if ( ( bar.High > lastTrendBar.High ) && ( bar.Low > lastTrendBar.Low ) ) { if ( Candle.ETrend.Yang == trendDir ) { trendDuration++; } else { trendDir = Candle.ETrend.Yang; trendDuration = 1; } bTrending = true; } if ( ( bar.High < lastTrendBar.High ) && ( bar.Low < lastTrendBar.Low ) ) { if ( Candle.ETrend.Yin == trendDir ) { trendDuration++; } else { trendDir = Candle.ETrend.Yin; trendDuration = 1; } bTrending = true; } if ( !bTrending ) { // this comes by default if we didn't detect a trend if ( Candle.ETrend.Neutral == dirBar ) { if ( Candle.ETrend.Neutral == trendDir ) { trendDuration++; } else { trendDir = Candle.ETrend.Neutral; trendDuration = 1; } } else { trendDir = dirBar; trendDuration = 1; } } lastTrendBar = bar; qBodySum.Enqueue( bar ); sumBody += Candle.Body( bar ); avgBody = sumBody / (double) qBodySum.Count; bar5 = bar4; bar4 = bar3; bar3 = bar2; bar2 = bar1; bar1 = bar0; bar0 = bar; return bar; } public void EmitSignalList() { foreach ( string s in htSignals.Keys ) { Console.Write( " {0}", s ); } } public Candle.ECandle Identify( Bar bar ) { Candle.ECandle ct = Candle.ECandle.Unknown; if ( qBodySum.Count > 4 ) { //ct = Candle.CandleType( bar, avgBody ); } return ct; } //public Candle.ETrend Trend( Bar bar ) { // return Candle.ETrend.Neutral; //} public bool isBullishRay( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar0.Open > bar1.Open ) && ( bar1.Open > bar2.Open ) && ( bar0.Close > bar1.Close ) & ( bar1.Close > bar2.Close ); if ( bTest ) htSignals[ "BullishRay" ] = true; return bTest; } public bool isBearishRay( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( bar0.Open < bar1.Open ) && ( bar1.Open < bar2.Open ) && ( bar0.Close < bar1.Close ) & ( bar1.Close < bar2.Close ); if ( bTest ) htSignals[ "BearishRay" ] = true; return bTest; } public bool isBullishEngulfing( int i ) { // page 34 // bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); if ( !Candle.isSmallBody( bar1, avgBody ) ) { bTest &= Candle.ETrend.Yin == Candle.Direction( bar1 ); } bTest &= Candle.ETrend.Yang == Candle.Direction( bar0 ); double hi1 = Math.Max( bar1.Open, bar1.Close ); double lo1 = Math.Min( bar1.Open, bar1.Close ); double hi0 = bar0.Close; double lo0 = bar0.Open; bTest &= ( hi1 < hi0 ) && ( lo1 > lo0 ); if ( bTest ) htSignals[ "BullishEngulfing 34" ] = true; return bTest; } public bool isBearishEngulfing( int i ) { // bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); if ( !Candle.isSmallBody( bar1, avgBody ) ) { bTest &= Candle.ETrend.Yang == Candle.Direction( bar1 ); } bTest &= Candle.ETrend.Yin == Candle.Direction( bar0 ); double hi1 = Math.Max( bar1.Open, bar1.Close ); double lo1 = Math.Min( bar1.Open, bar1.Close ); double hi0 = bar0.Open; double lo0 = bar0.Close; bTest &= ( hi1 < hi0 ) && ( lo1 > lo0 ); if ( bTest ) htSignals[ "BearishEngulfing 36" ] = true; return bTest; } public bool isHammer( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= Candle.isHammer( bar1, avgBody ); bTest &= Candle.ETrend.Yang == Candle.Direction( bar0 ); if ( bTest ) htSignals[ "Hammer 38" ] = true; return bTest; } public bool isHangingMan( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= Candle.isHangingMan( bar1, avgBody ); bTest &= Candle.ETrend.Yin == Candle.Direction( bar0 ); if ( bTest ) htSignals[ "HangingMan 40" ] = true; return bTest; } public bool isPiercingPattern( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar1, avgBody ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar0 ).Open < ( bar1 ).Low; bTest &= ( bar0 ).Close > ( ( bar1 ).Close + ( Candle.Body( bar1 ) / 2.0 ) ); if ( bTest ) htSignals[ "PiercingPattern 42" ] = true; return bTest; } public bool isDarkCloudCover( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar1, avgBody ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( bar0 ).Open > ( bar1 ).High; bTest &= ( bar0 ).Close < ( ( bar1 ).Close - ( Candle.Body( bar1 ) / 2.0 ) ); if ( bTest ) htSignals[ "DarkCloudCover 44" ] = true; return bTest; } public bool isBullishHarami( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar1 ).Close < ( bar2 ).Open; bTest &= ( bar1 ).Open > ( bar2 ).Close; if ( bTest ) htSignals[ "BullishHarami 46" ] = true; return bTest; } public bool isBearishHarami( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( bar1 ).Open < ( bar2 ).Close; bTest &= ( bar1 ).Close > ( bar2 ).Open; if ( bTest ) htSignals[ "BearishHarami 48" ] = true; return bTest; } public bool isMorningStar( int i ) { // page 50 bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar0 ).Close > ( ( bar2 ).Close + ( Candle.Body( bar2 ) / 2.0 ) ); bTest &= bar1.Open < bar2.Close; bTest &= bar0.Open > bar1.Close; bTest &= ( Candle.isHammer( bar1, avgBody ) || Candle.isDoji( bar1, avgBody ) || Candle.isReverseHammer( bar1, avgBody ) ); if ( bTest ) htSignals[ "MorningStar 50" ] = true; return bTest; } public bool isEveningStar( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( bar0 ).Close < ( ( bar2 ).Close - ( Candle.Body( bar2 ) / 2.0 ) ); bTest &= bar1.Open > bar2.Close; bTest &= bar0.Open < bar1.Close; bTest &= ( Candle.isHangingMan( bar1, avgBody ) || Candle.isDoji( bar1, avgBody ) || Candle.isShootingStar( bar1, avgBody ) ); if ( bTest ) htSignals[ "EveningStar 54" ] = true; return bTest; } public bool isBullishKicker( int i ) { bool bTest = true; bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= Math.Abs( bar0.Open - bar1.Open ) <= Candle.bald; bTest &= bar0.Low >= bar1.High; if ( bTest ) htSignals[ "BullishKicker 56" ] = true; return bTest; } public bool isBearishKicker( int i ) { bool bTest = true; bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= Math.Abs( bar0.Open - bar1.Open ) <= Candle.bald; bTest &= bar0.High <= bar1.Low; if ( bTest ) htSignals[ "BearishKicker 56" ] = true; return bTest; } public bool isBearishTriStar( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= Candle.isDoji( bar2, avgBody ); bTest &= Candle.isDoji( bar1, avgBody ); bTest &= Candle.isDoji( bar0, avgBody ); bTest &= ( ( bar1 ).Open > ( bar2 ).Close ) && ( ( bar1 ).Close > ( bar0 ).Open ); if ( bTest ) htSignals[ "BearishTriStar 64" ] = true; return bTest; } public bool isBullishTriStar( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); bTest &= Candle.isDoji( bar2, avgBody ); bTest &= Candle.isDoji( bar1, avgBody ); bTest &= Candle.isDoji( bar0, avgBody ); bTest &= ( ( bar1 ).Open > ( bar2 ).Close ) && ( ( bar1 ).Close > ( bar0 ).Open ); if ( bTest ) htSignals[ "BullishTriStar 64" ] = true; return bTest; } public bool isThreeBlackCrows( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar2, avgBody ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar1, avgBody ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar0, avgBody ) ); bTest &= ( bar1.Open < bar2.Open ) && ( bar1.Open >= bar2.Close ) && ( bar0.Open < bar1.Open ) && ( bar0.Open >= bar1.Close ); if ( bTest ) htSignals[ "ThreeBlackCrows 66" ] = true; return bTest; } public bool isTwoCrows( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= Candle.isWhiteLong( bar2, avgBody ); bTest &= Candle.ETrend.Yin == Candle.Direction( bar1 ); bTest &= Candle.ETrend.Yin == Candle.Direction( bar0 ); bTest &= bar1.Close > bar2.Close; bTest &= ( bar0.Open < bar1.Open ) && ( bar0.Open > bar1.Close ) // bar0.open within bar1 && ( bar0.Close < bar2.Close ) && ( bar0.Close > bar2.Open ); // bar0.close within bar2 if ( bTest ) htSignals[ "TwoCrows 70" ] = true; return bTest; } public bool isUpsideGapTwoCrows( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= Candle.isWhiteLong( bar2, avgBody ); bTest &= Candle.ETrend.Yin == Candle.Direction( bar1 ); bTest &= Candle.ETrend.Yin == Candle.Direction( bar0 ); bTest &= bar1.Close > bar2.Close; bTest &= ( bar0.Open > bar1.Open ) && ( bar0.Close < bar1.Close ) // bar0.open greater than bar1 && ( bar0.Close > bar2.Close ); // bar0.close within bar2 if ( bTest ) htSignals[ "UpsideGapTwoCrows 72" ] = true; return bTest; } public bool isBullishMeetingLines( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= Candle.isBlackLong( bar1, avgBody ); bTest &= Candle.isWhiteLong( bar0, avgBody ); bTest &= ( bar0.Open < bar1.Close ) && ( Math.Abs( bar0.Close - bar1.Close ) <= Candle.bald ); if ( bTest ) htSignals[ "BullishMeetingLines 74" ] = true; return bTest; } public bool isBearishMeetingLines( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= Candle.isWhiteLong( bar1, avgBody ); bTest &= Candle.isBlackLong( bar0, avgBody ); bTest &= ( bar0.Open > bar1.Close ) && ( Math.Abs( bar0.Close - bar1.Close ) <= Candle.bald ); if ( bTest ) htSignals[ "BearishMeetingLines 74" ] = true; return bTest; } public bool isBullishBeltHold( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= Candle.isOpeningWhiteMarubozu( bar0, avgBody ); bTest &= bar0.High < bar1.Low; if ( bTest ) htSignals[ "BullishBeltHold 76" ] = true; return bTest; } public bool isBearishBeltHold( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= Candle.isOpeningBlackMarubozu( bar0, avgBody ); bTest &= bar0.Low > bar1.High; if ( bTest ) htSignals[ "BearishBeltHold 76" ] = true; return bTest; } public bool isThreeWhiteSoldiers( int i ) { bool bTest = true; if ( 3 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar5 ) ); if ( 2 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar2, avgBody ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar1, avgBody ) ); bTest &= ( Candle.ETradingDay.Long == Candle.TradingDayType( bar0, avgBody ) ); bTest &= ( bar1.Close > bar2.Close ) && ( bar0.Close > bar1.Close ) && ( bar1.Open > bar2.Open ) && ( bar1.Open <= bar2.Close ) && ( bar0.Open > bar1.Open ) && ( bar0.Open <= bar1.Close ); bTest &= ( bar1.Open > ( bar2.Open + Candle.Body( bar2 ) / 2.0 ) ); bTest &= ( bar0.Open > ( bar1.Open + Candle.Body( bar1 ) / 2.0 ) ); if ( bTest ) htSignals[ "ThreeWhiteSoldiers 86" ] = true; return bTest; } public bool isUpsideTasukiGap( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( bar1.Low > bar2.High ); bTest &= ( bar0.Open < bar1.Close ) && ( bar0.Open > bar1.Open ); bTest &= ( bar0.Close < bar1.Open ) && ( bar0.Close > bar2.Close ); if ( bTest ) htSignals[ "UpsideTasukiGap 104" ] = true; return bTest; } public bool isDownsideTasukiGap( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar1.High < bar2.Low ); bTest &= ( bar0.Open > bar1.Close ) && ( bar0.Open > bar1.Open ); bTest &= ( bar0.Close > bar1.Open ) && ( bar0.Close < bar2.Close ); if ( bTest ) htSignals[ "DownsideTasukiGap 106" ] = true; return bTest; } public bool isOnNeckLine( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( Math.Abs( bar0.Close - bar1.Low ) <= Candle.bald ); if ( bTest ) htSignals[ "OnNeckLine 108" ] = true; return bTest; } public bool isInNeckLine( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar0.Open < bar1.Low ) && ( bar0.Close > bar1.Close ) && ( bar0.Close < ( bar1.Close + 0.25 * Candle.Body( bar1 ) ) ); if ( bTest ) htSignals[ "InNeckLine 110" ] = true; return bTest; } public bool isThrusting( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= ( bar0.Open < bar1.Low ) && ( bar0.Close < ( bar1.Close + ( 0.50 * Candle.Body( bar1 ) ) ) ) && ( bar0.Close > ( bar1.Close + ( 0.20 * Candle.Body( bar1 ) ) ) ) ; if ( bTest ) htSignals[ "Thrusting 112" ] = true; return bTest; } public bool isRisingTwoMethod( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar4 ) ); bTest &= Candle.isWhiteLong( bar3, avgBody ); bTest &= Candle.isWhiteLong( bar0, avgBody ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( bar1.Close > bar3.Open ) && ( bar2.Close > bar3.Open ); bTest &= ( bar0.Open >= bar1.Close ) && ( bar0.Open <= bar1.Open ) && ( bar0.Close > bar3.Close ); if ( bTest ) htSignals[ "RisingTwoMethod 114" ] = true; return bTest; } public bool isRisingThreeMethod( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar5 ) ); bTest &= Candle.isWhiteLong( bar4, avgBody ); bTest &= Candle.isWhiteLong( bar0, avgBody ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ); if ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ) { bTest &= ( bar2.Close > bar4.Open ); } bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( bar1.Close > bar4.Open ) && ( bar3.Close > bar4.Open ); bTest &= ( bar0.Open >= bar1.Close ) && ( bar0.Open <= bar1.Open ) && ( bar0.Close > bar4.Close ); if ( bTest ) htSignals[ "RisingThreeMethod 114" ] = true; return bTest; } public bool isRisingFourMethod( int i ) { bool bTest = true; bTest &= Candle.isWhiteLong( bar5, avgBody ); bTest &= Candle.isWhiteLong( bar0, avgBody ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( Candle.ETrend.Yin == Candle.Direction( bar3 ) ) { bTest &= ( bar3.Close > bar5.Open ); } if ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ) { bTest &= ( bar2.Close > bar5.Open ); } bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( bar1.Close > bar5.Open ) && ( bar4.Close > bar5.Open ); bTest &= ( bar0.Open >= bar1.Close ) & ( bar0.Open <= bar1.Open ) && ( bar0.Close > bar5.Close ); if ( bTest ) htSignals[ "RisingFourMethod 114" ] = true; return bTest; } public bool isFallingTwoMethod( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); bTest &= Candle.isBlackLong( bar3, avgBody ); bTest &= Candle.isBlackLong( bar0, avgBody ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( bar1.Close < bar3.Open ) && ( bar2.Close < bar3.Open ); bTest &= ( bar0.Open <= bar1.Close ) && ( bar0.Open >= bar1.Open ) && ( bar0.Close < bar3.Close ); if ( bTest ) htSignals[ "FallingTwoMethod 116" ] = true; return bTest; } public bool isFallingThreeMethod( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar5 ) ); bTest &= Candle.isBlackLong( bar4, avgBody ); bTest &= Candle.isBlackLong( bar0, avgBody ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); if ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ) { bTest &= ( bar2.Close < bar4.Open ); } bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( bar1.Close < bar4.Open ) && ( bar3.Close < bar4.Open ); bTest &= ( bar0.Open <= bar1.Close ) && ( bar0.Open >= bar1.Open ) && ( bar0.Close < bar4.Close ); if ( bTest ) htSignals[ "FallingThreeMethod 116" ] = true; return bTest; } public bool isFallingFourMethod( int i ) { bool bTest = true; bTest &= Candle.isBlackLong( bar5, avgBody ); bTest &= Candle.isBlackLong( bar0, avgBody ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar4 ) ); if ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ) { bTest &= ( bar3.Close < bar5.Open ); } if ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ) { bTest &= ( bar2.Close < bar5.Open ); } bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( bar1.Close < bar5.Open ) && ( bar4.Close < bar5.Open ); bTest &= ( bar0.Open <= bar1.Close ) & ( bar0.Open >= bar1.Open ) && ( bar0.Close < bar5.Close ); if ( bTest ) htSignals[ "FallingFourMethod 116" ] = true; return bTest; } public bool isBullishSeparatingLines( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar0 ) ); bTest &= Math.Abs( bar0.Open - bar1.Open ) <= Candle.bald; if ( bTest ) htSignals[ "BullishSeparatingLines 120" ] = true; return bTest; } public bool isBearishSeparatingLines( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= Math.Abs( bar0.Open - bar1.Open ) <= Candle.bald; if ( bTest ) htSignals[ "BearishSeparatingLines 120" ] = true; return bTest; } public bool isUpsideGapThreeMethod( int i ) { bool bTest = true; if ( 1 <= i ) bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar3 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar2 ) ); bTest &= ( Candle.ETrend.Yang == Candle.Direction( bar1 ) ); bTest &= ( Candle.ETrend.Yin == Candle.Direction( bar0 ) ); bTest &= ( bar1.Open > bar2.Close ) && ( bar0.Open >= bar1.Open ) && ( bar0.Open < bar1.Close ) && ( bar0.Close > bar2.Open ) && ( bar0.Close < bar2.Close ); if ( bTest ) htSignals[ "UpsideGapThreeMethod 126" ] = true; return bTest; } public bool CheckTrend( Candle.ETrend trend ) { return true; } } }