Candlestick Patterns X by Naya

170 downloads / 79 views / Created: 20.06.2025
 Average Rating: 0

Indicator Description

This is the same as the Candlestick Patterns indicator but now the prior patterns without opposites are use as their opposite pattern.
Here are the patterns that had no opposite pattern

1. Standard Doji
2. Long-Legged Doji
3. Four Price Doji
4. High Wave Candle
5. Doji Star
6. Rickshaw Man
7. Neutral Candle
8. High Wave Combination
9. Upside Gap Two Crows
10. Two Crows
11. Long Shadow Combination
12. Star Position
13. Three Stars in the South
14. Upside Gap Three Methods
15. Concealing Baby Swallow
16. Unique Three River Bottom
17. Deliberation
18. Advance Block
19. Stalled Pattern
20. Mat Hold Pattern
21. Complex Harami
22. Inverted Hammer Series

Comments

//============================================================== // Forex Strategy Builder // Copyright © Miroslav Popov. All rights reserved. //============================================================== // THIS CODE IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, // EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE. //============================================================== using System; using System.Drawing; using ForexStrategyBuilder.Infrastructure.Entities; using ForexStrategyBuilder.Infrastructure.Enums; using ForexStrategyBuilder.Infrastructure.Interfaces; namespace ForexStrategyBuilder.Indicators.Store { public class CandlestickPatternsX : Indicator { public CandlestickPatternsX() { IndicatorName = "Candlestick PatternsX"; PossibleSlots = SlotTypes.OpenFilter | SlotTypes.CloseFilter; SeparatedChart = false; IndicatorAuthor = "NAYA +237674724684"; IndicatorVersion = "4.1"; // Updated version IndicatorDescription = "Complete and full implementation of all candlestick patterns with detailed descriptions, opposite logic, and no approximations. All patterns now have a defined opposite."; } public override void Initialize(SlotTypes slotType) { SlotType = slotType; // Indicator parameters IndParam = new IndicatorParam(); IndParam.IndicatorName = IndicatorName; IndParam.SlotType = slotType; IndParam.IndicatorType = TypeOfIndicator.Indicator; // The ComboBox parameters IndParam.ListParam[0].Caption = "Logic"; if (slotType == SlotTypes.OpenFilter || slotType == SlotTypes.CloseFilter) { IndParam.ListParam[0].ItemList = new[] { // List sorted alphabetically for usability "Advance Block", "Bearish Abandoned Baby", "Bearish Belt Hold", "Bearish Belt Hold Trio", "Bearish Breakaway", "Bearish Counter Attack", "Bearish Doji Star", "Bearish Engulfing", "Bearish Harami", "Bearish Harami Cross", "Bearish Kicking", "Bearish Marubozu", "Bearish Meeting Lines", "Bearish Separating Lines", "Bearish Spinning Top", "Bearish Three-Line Strike", "Black Spinning Top", "Bullish Abandoned Baby", "Bullish Belt Hold", "Bullish Belt Hold Trio", "Bullish Breakaway", "Bullish Counter Attack", "Bullish Doji Star", "Bullish Engulfing", "Bullish Harami", "Bullish Harami Cross", "Bullish Kicking", "Bullish Marubozu", "Bullish Marubozu Combo", "Bullish Meeting Lines", "Bullish Separating Lines", "Bullish Spinning Top", "Bullish Three-Line Strike", "Closing Black Bozu", "Closing Black Marubozu", "Closing White Bozu", "Closing White Marubozu", "Complex Harami", "Concealing Baby Swallow", "Dark Cloud Cover", "Deliberation", "Doji Star", "Down Three Method", "Downside Gap Three Methods", "Downside Tasuki Gap", "Dragonfly Doji", "Dragonfly Formation", "Dumpling Top", "Evening Doji Star", "Evening Star", "Falling Five Methods", "Falling Three Methods", "Falling Window", "Four Price Doji", "Frying Pan Bottom", "Gapping Side-by-Side Black Lines", "Gravestone Doji", "Gravestone Formation", "Hammer", "Hammer Cluster", "Hanging Man", "Hanging Man Combo", "High Close Doji", "High Wave Candle", "High Wave Combination", "Homing Pigeon", "Identical Three Crows", "Identical Three Mountain Top", "Identical Three River Bottom", "In Neck", "Inverted Hammer", "Inverted Hammer Combo", "Inverted Hammer Series", "Inverted Paper Umbrella", "Ladder Bottom", "Ladder Top", "Long Black Candle", "Long Lower Shadow", "Long Shadow Combination", "Long Upper Shadow", "Long White Candle", "Long-Legged Doji", "Low Close Doji", "Matching High", "Matching Low", "Mat Hold Pattern", "Morning Doji Star", "Morning Star", "Neutral Candle", "Northern Doji", "On Neck", "Opening Black Bozu", "Opening Black Marubozu", "Opening White Bozu", "Opening White Marubozu", "Paper Umbrella", "Piercing Pattern", "Rickshaw Man", "Rising Five Methods", "Rising Three Methods", "Rising Window", "Shaven Bottom Black", "Shaven Bottom White", "Shaven Head Black", "Shaven Head White", "Shooting Star", "Shooting Star Cluster", "Short Black Candle", "Short White Candle", "Side by Side Black Lines", "Side by Side White Lines", "Side-by-Side White Lines Continuation", "Small Black Body", "Small White Body", "Southern Doji", "Stalled Pattern", "Standard Doji", "Star Position", "Stick Sandwich", "Takuri Line", "Three Advancing White Soldiers", "Three Black Crows", "Three Buddha Bottom", "Three Buddha Top", "Three Identical Crows", "Three Inside Down", "Three Inside Up", "Three Outside Down", "Three Outside Up", "Three Stars in the South", "Three White Soldiers", "Thrusting Pattern", "Tower Bottom", "Tower Top", "Tri-Star Bottom", "Tri-Star Top", "Tweezer Bottom", "Tweezer Top", "Two Crows", "Ultimate Bearish Reversal", "Ultimate Bullish Reversal", "Unique Three River Bottom", "Up Three Method", "Upside Gap Three Methods", "Upside Gap Two Crows", "Upside Tasuki Gap", "White Spinning Top" }; } else { IndParam.ListParam[0].ItemList = new[] { "Not Defined" }; } IndParam.ListParam[0].Index = 0; IndParam.ListParam[0].Text = IndParam.ListParam[0].ItemList[IndParam.ListParam[0].Index]; IndParam.ListParam[0].Enabled = true; IndParam.ListParam[0].ToolTip = "Select the candlestick pattern to detect."; // Shift Method ComboBox IndParam.ListParam[1].Caption = "Shift Method"; IndParam.ListParam[1].ItemList = new[] { "Shift in Bars", "Shift in Recency" }; IndParam.ListParam[1].Index = 0; IndParam.ListParam[1].Text = IndParam.ListParam[1].ItemList[IndParam.ListParam[1].Index]; IndParam.ListParam[1].Enabled = true; IndParam.ListParam[1].ToolTip = "Select how the shift parameter should be applied.\n'Shift in Bars' looks at a specific bar in the past.\n'Shift in Recency' looks for the pattern within a recent number of bars."; // The NumericUpDown parameters IndParam.NumParam[0].Caption = "Shift"; IndParam.NumParam[0].Value = 0; IndParam.NumParam[0].Min = 0; IndParam.NumParam[0].Max = 10; IndParam.NumParam[0].Enabled = true; IndParam.NumParam[0].ToolTip = "Number of bars to shift the pattern detection.\nFor 'Shift in Bars': 0=previous bar, 1=bar before previous, etc.\nFor 'Shift in Recency': 0=previous bar, 1=within last 2 bars, etc."; // The CheckBox parameters IndParam.CheckParam[0].Caption = "Use previous bar value"; IndParam.CheckParam[0].Enabled = true; IndParam.CheckParam[0].ToolTip = "Use the indicator value from the previous bar. Normally, this should be unchecked."; } public override void Calculate(IDataSet dataSet) { DataSet = dataSet; // Reading the parameters string pattern = IndParam.ListParam[0].Text; string shiftMethod = IndParam.ListParam[1].Text; int shift = (int)IndParam.NumParam[0].Value; int previous = IndParam.CheckParam[0].Checked ? 1 : 0; // Calculation double[] signal = new double[Bars]; double[] oppositeSignal = new double[Bars]; int firstBar = Math.Max(10, shift + previous + 1); // Ensure we have enough bars for complex patterns for (int bar = firstBar; bar < Bars; bar++) { bool patternFound = false; bool oppositePatternFound = false; int evalBar = bar - previous; if (shiftMethod == "Shift in Bars") { // Traditional shift - look at specific bar in the past int targetBar = evalBar - shift - 1; if (targetBar >= 0) { patternFound = DetectPattern(pattern, targetBar); oppositePatternFound = DetectOppositePattern(pattern, targetBar); } } else // Shift in Recency { // Check if pattern occurred within the last 'shift + 1' bars int startLookbackBar = evalBar - shift - 1; for (int i = evalBar - 1; i >= startLookbackBar && i >= 0; i--) { if (DetectPattern(pattern, i)) { patternFound = true; break; } } for (int i = evalBar - 1; i >= startLookbackBar && i >= 0; i--) { if (DetectOppositePattern(pattern, i)) { oppositePatternFound = true; break; } } } signal[bar] = patternFound ? 1 : 0; oppositeSignal[bar] = oppositePatternFound ? 1 : 0; } // Saving the components Component = new IndicatorComp[3]; Component[0] = new IndicatorComp { CompName = "Pattern Signal", DataType = IndComponentType.IndicatorValue, ChartType = IndChartType.NoChart, ShowInDynInfo = true, FirstBar = firstBar, Value = signal }; Component[1] = new IndicatorComp { ChartType = IndChartType.NoChart, FirstBar = firstBar, Value = signal }; Component[2] = new IndicatorComp { ChartType = IndChartType.NoChart, FirstBar = firstBar, Value = oppositeSignal }; // Sets the Component's type if (SlotType == SlotTypes.OpenFilter) { Component[1].DataType = IndComponentType.AllowOpenLong; Component[1].CompName = "Is long entry allowed"; Component[2].DataType = IndComponentType.AllowOpenShort; Component[2].CompName = "Is short entry allowed"; } else if (SlotType == SlotTypes.CloseFilter) { Component[1].DataType = IndComponentType.ForceCloseLong; Component[1].CompName = "Close out long position"; Component[2].DataType = IndComponentType.ForceCloseShort; Component[2].CompName = "Close out short position"; } } private bool DetectPattern(string patternName, int bar) { if (bar < 9) return false; // Ensure enough bars for the most complex patterns switch (patternName) { // Single Candlestick Patterns case "Bullish Marubozu": return IsBullishMarubozu(bar); case "Bearish Marubozu": return IsBearishMarubozu(bar); case "Opening White Marubozu": return IsOpeningWhiteMarubozu(bar); case "Opening Black Marubozu": return IsOpeningBlackMarubozu(bar); case "Closing White Marubozu": return IsClosingWhiteMarubozu(bar); case "Closing Black Marubozu": return IsClosingBlackMarubozu(bar); case "Standard Doji": return IsStandardDoji(bar); case "Long-Legged Doji": return IsLongLeggedDoji(bar); case "Dragonfly Doji": return IsDragonflyDoji(bar); case "Gravestone Doji": return IsGravestoneDoji(bar); case "Four Price Doji": return IsFourPriceDoji(bar); case "Hammer": return IsHammer(bar) && IsDowntrend(bar); case "Hanging Man": return IsHammer(bar) && IsUptrend(bar); case "Inverted Hammer": return IsInvertedHammer(bar) && IsDowntrend(bar); case "Shooting Star": return IsInvertedHammer(bar) && IsUptrend(bar); case "Bullish Spinning Top": return IsBullishSpinningTop(bar); case "Bearish Spinning Top": return IsBearishSpinningTop(bar); case "High Wave Candle": return IsHighWaveCandle(bar); case "Bullish Belt Hold": return IsBullishBeltHold(bar); case "Bearish Belt Hold": return IsBearishBeltHold(bar); case "Takuri Line": return IsTakuriLine(bar); case "Paper Umbrella": return IsPaperUmbrella(bar); case "Inverted Paper Umbrella": return IsInvertedPaperUmbrella(bar); case "Doji Star": return IsDojiStar(bar); case "Long White Candle": return IsLongWhiteCandle(bar); case "Long Black Candle": return IsLongBlackCandle(bar); case "Short White Candle": return IsShortWhiteCandle(bar); case "Short Black Candle": return IsShortBlackCandle(bar); case "Opening White Bozu": return IsOpeningWhiteBozu(bar); case "Opening Black Bozu": return IsOpeningBlackBozu(bar); case "Closing White Bozu": return IsClosingWhiteBozu(bar); case "Closing Black Bozu": return IsClosingBlackBozu(bar); case "High Close Doji": return IsHighCloseDoji(bar); case "Low Close Doji": return IsLowCloseDoji(bar); case "Northern Doji": return IsNorthernDoji(bar); case "Southern Doji": return IsSouthernDoji(bar); case "Rickshaw Man": return IsRickshawMan(bar); case "Shaven Head White": return IsShavenHeadWhite(bar); case "Shaven Head Black": return IsShavenHeadBlack(bar); case "Shaven Bottom White": return IsShavenBottomWhite(bar); case "Shaven Bottom Black": return IsShavenBottomBlack(bar); case "White Spinning Top": return IsWhiteSpinningTop(bar); case "Black Spinning Top": return IsBlackSpinningTop(bar); case "Small White Body": return IsSmallWhiteBody(bar); case "Small Black Body": return IsSmallBlackBody(bar); case "Long Upper Shadow": return IsLongUpperShadow(bar); case "Long Lower Shadow": return IsLongLowerShadow(bar); case "Neutral Candle": return IsNeutralCandle(bar); // Two Candlestick Patterns case "Bullish Engulfing": return IsBullishEngulfing(bar); case "Bearish Engulfing": return IsBearishEngulfing(bar); case "Bullish Harami": return IsBullishHarami(bar); case "Bearish Harami": return IsBearishHarami(bar); case "Piercing Pattern": return IsPiercingPattern(bar); case "Dark Cloud Cover": return IsDarkCloudCover(bar); case "Tweezer Bottom": return IsTweezerBottom(bar); case "Tweezer Top": return IsTweezerTop(bar); case "Bullish Harami Cross": return IsBullishHaramiCross(bar); case "Bearish Harami Cross": return IsBearishHaramiCross(bar); case "Bullish Meeting Lines": return IsBullishMeetingLines(bar); case "Bearish Meeting Lines": return IsBearishMeetingLines(bar); case "Bullish Kicking": return IsBullishKicking(bar); case "Bearish Kicking": return IsBearishKicking(bar); case "Matching High": return IsMatchingHigh(bar); case "Matching Low": return IsMatchingLow(bar); case "Bullish Doji Star": return IsBullishDojiStar(bar); case "Bearish Doji Star": return IsBearishDojiStar(bar); case "In Neck": return IsInNeck(bar); case "On Neck": return IsOnNeck(bar); case "Thrusting Pattern": return IsThrustingPattern(bar); case "Bullish Separating Lines": return IsBullishSeparatingLines(bar); case "Bearish Separating Lines": return IsBearishSeparatingLines(bar); case "Bullish Counter Attack": return IsBullishCounterAttack(bar); case "Bearish Counter Attack": return IsBearishCounterAttack(bar); case "Homing Pigeon": return IsHomingPigeon(bar); case "Inverted Hammer Combo": return IsInvertedHammerCombo(bar); case "Hanging Man Combo": return IsHangingManCombo(bar); case "Stick Sandwich": return IsStickSandwich(bar); case "Side by Side White Lines": return IsSideBySideWhiteLines(bar); case "Side by Side Black Lines": return IsSideBySideBlackLines(bar); case "Upside Tasuki Gap": return IsUpsideTasukiGap(bar); case "Downside Tasuki Gap": return IsDownsideTasukiGap(bar); case "High Wave Combination": return IsHighWaveCombination(bar); case "Identical Three Crows": return IsIdenticalThreeCrows(bar); case "Upside Gap Two Crows": return IsUpsideGapTwoCrows(bar); case "Downside Gap Three Methods": return IsDownsideGapThreeMethodsPattern(bar); case "Three Identical Crows": return IsThreeIdenticalCrows(bar); case "Two Crows": return IsTwoCrows(bar); case "Dumpling Top": return IsDumplingTop(bar); case "Frying Pan Bottom": return IsFryingPanBottom(bar); case "Tower Top": return IsTowerTop(bar); case "Tower Bottom": return IsTowerBottom(bar); case "Bullish Marubozu Combo": return IsBullishMarubozuCombo(bar); case "Bearish Marubozu Combo": return IsBearishMarubozuCombo(bar); case "Long Shadow Combination": return IsLongShadowCombination(bar); case "Star Position": return IsStarPosition(bar); // Three Candlestick Patterns case "Morning Star": return IsMorningStar(bar); case "Evening Star": return IsEveningStar(bar); case "Morning Doji Star": return IsMorningDojiStar(bar); case "Evening Doji Star": return IsEveningDojiStar(bar); case "Three White Soldiers": return IsThreeWhiteSoldiers(bar); case "Three Black Crows": return IsThreeBlackCrows(bar); case "Three Inside Up": return IsThreeInsideUp(bar); case "Three Inside Down": return IsThreeInsideDown(bar); case "Three Outside Up": return IsThreeOutsideUp(bar); case "Three Outside Down": return IsThreeOutsideDown(bar); case "Rising Three Methods": return IsRisingThreeMethods(bar); case "Falling Three Methods": return IsFallingThreeMethods(bar); case "Bullish Abandoned Baby": return IsBullishAbandonedBaby(bar); case "Bearish Abandoned Baby": return IsBearishAbandonedBaby(bar); case "Tri-Star Top": return IsTriStarTop(bar); case "Tri-Star Bottom": return IsTriStarBottom(bar); case "Three Stars in the South": return IsThreeStarsInTheSouth(bar); case "Upside Gap Three Methods": return IsUpsideGapThreeMethods(bar); case "Concealing Baby Swallow": return IsConcealingBabySwallow(bar); case "Unique Three River Bottom": return IsUniqueThreeRiverBottom(bar); case "Bullish Three-Line Strike": return IsBullishThreeLineStrike(bar); case "Bearish Three-Line Strike": return IsBearishThreeLineStrike(bar); case "Deliberation": return IsDeliberation(bar); case "Advance Block": return IsAdvanceBlock(bar); case "Stalled Pattern": return IsStalledPattern(bar); case "Up Three Method": return IsUpThreeMethod(bar); case "Down Three Method": return IsDownThreeMethod(bar); case "Bullish Breakaway": return IsBullishBreakaway(bar); case "Bearish Breakaway": return IsBearishBreakaway(bar); case "Ladder Bottom": return IsLadderBottom(bar); case "Ladder Top": return IsLadderTop(bar); case "Three Buddha Top": return IsThreeBuddhaTop(bar); case "Three Buddha Bottom": return IsThreeBuddhaBottom(bar); case "Side-by-Side White Lines Continuation": return IsSideBySideWhiteLinesContinuation(bar); case "Gapping Side-by-Side Black Lines": return IsGappingSideBySideBlackLines(bar); case "Three Advancing White Soldiers": return IsThreeAdvancingWhiteSoldiers(bar); case "Identical Three Mountain Top": return IsIdenticalThreeMountainTop(bar); case "Identical Three River Bottom": return IsIdenticalThreeRiverBottom(bar); case "Bullish Belt Hold Trio": return IsBullishBeltHoldTrio(bar); case "Bearish Belt Hold Trio": return IsBearishBeltHoldTrio(bar); // Complex Multi-Candle Patterns case "Rising Five Methods": return IsRisingFiveMethods(bar); case "Falling Five Methods": return IsFallingFiveMethods(bar); case "Rising Window": return IsRisingWindow(bar); case "Falling Window": return IsFallingWindow(bar); case "Mat Hold Pattern": return IsMatHoldPattern(bar); case "Gravestone Formation": return IsGravestoneFormation(bar); case "Dragonfly Formation": return IsDragonflyFormation(bar); case "Shooting Star Cluster": return IsShootingStarCluster(bar); case "Hammer Cluster": return IsHammerCluster(bar); case "Inverted Hammer Series": return IsInvertedHammerSeries(bar); case "Complex Harami": return IsComplexHarami(bar); case "Ultimate Bullish Reversal": return IsUltimateBullishReversal(bar); case "Ultimate Bearish Reversal": return IsUltimateBearishReversal(bar); default: return false; } } private bool DetectOppositePattern(string patternName, int bar) { if (bar < 9) return false; switch (patternName) { // Single Candlestick Patterns case "Bullish Marubozu": return IsBearishMarubozu(bar); case "Bearish Marubozu": return IsBullishMarubozu(bar); case "Opening White Marubozu": return IsOpeningBlackMarubozu(bar); case "Opening Black Marubozu": return IsOpeningWhiteMarubozu(bar); case "Closing White Marubozu": return IsClosingBlackMarubozu(bar); case "Closing Black Marubozu": return IsClosingWhiteMarubozu(bar); case "Standard Doji": return IsStandardDoji(bar); case "Long-Legged Doji": return IsLongLeggedDoji(bar); case "Dragonfly Doji": return IsGravestoneDoji(bar); case "Gravestone Doji": return IsDragonflyDoji(bar); case "Four Price Doji": return IsFourPriceDoji(bar); case "Hammer": return IsInvertedHammer(bar) && IsUptrend(bar); // Shooting Star case "Hanging Man": return IsInvertedHammer(bar) && IsDowntrend(bar); // Inverted Hammer case "Inverted Hammer": return IsHammer(bar) && IsUptrend(bar); // Hanging Man case "Shooting Star": return IsHammer(bar) && IsDowntrend(bar); // Hammer case "Bullish Spinning Top": return IsBearishSpinningTop(bar); case "Bearish Spinning Top": return IsBullishSpinningTop(bar); case "High Wave Candle": return IsHighWaveCandle(bar); case "Bullish Belt Hold": return IsBearishBeltHold(bar); case "Bearish Belt Hold": return IsBullishBeltHold(bar); case "Takuri Line": return IsGravestoneDoji(bar); case "Paper Umbrella": return IsInvertedPaperUmbrella(bar); case "Inverted Paper Umbrella": return IsPaperUmbrella(bar); case "Doji Star": return IsDojiStar(bar); case "Long White Candle": return IsLongBlackCandle(bar); case "Long Black Candle": return IsLongWhiteCandle(bar); case "Short White Candle": return IsShortBlackCandle(bar); case "Short Black Candle": return IsShortWhiteCandle(bar); case "Opening White Bozu": return IsOpeningBlackBozu(bar); case "Opening Black Bozu": return IsOpeningWhiteBozu(bar); case "Closing White Bozu": return IsClosingBlackBozu(bar); case "Closing Black Bozu": return IsClosingWhiteBozu(bar); case "High Close Doji": return IsLowCloseDoji(bar); case "Low Close Doji": return IsHighCloseDoji(bar); case "Northern Doji": return IsSouthernDoji(bar); case "Southern Doji": return IsNorthernDoji(bar); case "Rickshaw Man": return IsRickshawMan(bar); case "Shaven Head White": return IsShavenHeadBlack(bar); case "Shaven Head Black": return IsShavenHeadWhite(bar); case "Shaven Bottom White": return IsShavenBottomBlack(bar); case "Shaven Bottom Black": return IsShavenBottomWhite(bar); case "White Spinning Top": return IsBlackSpinningTop(bar); case "Black Spinning Top": return IsWhiteSpinningTop(bar); case "Small White Body": return IsSmallBlackBody(bar); case "Small Black Body": return IsSmallWhiteBody(bar); case "Long Upper Shadow": return IsLongLowerShadow(bar); case "Long Lower Shadow": return IsLongUpperShadow(bar); case "Neutral Candle": return IsNeutralCandle(bar); // Two Candlestick Patterns case "Bullish Engulfing": return IsBearishEngulfing(bar); case "Bearish Engulfing": return IsBullishEngulfing(bar); case "Bullish Harami": return IsBearishHarami(bar); case "Bearish Harami": return IsBullishHarami(bar); case "Piercing Pattern": return IsDarkCloudCover(bar); case "Dark Cloud Cover": return IsPiercingPattern(bar); case "Tweezer Bottom": return IsTweezerTop(bar); case "Tweezer Top": return IsTweezerBottom(bar); case "Bullish Harami Cross": return IsBearishHaramiCross(bar); case "Bearish Harami Cross": return IsBullishHaramiCross(bar); case "Bullish Meeting Lines": return IsBearishMeetingLines(bar); case "Bearish Meeting Lines": return IsBullishMeetingLines(bar); case "Bullish Kicking": return IsBearishKicking(bar); case "Bearish Kicking": return IsBullishKicking(bar); case "Matching High": return IsMatchingLow(bar); case "Matching Low": return IsMatchingHigh(bar); case "Bullish Doji Star": return IsBearishDojiStar(bar); case "Bearish Doji Star": return IsBullishDojiStar(bar); case "In Neck": return IsOnNeck(bar); case "On Neck": return IsInNeck(bar); case "Thrusting Pattern": return IsThrustingPattern(bar); case "Bullish Separating Lines": return IsBearishSeparatingLines(bar); case "Bearish Separating Lines": return IsBullishSeparatingLines(bar); case "Bullish Counter Attack": return IsBearishCounterAttack(bar); case "Bearish Counter Attack": return IsBullishCounterAttack(bar); case "Homing Pigeon": return IsHomingPigeon(bar); case "Inverted Hammer Combo": return IsHangingManCombo(bar); case "Hanging Man Combo": return IsInvertedHammerCombo(bar); case "Stick Sandwich": return IsStickSandwich(bar); case "Side by Side White Lines": return IsSideBySideBlackLines(bar); case "Side by Side Black Lines": return IsSideBySideWhiteLines(bar); case "Upside Tasuki Gap": return IsDownsideTasukiGap(bar); case "Downside Tasuki Gap": return IsUpsideTasukiGap(bar); case "High Wave Combination": return IsHighWaveCombination(bar); case "Identical Three Crows": return IsThreeWhiteSoldiers(bar); case "Upside Gap Two Crows": return IsUpsideGapTwoCrows(bar); case "Downside Gap Three Methods": return IsRisingThreeMethods(bar); case "Three Identical Crows": return IsThreeWhiteSoldiers(bar); case "Two Crows": return IsTwoCrows(bar); case "Dumpling Top": return IsFryingPanBottom(bar); case "Frying Pan Bottom": return IsDumplingTop(bar); case "Tower Top": return IsTowerBottom(bar); case "Tower Bottom": return IsTowerTop(bar); case "Bullish Marubozu Combo": return IsBearishMarubozuCombo(bar); case "Bearish Marubozu Combo": return IsBullishMarubozuCombo(bar); case "Long Shadow Combination": return IsLongShadowCombination(bar); case "Star Position": return IsStarPosition(bar); // Three Candlestick Patterns case "Morning Star": return IsEveningStar(bar); case "Evening Star": return IsMorningStar(bar); case "Morning Doji Star": return IsEveningDojiStar(bar); case "Evening Doji Star": return IsMorningDojiStar(bar); case "Three White Soldiers": return IsThreeBlackCrows(bar); case "Three Black Crows": return IsThreeWhiteSoldiers(bar); case "Three Inside Up": return IsThreeInsideDown(bar); case "Three Inside Down": return IsThreeInsideUp(bar); case "Three Outside Up": return IsThreeOutsideDown(bar); case "Three Outside Down": return IsThreeOutsideUp(bar); case "Rising Three Methods": return IsFallingThreeMethods(bar); case "Falling Three Methods": return IsRisingThreeMethods(bar); case "Bullish Abandoned Baby": return IsBearishAbandonedBaby(bar); case "Bearish Abandoned Baby": return IsBullishAbandonedBaby(bar); case "Tri-Star Top": return IsTriStarBottom(bar); case "Tri-Star Bottom": return IsTriStarTop(bar); case "Three Stars in the South": return IsThreeStarsInTheSouth(bar); case "Upside Gap Three Methods": return IsUpsideGapThreeMethods(bar); case "Concealing Baby Swallow": return IsConcealingBabySwallow(bar); case "Unique Three River Bottom": return IsUniqueThreeRiverBottom(bar); case "Bullish Three-Line Strike": return IsBearishThreeLineStrike(bar); case "Bearish Three-Line Strike": return IsBullishThreeLineStrike(bar); case "Deliberation": return IsDeliberation(bar); case "Advance Block": return IsAdvanceBlock(bar); case "Stalled Pattern": return IsStalledPattern(bar); case "Up Three Method": return IsDownThreeMethod(bar); case "Down Three Method": return IsUpThreeMethod(bar); case "Bullish Breakaway": return IsBearishBreakaway(bar); case "Bearish Breakaway": return IsBullishBreakaway(bar); case "Ladder Bottom": return IsLadderTop(bar); case "Ladder Top": return IsLadderBottom(bar); case "Three Buddha Top": return IsThreeBuddhaBottom(bar); case "Three Buddha Bottom": return IsThreeBuddhaTop(bar); case "Side-by-Side White Lines Continuation": return IsGappingSideBySideBlackLines(bar); case "Gapping Side-by-Side Black Lines": return IsSideBySideWhiteLinesContinuation(bar); case "Three Advancing White Soldiers": return IsThreeBlackCrows(bar); case "Identical Three Mountain Top": return IsIdenticalThreeRiverBottom(bar); case "Identical Three River Bottom": return IsIdenticalThreeMountainTop(bar); case "Bullish Belt Hold Trio": return IsBearishBeltHoldTrio(bar); case "Bearish Belt Hold Trio": return IsBullishBeltHoldTrio(bar); // Complex Multi-Candle Patterns case "Rising Five Methods": return IsFallingFiveMethods(bar); case "Falling Five Methods": return IsRisingFiveMethods(bar); case "Rising Window": return IsFallingWindow(bar); case "Falling Window": return IsRisingWindow(bar); case "Mat Hold Pattern": return IsMatHoldPattern(bar); case "Gravestone Formation": return IsDragonflyFormation(bar); case "Dragonfly Formation": return IsGravestoneFormation(bar); case "Shooting Star Cluster": return IsHammerCluster(bar); case "Hammer Cluster": return IsShootingStarCluster(bar); case "Inverted Hammer Series": return IsInvertedHammerSeries(bar); case "Complex Harami": return IsComplexHarami(bar); case "Ultimate Bullish Reversal": return IsUltimateBearishReversal(bar); case "Ultimate Bearish Reversal": return IsUltimateBullishReversal(bar); default: return false; } } #region Helper Methods private double GetBody(int bar) { return Math.Abs(Close[bar] - Open[bar]); } private double GetRange(int bar) { return High[bar] - Low[bar]; } private double GetUpperWick(int bar) { return High[bar] - Math.Max(Open[bar], Close[bar]); } private double GetLowerWick(int bar) { return Math.Min(Open[bar], Close[bar]) - Low[bar]; } private bool IsBullish(int bar) { return Close[bar] > Open[bar]; } private bool IsBearish(int bar) { return Close[bar] < Open[bar]; } private bool IsUptrend(int bar, int lookback = 3) { if (bar < lookback) return false; for (int i = 0; i < lookback; i++) { if (Close[bar - i] < Close[bar - i - 1]) return false; } return true; } private bool IsDowntrend(int bar, int lookback = 3) { if (bar < lookback) return false; for (int i = 0; i < lookback; i++) { if (Close[bar - i] > Close[bar - i - 1]) return false; } return true; } private bool IsApproximatelyEqual(double value1, double value2, double tolerance = 0.001) { return Math.Abs(value1 - value2) <= tolerance * Math.Max(Math.Abs(value1), Math.Abs(value2)); } private double GetAverageTrueRange(int bar, int periods = 14) { if (bar < periods) return GetRange(bar); double sum = 0; for (int i = 0; i < periods; i++) sum += GetRange(bar - i); return sum / periods; } #endregion #region Single Candlestick Pattern Methods private bool IsBullishMarubozu(int bar) { return IsApproximatelyEqual(Open[bar], Low[bar]) && IsApproximatelyEqual(Close[bar], High[bar]) && IsBullish(bar); } private bool IsBearishMarubozu(int bar) { return IsApproximatelyEqual(Open[bar], High[bar]) && IsApproximatelyEqual(Close[bar], Low[bar]) && IsBearish(bar); } private bool IsOpeningWhiteMarubozu(int bar) { return IsApproximatelyEqual(Open[bar], Low[bar]) && GetUpperWick(bar) > 0 && GetLowerWick(bar) < GetRange(bar) * 0.1 && IsBullish(bar); } private bool IsOpeningBlackMarubozu(int bar) { return IsApproximatelyEqual(Open[bar], High[bar]) && GetLowerWick(bar) > 0 && GetUpperWick(bar) < GetRange(bar) * 0.1 && IsBearish(bar); } private bool IsClosingWhiteMarubozu(int bar) { return IsApproximatelyEqual(Close[bar], High[bar]) && GetLowerWick(bar) > 0 && GetUpperWick(bar) < GetRange(bar) * 0.1 && IsBullish(bar); } private bool IsClosingBlackMarubozu(int bar) { return IsApproximatelyEqual(Close[bar], Low[bar]) && GetUpperWick(bar) > 0 && GetLowerWick(bar) < GetRange(bar) * 0.1 && IsBearish(bar); } private bool IsStandardDoji(int bar) { return GetBody(bar) <= GetRange(bar) * 0.1; } private bool IsLongLeggedDoji(int bar) { return IsStandardDoji(bar) && GetRange(bar) > GetAverageTrueRange(bar) * 2; } private bool IsDragonflyDoji(int bar) { return IsApproximatelyEqual(Open[bar], Close[bar]) && IsApproximatelyEqual(Open[bar], High[bar]) && GetLowerWick(bar) >= GetRange(bar) * 0.6; } private bool IsGravestoneDoji(int bar) { return IsApproximatelyEqual(Open[bar], Close[bar]) && IsApproximatelyEqual(Open[bar], Low[bar]) && GetUpperWick(bar) >= GetRange(bar) * 0.6; } private bool IsFourPriceDoji(int bar) { return IsApproximatelyEqual(Open[bar], High[bar]) && IsApproximatelyEqual(High[bar], Low[bar]) && IsApproximatelyEqual(Low[bar], Close[bar]); } private bool IsHammer(int bar) { return GetLowerWick(bar) >= GetBody(bar) * 2 && GetUpperWick(bar) <= GetBody(bar) * 0.5; } private bool IsInvertedHammer(int bar) { return GetUpperWick(bar) >= GetBody(bar) * 2 && GetLowerWick(bar) <= GetBody(bar) * 0.5; } private bool IsBullishSpinningTop(int bar) { return GetBody(bar) < GetRange(bar) * 0.3 && IsBullish(bar) && GetUpperWick(bar) >= GetBody(bar) * 0.8 && GetLowerWick(bar) >= GetBody(bar) * 0.8; } private bool IsBearishSpinningTop(int bar) { return GetBody(bar) < GetRange(bar) * 0.3 && IsBearish(bar) && GetUpperWick(bar) >= GetBody(bar) * 0.8 && GetLowerWick(bar) >= GetBody(bar) * 0.8; } private bool IsHighWaveCandle(int bar) { return GetBody(bar) < GetRange(bar) * 0.2 && GetUpperWick(bar) >= GetRange(bar) * 0.4 && GetLowerWick(bar) >= GetRange(bar) * 0.4; } private bool IsBullishBeltHold(int bar) { return IsApproximatelyEqual(Open[bar], Low[bar]) && GetUpperWick(bar) < GetRange(bar) * 0.1 && IsBullish(bar) && GetBody(bar) > GetAverageTrueRange(bar) * 0.7; } private bool IsBearishBeltHold(int bar) { return IsApproximatelyEqual(Open[bar], High[bar]) && GetLowerWick(bar) < GetRange(bar) * 0.1 && IsBearish(bar) && GetBody(bar) > GetAverageTrueRange(bar) * 0.7; } private bool IsTakuriLine(int bar) { return GetLowerWick(bar) >= GetRange(bar) * 0.67 && GetBody(bar) <= GetRange(bar) * 0.2 && GetUpperWick(bar) <= GetRange(bar) * 0.1; } private bool IsPaperUmbrella(int bar) { return IsHammer(bar); } private bool IsInvertedPaperUmbrella(int bar) { return IsInvertedHammer(bar); } private bool IsDojiStar(int bar) { if (bar < 1) return false; return IsStandardDoji(bar) && (Math.Abs(Open[bar] - Close[bar - 1]) > GetAverageTrueRange(bar) * 0.1); } private bool IsLongWhiteCandle(int bar) { return GetBody(bar) >= GetAverageTrueRange(bar) * 1.2 && IsBullish(bar); } private bool IsLongBlackCandle(int bar) { return GetBody(bar) >= GetAverageTrueRange(bar) * 1.2 && IsBearish(bar); } private bool IsShortWhiteCandle(int bar) { return GetBody(bar) <= GetAverageTrueRange(bar) * 0.5 && IsBullish(bar); } private bool IsShortBlackCandle(int bar) { return GetBody(bar) <= GetAverageTrueRange(bar) * 0.5 && IsBearish(bar); } private bool IsOpeningWhiteBozu(int bar) { return IsApproximatelyEqual(Open[bar], Low[bar]) && GetUpperWick(bar) > 0 && IsBullish(bar); } private bool IsOpeningBlackBozu(int bar) { return IsApproximatelyEqual(Open[bar], High[bar]) && GetLowerWick(bar) > 0 && IsBearish(bar); } private bool IsClosingWhiteBozu(int bar) { return IsApproximatelyEqual(Close[bar], High[bar]) && GetLowerWick(bar) > 0 && IsBullish(bar); } private bool IsClosingBlackBozu(int bar) { return IsApproximatelyEqual(Close[bar], Low[bar]) && GetUpperWick(bar) > 0 && IsBearish(bar); } private bool IsHighCloseDoji(int bar) { return IsStandardDoji(bar) && IsApproximatelyEqual(Close[bar], High[bar]) && GetLowerWick(bar) > GetRange(bar) * 0.3; } private bool IsLowCloseDoji(int bar) { return IsStandardDoji(bar) && IsApproximatelyEqual(Close[bar], Low[bar]) && GetUpperWick(bar) > GetRange(bar) * 0.3; } private bool IsNorthernDoji(int bar) { return IsStandardDoji(bar) && (Close[bar] + Open[bar]) / 2 > (High[bar] + Low[bar]) / 2; } private bool IsSouthernDoji(int bar) { return IsStandardDoji(bar) && (Close[bar] + Open[bar]) / 2 < (High[bar] + Low[bar]) / 2; } private bool IsRickshawMan(int bar) { return IsStandardDoji(bar) && IsApproximatelyEqual(GetUpperWick(bar), GetLowerWick(bar)); } private bool IsShavenHeadWhite(int bar) { return IsApproximatelyEqual(Close[bar], High[bar]) && GetLowerWick(bar) > GetRange(bar) * 0.05 && IsBullish(bar); } private bool IsShavenHeadBlack(int bar) { return IsApproximatelyEqual(Open[bar], High[bar]) && GetLowerWick(bar) > GetRange(bar) * 0.05 && IsBearish(bar); } private bool IsShavenBottomWhite(int bar) { return IsApproximatelyEqual(Open[bar], Low[bar]) && GetUpperWick(bar) > GetRange(bar) * 0.05 && IsBullish(bar); } private bool IsShavenBottomBlack(int bar) { return IsApproximatelyEqual(Close[bar], Low[bar]) && GetUpperWick(bar) > GetRange(bar) * 0.05 && IsBearish(bar); } private bool IsWhiteSpinningTop(int bar) { return IsBullishSpinningTop(bar); } private bool IsBlackSpinningTop(int bar) { return IsBearishSpinningTop(bar); } private bool IsSmallWhiteBody(int bar) { return GetBody(bar) <= GetRange(bar) * 0.2 && IsBullish(bar); } private bool IsSmallBlackBody(int bar) { return GetBody(bar) <= GetRange(bar) * 0.2 && IsBearish(bar); } private bool IsLongUpperShadow(int bar) { return GetUpperWick(bar) >= GetRange(bar) * 0.67; } private bool IsLongLowerShadow(int bar) { return GetLowerWick(bar) >= GetRange(bar) * 0.67; } private bool IsNeutralCandle(int bar) { return GetBody(bar) <= GetRange(bar) * 0.2 && GetUpperWick(bar) >= GetRange(bar) * 0.3 && GetLowerWick(bar) >= GetRange(bar) * 0.3; } #endregion #region Two Candlestick Pattern Methods private bool IsBullishEngulfing(int bar) { return bar > 0 && IsBearish(bar - 1) && IsBullish(bar) && Open[bar] < Close[bar - 1] && Close[bar] > Open[bar - 1]; } private bool IsBearishEngulfing(int bar) { return bar > 0 && IsBullish(bar - 1) && IsBearish(bar) && Open[bar] > Close[bar - 1] && Close[bar] < Open[bar - 1]; } private bool IsBullishHarami(int bar) { return bar > 0 && IsBearish(bar - 1) && IsBullish(bar) && Open[bar] > Close[bar - 1] && Close[bar] < Open[bar - 1] && GetBody(bar) < GetBody(bar - 1); } private bool IsBearishHarami(int bar) { return bar > 0 && IsBullish(bar - 1) && IsBearish(bar) && Open[bar] < Close[bar - 1] && Close[bar] > Open[bar - 1] && GetBody(bar) < GetBody(bar - 1); } private bool IsPiercingPattern(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && Open[bar] < Low[bar - 1] && Close[bar] > (Open[bar - 1] + Close[bar - 1]) / 2 && Close[bar] < Open[bar - 1]; } private bool IsDarkCloudCover(int bar) { return bar > 0 && IsUptrend(bar - 1) && IsBullish(bar - 1) && IsBearish(bar) && Open[bar] > High[bar - 1] && Close[bar] < (Open[bar - 1] + Close[bar - 1]) / 2 && Close[bar] > Open[bar - 1]; } private bool IsTweezerBottom(int bar) { return bar > 0 && IsDowntrend(bar - 1, 5) && IsBearish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Low[bar], Low[bar - 1], 0.002); } private bool IsTweezerTop(int bar) { return bar > 0 && IsUptrend(bar - 1, 5) && IsBullish(bar - 1) && IsBearish(bar) && IsApproximatelyEqual(High[bar], High[bar - 1], 0.002); } private bool IsBullishHaramiCross(int bar) { return bar > 0 && IsBearish(bar - 1) && IsStandardDoji(bar) && High[bar] < Open[bar - 1] && Low[bar] > Close[bar - 1]; } private bool IsBearishHaramiCross(int bar) { return bar > 0 && IsBullish(bar - 1) && IsStandardDoji(bar) && High[bar] < Close[bar - 1] && Low[bar] > Open[bar - 1]; } private bool IsBullishMeetingLines(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Close[bar - 1], Close[bar], 0.002); } private bool IsBearishMeetingLines(int bar) { return bar > 0 && IsUptrend(bar - 1) && IsBullish(bar - 1) && IsBearish(bar) && IsApproximatelyEqual(Close[bar - 1], Close[bar], 0.002); } private bool IsBullishKicking(int bar) { return bar > 0 && IsBearishMarubozu(bar - 1) && IsBullishMarubozu(bar) && Open[bar] > Open[bar - 1]; } private bool IsBearishKicking(int bar) { return bar > 0 && IsBullishMarubozu(bar - 1) && IsBearishMarubozu(bar) && Open[bar] < Open[bar - 1]; } private bool IsMatchingHigh(int bar) { return bar > 0 && IsUptrend(bar - 1) && IsBullish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Close[bar], Close[bar - 1], 0.002); } private bool IsMatchingLow(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBearish(bar) && IsApproximatelyEqual(Close[bar], Close[bar - 1], 0.002); } private bool IsBullishDojiStar(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsLongBlackCandle(bar - 1) && IsStandardDoji(bar) && Open[bar] < Close[bar - 1]; } private bool IsBearishDojiStar(int bar) { return bar > 0 && IsUptrend(bar - 1) && IsLongWhiteCandle(bar - 1) && IsStandardDoji(bar) && Open[bar] > Close[bar - 1]; } private bool IsInNeck(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Close[bar], Close[bar - 1], 0.002); } private bool IsOnNeck(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Close[bar], Low[bar - 1], 0.002); } private bool IsThrustingPattern(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && Close[bar] < (Open[bar - 1] + Close[bar - 1]) / 2 && Close[bar] > Close[bar - 1]; } private bool IsBullishSeparatingLines(int bar) { return bar > 0 && IsUptrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Open[bar], Open[bar - 1], 0.002); } private bool IsBearishSeparatingLines(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBullish(bar - 1) && IsBearish(bar) && IsApproximatelyEqual(Open[bar], Open[bar - 1], 0.002); } private bool IsBullishCounterAttack(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBullish(bar) && IsApproximatelyEqual(Close[bar], Close[bar - 1], 0.002); } private bool IsBearishCounterAttack(int bar) { return bar > 0 && IsUptrend(bar - 1) && IsBullish(bar - 1) && IsBearish(bar) && IsApproximatelyEqual(Close[bar], Close[bar - 1], 0.002); } private bool IsHomingPigeon(int bar) { return bar > 0 && IsDowntrend(bar - 1) && IsBearish(bar - 1) && IsBearish(bar) && Open[bar] < Open[bar - 1] && Close[bar] > Close[bar - 1]; } private bool IsInvertedHammerCombo(int bar) { return bar > 1 && IsInvertedHammer(bar - 1) && IsDowntrend(bar - 2) && IsHammer(bar) && IsDowntrend(bar - 1); } private bool IsHangingManCombo(int bar) { return bar > 1 && IsHammer(bar - 1) && IsUptrend(bar - 2) && IsInvertedHammer(bar) && IsUptrend(bar - 1); } private bool IsStickSandwich(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBearish(bar - 2) && IsBullish(bar - 1) && Close[bar - 1] > Close[bar - 2] && IsBearish(bar) && IsApproximatelyEqual(Close[bar - 2], Close[bar], 0.002); } private bool IsSideBySideWhiteLines(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 1) && IsBullish(bar) && Open[bar] > Close[bar - 1] && IsApproximatelyEqual(Open[bar - 1], Open[bar], 0.002) && IsApproximatelyEqual(Close[bar - 1], Close[bar], 0.002); } private bool IsSideBySideBlackLines(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsBearish(bar - 1) && IsBearish(bar) && Open[bar] < Close[bar - 1] && IsApproximatelyEqual(Open[bar - 1], Open[bar], 0.002) && IsApproximatelyEqual(Close[bar - 1], Close[bar], 0.002); } private bool IsUpsideTasukiGap(int bar) { return bar > 1 && IsBullish(bar - 1) && IsBullish(bar) && Open[bar] > Close[bar - 1] && IsBearish(bar) && Open[bar] > Open[bar - 1] && Open[bar] < Close[bar - 1] && Close[bar] < Open[bar - 1] && Close[bar] > Close[bar - 2]; } private bool IsDownsideTasukiGap(int bar) { return bar > 1 && IsBearish(bar - 1) && IsBearish(bar) && Open[bar] < Close[bar - 1] && IsBullish(bar) && Open[bar] < Open[bar - 1] && Open[bar] > Close[bar - 1] && Close[bar] > Open[bar - 1] && Close[bar] < Close[bar - 2]; } private bool IsHighWaveCombination(int bar) { return bar > 0 && IsHighWaveCandle(bar - 1) && IsHighWaveCandle(bar); } private bool IsIdenticalThreeCrows(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBearish(bar - 2) && IsBearish(bar - 1) && IsBearish(bar) && Open[bar - 1] > Open[bar - 2] && Open[bar - 1] < Close[bar - 2] && IsApproximatelyEqual(Open[bar - 1], Close[bar - 2], 0.002) && IsApproximatelyEqual(Open[bar], Close[bar - 1], 0.002); } private bool IsUpsideGapTwoCrows(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 2) && IsBearish(bar - 1) && Open[bar - 1] > Close[bar - 2] && IsBearish(bar) && Open[bar] > Open[bar - 1] && Close[bar] < Close[bar - 2] && Close[bar] > Open[bar - 2]; } private bool IsDownsideGapThreeMethodsPattern(int bar) { return bar > 3 && IsDowntrend(bar - 4) && IsBearish(bar - 3) && IsBearish(bar - 2) && High[bar - 2] < Low[bar - 3] && IsBullish(bar - 1) && Open[bar - 1] > High[bar - 2] && Close[bar - 1] < Close[bar - 3] && IsBearish(bar) && Open[bar] < Open[bar - 1] && Close[bar] < Close[bar - 2]; } private bool IsThreeIdenticalCrows(int bar) { return IsIdenticalThreeCrows(bar); } private bool IsTwoCrows(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 2) && IsBearish(bar - 1) && Open[bar - 1] > Close[bar - 2] && IsBearish(bar) && Open[bar] > Open[bar - 1] && Close[bar] < Close[bar - 2]; } private bool IsDumplingTop(int bar) { return bar > 3 && IsUptrend(bar - 4) && High[bar - 2] > High[bar - 3] && High[bar - 2] > High[bar - 1] && IsBearish(bar) && Open[bar] < Low[bar - 1]; } private bool IsFryingPanBottom(int bar) { return bar > 3 && IsDowntrend(bar - 4) && Low[bar - 2] < Low[bar - 3] && Low[bar - 2] < Low[bar - 1] && IsBullish(bar) && Open[bar] > High[bar - 1]; } private bool IsTowerTop(int bar) { return bar > 3 && IsUptrend(bar - 4) && IsLongWhiteCandle(bar - 1) && High[bar - 1] > High[bar - 2] && IsBearish(bar) && Close[bar] < Close[bar - 1]; } private bool IsTowerBottom(int bar) { return bar > 3 && IsDowntrend(bar - 4) && IsLongBlackCandle(bar - 1) && Low[bar - 1] < Low[bar - 2] && IsBullish(bar) && Close[bar] > Close[bar - 1]; } private bool IsBullishMarubozuCombo(int bar) { return bar > 0 && IsBullishMarubozu(bar - 1) && IsBullishMarubozu(bar); } private bool IsBearishMarubozuCombo(int bar) { return bar > 0 && IsBearishMarubozu(bar - 1) && IsBearishMarubozu(bar); } private bool IsLongShadowCombination(int bar) { return bar > 0 && ((IsLongUpperShadow(bar - 1) && IsLongUpperShadow(bar)) || (IsLongLowerShadow(bar - 1) && IsLongLowerShadow(bar))); } private bool IsStarPosition(int bar) { return bar > 0 && (Open[bar] > High[bar - 1] || Open[bar] < Low[bar - 1]) && GetBody(bar) <= GetRange(bar) * 0.3; } #endregion #region Three Candlestick Pattern Methods private bool IsMorningStar(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsLongBlackCandle(bar - 2) && GetBody(bar - 1) <= GetRange(bar - 1) * 0.3 && Open[bar - 1] < Close[bar - 2] && IsBullish(bar) && Close[bar] > (Open[bar - 2] + Close[bar - 2]) / 2; } private bool IsEveningStar(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsLongWhiteCandle(bar - 2) && GetBody(bar - 1) <= GetRange(bar - 1) * 0.3 && Open[bar - 1] > Close[bar - 2] && IsBearish(bar) && Close[bar] < (Open[bar - 2] + Close[bar - 2]) / 2; } private bool IsMorningDojiStar(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsLongBlackCandle(bar - 2) && IsStandardDoji(bar - 1) && Open[bar - 1] < Close[bar - 2] && IsBullish(bar) && Close[bar] > (Open[bar - 2] + Close[bar - 2]) / 2; } private bool IsEveningDojiStar(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsLongWhiteCandle(bar - 2) && IsStandardDoji(bar - 1) && Open[bar - 1] > Close[bar - 2] && IsBearish(bar) && Close[bar] < (Open[bar - 2] + Close[bar - 2]) / 2; } private bool IsThreeWhiteSoldiers(int bar) { return bar > 1 && IsBullish(bar - 2) && IsBullish(bar - 1) && IsBullish(bar) && Close[bar - 1] > Close[bar - 2] && Close[bar] > Close[bar - 1] && Open[bar - 1] > Open[bar - 2] && Open[bar] > Open[bar - 1] && Open[bar - 1] < Close[bar - 2] && Open[bar] < Close[bar - 1] && GetUpperWick(bar - 2) < GetBody(bar - 2) * 0.2 && GetUpperWick(bar - 1) < GetBody(bar - 1) * 0.2 && GetUpperWick(bar) < GetBody(bar) * 0.2; } private bool IsThreeBlackCrows(int bar) { return bar > 1 && IsBearish(bar - 2) && IsBearish(bar - 1) && IsBearish(bar) && Close[bar - 1] < Close[bar - 2] && Close[bar] < Close[bar - 1] && Open[bar - 1] < Open[bar - 2] && Open[bar] < Open[bar - 1] && Open[bar - 1] > Close[bar - 2] && Open[bar] > Close[bar - 1] && GetLowerWick(bar - 2) < GetBody(bar - 2) * 0.2 && GetLowerWick(bar - 1) < GetBody(bar - 1) * 0.2 && GetLowerWick(bar) < GetBody(bar) * 0.2; } private bool IsThreeInsideUp(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsBullishHarami(bar - 1) && IsBullish(bar) && Close[bar] > Close[bar - 2]; } private bool IsThreeInsideDown(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBearishHarami(bar - 1) && IsBearish(bar) && Close[bar] < Close[bar - 2]; } private bool IsThreeOutsideUp(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsBullishEngulfing(bar - 1) && IsBullish(bar) && Close[bar] > Close[bar - 1]; } private bool IsThreeOutsideDown(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBearishEngulfing(bar - 1) && IsBearish(bar) && Close[bar] < Close[bar - 1]; } private bool IsRisingThreeMethods(int bar) { return bar > 3 && IsUptrend(bar - 4) && IsLongWhiteCandle(bar - 4) && IsBearish(bar - 3) && IsBearish(bar - 2) && IsBearish(bar - 1) && High[bar - 3] < High[bar - 4] && Low[bar - 3] > Low[bar - 4] && High[bar - 2] < High[bar - 4] && Low[bar - 2] > Low[bar - 4] && High[bar - 1] < High[bar - 4] && Low[bar - 1] > Low[bar - 4] && IsBullish(bar) && Close[bar] > Close[bar - 4]; } private bool IsFallingThreeMethods(int bar) { return bar > 3 && IsDowntrend(bar - 4) && IsLongBlackCandle(bar - 4) && IsBullish(bar - 3) && IsBullish(bar - 2) && IsBullish(bar - 1) && High[bar - 3] < High[bar - 4] && Low[bar - 3] > Low[bar - 4] && High[bar - 2] < High[bar - 4] && Low[bar - 2] > Low[bar - 4] && High[bar - 1] < High[bar - 4] && Low[bar - 1] > Low[bar - 4] && IsBearish(bar) && Close[bar] < Close[bar - 4]; } private bool IsBullishAbandonedBaby(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsBearish(bar - 2) && IsStandardDoji(bar - 1) && High[bar - 1] < Low[bar - 2] && IsBullish(bar) && Low[bar] > High[bar - 1]; } private bool IsBearishAbandonedBaby(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 2) && IsStandardDoji(bar - 1) && Low[bar - 1] > High[bar - 2] && IsBearish(bar) && High[bar] < Low[bar - 1]; } private bool IsTriStarTop(int bar) { return bar > 1 && IsStandardDoji(bar - 2) && IsStandardDoji(bar - 1) && IsStandardDoji(bar) && High[bar - 1] > High[bar - 2] && High[bar - 1] > High[bar]; } private bool IsTriStarBottom(int bar) { return bar > 1 && IsStandardDoji(bar - 2) && IsStandardDoji(bar - 1) && IsStandardDoji(bar) && Low[bar - 1] < Low[bar - 2] && Low[bar - 1] < Low[bar]; } private bool IsThreeStarsInTheSouth(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsLongBlackCandle(bar - 2) && GetLowerWick(bar - 2) > GetBody(bar - 2) && IsBearish(bar - 1) && Low[bar - 1] > Low[bar - 2] && IsBearish(bar) && GetBody(bar) < GetRange(bar) * 0.3 && High[bar] < High[bar - 1] && Low[bar] > Low[bar - 1]; } private bool IsUpsideGapThreeMethods(int bar) { return IsRisingThreeMethods(bar); } private bool IsConcealingBabySwallow(int bar) { return bar > 2 && IsDowntrend(bar - 3) && IsBearishMarubozu(bar - 3) && IsBearishMarubozu(bar - 2) && IsBearish(bar - 1) && Open[bar - 1] > High[bar - 2] && Close[bar - 1] < Low[bar - 2] && IsBullish(bar) && Close[bar] > Open[bar - 1]; } private bool IsUniqueThreeRiverBottom(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsLongBlackCandle(bar - 2) && IsBearish(bar - 1) && IsHammer(bar - 1) && Low[bar - 1] == Low[bar - 2] && IsBullish(bar) && Close[bar] < Close[bar - 1]; } private bool IsBullishThreeLineStrike(int bar) { return bar > 2 && IsDowntrend(bar - 3) && IsBearish(bar - 3) && IsBearish(bar - 2) && IsBearish(bar - 1) && Close[bar - 2] < Close[bar - 3] && Close[bar - 1] < Close[bar - 2] && IsBullish(bar) && Open[bar] < Close[bar - 1] && Close[bar] > Open[bar - 3]; } private bool IsBearishThreeLineStrike(int bar) { return bar > 2 && IsUptrend(bar - 3) && IsBullish(bar - 3) && IsBullish(bar - 2) && IsBullish(bar - 1) && Close[bar - 2] > Close[bar - 3] && Close[bar - 1] > Close[bar - 2] && IsBearish(bar) && Open[bar] > Close[bar - 1] && Close[bar] < Open[bar - 3]; } private bool IsDeliberation(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsThreeWhiteSoldiers(bar); } private bool IsAdvanceBlock(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 2) && IsBullish(bar - 1) && IsBullish(bar) && GetBody(bar) < GetBody(bar - 1) && GetBody(bar - 1) < GetBody(bar - 2) && GetUpperWick(bar - 1) > GetBody(bar - 1) && GetUpperWick(bar) > GetBody(bar); } private bool IsStalledPattern(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 2) && IsBullish(bar - 1) && IsBullish(bar) && Open[bar] > Open[bar - 1] && Open[bar] < Close[bar - 1] && GetBody(bar) < GetBody(bar - 1); } private bool IsUpThreeMethod(int bar) { return IsRisingThreeMethods(bar); } private bool IsDownThreeMethod(int bar) { return IsFallingThreeMethods(bar); } private bool IsBullishBreakaway(int bar) { return bar > 3 && IsDowntrend(bar - 4) && IsLongBlackCandle(bar - 4) && IsBearish(bar - 3) && Open[bar - 3] < Close[bar - 4] && IsBearish(bar - 2) && IsBearish(bar - 1) && IsBullish(bar) && Close[bar] > Open[bar - 3] && Close[bar] < Close[bar - 4]; } private bool IsBearishBreakaway(int bar) { return bar > 3 && IsUptrend(bar - 4) && IsLongWhiteCandle(bar - 4) && IsBullish(bar - 3) && Open[bar - 3] > Close[bar - 4] && IsBullish(bar - 2) && IsBullish(bar - 1) && IsBearish(bar) && Close[bar] < Open[bar - 3] && Close[bar] > Close[bar - 4]; } private bool IsLadderBottom(int bar) { return bar > 3 && IsDowntrend(bar - 4) && IsBearish(bar - 4) && IsBearish(bar - 3) && IsBearish(bar - 2) && IsBearish(bar - 1) && IsBullish(bar) && IsInvertedHammer(bar) && Open[bar] > High[bar - 1]; } private bool IsLadderTop(int bar) { return bar > 3 && IsUptrend(bar - 4) && IsBullish(bar - 4) && IsBullish(bar - 3) && IsBullish(bar - 2) && IsBullish(bar - 1) && IsBearish(bar) && IsHammer(bar) && Open[bar] < Low[bar - 1]; } private bool IsThreeBuddhaTop(int bar) { // Head and Shoulders Top: Left Shoulder, Head, Right Shoulder return bar > 4 && High[bar - 4] < High[bar - 2] && Low[bar - 4] > Low[bar - 5] && // Left Shoulder High[bar - 2] > High[bar] && Low[bar - 2] > Low[bar - 3] && // Head is highest High[bar] < High[bar - 2] && Low[bar] > Low[bar - 1]; // Right Shoulder } private bool IsThreeBuddhaBottom(int bar) { // Inverse Head and Shoulders Bottom return bar > 4 && Low[bar - 4] > Low[bar - 2] && High[bar - 4] < High[bar - 5] && // Left Shoulder Low[bar - 2] < Low[bar] && High[bar - 2] < High[bar - 3] && // Head is lowest Low[bar] > Low[bar - 2] && High[bar] < High[bar - 1]; // Right Shoulder } private bool IsSideBySideWhiteLinesContinuation(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsBullish(bar - 2) && IsSideBySideWhiteLines(bar); } private bool IsGappingSideBySideBlackLines(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsBearish(bar - 2) && IsSideBySideBlackLines(bar); } private bool IsThreeAdvancingWhiteSoldiers(int bar) { return IsThreeWhiteSoldiers(bar); } private bool IsIdenticalThreeMountainTop(int bar) { // Triple Top return bar > 4 && IsUptrend(bar-5) && IsApproximatelyEqual(High[bar - 4], High[bar - 2], 0.005) && IsApproximatelyEqual(High[bar - 2], High[bar], 0.005) && High[bar - 3] < High[bar - 4] && High[bar-1] < High[bar-2] && IsBearish(bar); } private bool IsIdenticalThreeRiverBottom(int bar) { // Triple Bottom return bar > 4 && IsDowntrend(bar-5) && IsApproximatelyEqual(Low[bar - 4], Low[bar - 2], 0.005) && IsApproximatelyEqual(Low[bar - 2], Low[bar], 0.005) && Low[bar - 3] > Low[bar - 4] && Low[bar-1] > Low[bar-2] && IsBullish(bar); } private bool IsBullishBeltHoldTrio(int bar) { return bar > 1 && IsBullishBeltHold(bar - 2) && IsBullishBeltHold(bar - 1) && IsBullishBeltHold(bar); } private bool IsBearishBeltHoldTrio(int bar) { return bar > 1 && IsBearishBeltHold(bar - 2) && IsBearishBeltHold(bar - 1) && IsBearishBeltHold(bar); } #endregion #region Complex Multi-Candle Pattern Methods private bool IsRisingFiveMethods(int bar) { return bar > 5 && IsUptrend(bar - 6) && IsLongWhiteCandle(bar - 5) && IsBearish(bar - 4) && High[bar - 4] < High[bar-5] && Low[bar-4] > Low[bar-5] && IsBearish(bar - 3) && High[bar - 3] < High[bar-5] && Low[bar-3] > Low[bar-5] && IsBearish(bar - 2) && High[bar - 2] < High[bar-5] && Low[bar-2] > Low[bar-5] && IsBearish(bar - 1) && High[bar - 1] < High[bar-5] && Low[bar-1] > Low[bar-5] && IsBullish(bar) && Close[bar] > Close[bar - 5]; } private bool IsFallingFiveMethods(int bar) { return bar > 5 && IsDowntrend(bar - 6) && IsLongBlackCandle(bar - 5) && IsBullish(bar - 4) && High[bar - 4] < High[bar-5] && Low[bar-4] > Low[bar-5] && IsBullish(bar - 3) && High[bar - 3] < High[bar-5] && Low[bar-3] > Low[bar-5] && IsBullish(bar - 2) && High[bar - 2] < High[bar-5] && Low[bar-2] > Low[bar-5] && IsBullish(bar - 1) && High[bar - 1] < High[bar-5] && Low[bar-1] > Low[bar-5] && IsBearish(bar) && Close[bar] < Close[bar - 5]; } private bool IsRisingWindow(int bar) { return bar > 0 && Low[bar] > High[bar - 1]; } private bool IsFallingWindow(int bar) { return bar > 0 && High[bar] < Low[bar - 1]; } private bool IsMatHoldPattern(int bar) { return bar > 3 && IsUptrend(bar - 4) && IsLongWhiteCandle(bar - 4) && Open[bar - 3] > Close[bar - 4] && IsBearish(bar - 3) && IsBearish(bar - 2) && IsBearish(bar - 1) && High[bar - 1] < High[bar - 4] && Low[bar - 1] > Low[bar - 4] && IsBullish(bar) && Close[bar] > High[bar - 4]; } private bool IsGravestoneFormation(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsGravestoneDoji(bar - 2) && IsGravestoneDoji(bar - 1) && IsGravestoneDoji(bar); } private bool IsDragonflyFormation(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsDragonflyDoji(bar - 2) && IsDragonflyDoji(bar - 1) && IsDragonflyDoji(bar); } private bool IsShootingStarCluster(int bar) { return bar > 1 && IsUptrend(bar - 2) && IsInvertedHammer(bar - 2) && IsInvertedHammer(bar - 1) && IsInvertedHammer(bar); } private bool IsHammerCluster(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsHammer(bar - 2) && IsHammer(bar - 1) && IsHammer(bar); } private bool IsInvertedHammerSeries(int bar) { return bar > 1 && IsDowntrend(bar - 2) && IsInvertedHammer(bar - 2) && IsInvertedHammer(bar - 1) && IsInvertedHammer(bar); } private bool IsComplexHarami(int bar) { return bar > 3 && GetBody(bar - 4) > GetAverageTrueRange(bar) * 1.5 && High[bar] < High[bar - 4] && Low[bar] > Low[bar - 4]; } private bool IsUltimateBullishReversal(int bar) { return bar > 4 && (IsHammer(bar - 4) || IsBullishEngulfing(bar - 4)) && (IsMorningStar(bar - 2) || IsPiercingPattern(bar - 2)) && IsBullish(bar) && Close[bar] > High[bar - 5]; } private bool IsUltimateBearishReversal(int bar) { return bar > 4 && ((IsInvertedHammer(bar - 4) && IsUptrend(bar - 4)) || IsBearishEngulfing(bar - 4)) && (IsEveningStar(bar - 2) || IsDarkCloudCover(bar - 2)) && IsBearish(bar) && Close[bar] < Low[bar - 5]; } #endregion public override void SetDescription() { string shiftDescription; if (IndParam.ListParam[1].Text == "Shift in Bars") { shiftDescription = IndParam.NumParam[0].Value == 0 ? "on the previous bar" : string.Format("shifted by {0} bar(s)", IndParam.NumParam[0].ValueToString); } else // Shift in Recency { int bars = (int)IndParam.NumParam[0].Value + 1; shiftDescription = bars == 1 ? "on the previous bar" : string.Format("within the last {0} bars", bars); } string patternName = IndParam.ListParam[0].Text; string oppositePatternName = GetOppositePatternName(patternName); EntryFilterLongDescription = string.Format("a {0} pattern occurs {1}", patternName, shiftDescription); EntryFilterShortDescription = string.Format("a {0} pattern occurs {1}", oppositePatternName, shiftDescription); ExitFilterLongDescription = EntryFilterLongDescription; ExitFilterShortDescription = EntryFilterShortDescription; } private string GetOppositePatternName(string patternName) { switch (patternName) { // Patterns with direct opposites case "Bullish Marubozu": return "Bearish Marubozu"; case "Bearish Marubozu": return "Bullish Marubozu"; case "Opening White Marubozu": return "Opening Black Marubozu"; case "Opening Black Marubozu": return "Opening White Marubozu"; case "Closing White Marubozu": return "Closing Black Marubozu"; case "Closing Black Marubozu": return "Closing White Marubozu"; case "Dragonfly Doji": return "Gravestone Doji"; case "Gravestone Doji": return "Dragonfly Doji"; case "Hammer": return "Shooting Star"; case "Hanging Man": return "Inverted Hammer"; case "Inverted Hammer": return "Hanging Man"; case "Shooting Star": return "Hammer"; case "Bullish Spinning Top": return "Bearish Spinning Top"; case "Bearish Spinning Top": return "Bullish Spinning Top"; case "Bullish Belt Hold": return "Bearish Belt Hold"; case "Bearish Belt Hold": return "Bullish Belt Hold"; case "Takuri Line": return "Gravestone Doji"; case "Paper Umbrella": return "Inverted Paper Umbrella"; case "Inverted Paper Umbrella": return "Paper Umbrella"; case "Long White Candle": return "Long Black Candle"; case "Long Black Candle": return "Long White Candle"; case "Short White Candle": return "Short Black Candle"; case "Short Black Candle": return "Short White Candle"; case "Opening White Bozu": return "Opening Black Bozu"; case "Opening Black Bozu": return "Opening White Bozu"; case "Closing White Bozu": return "Closing Black Bozu"; case "Closing Black Bozu": return "Closing White Bozu"; case "High Close Doji": return "Low Close Doji"; case "Low Close Doji": return "High Close Doji"; case "Northern Doji": return "Southern Doji"; case "Southern Doji": return "Northern Doji"; case "Shaven Head White": return "Shaven Head Black"; case "Shaven Head Black": return "Shaven Head White"; case "Shaven Bottom White": return "Shaven Bottom Black"; case "Shaven Bottom Black": return "Shaven Bottom White"; case "White Spinning Top": return "Black Spinning Top"; case "Black Spinning Top": return "White Spinning Top"; case "Small White Body": return "Small Black Body"; case "Small Black Body": return "Small White Body"; case "Long Upper Shadow": return "Long Lower Shadow"; case "Long Lower Shadow": return "Long Upper Shadow"; case "Bullish Engulfing": return "Bearish Engulfing"; case "Bearish Engulfing": return "Bullish Engulfing"; case "Bullish Harami": return "Bearish Harami"; case "Bearish Harami": return "Bullish Harami"; case "Piercing Pattern": return "Dark Cloud Cover"; case "Dark Cloud Cover": return "Piercing Pattern"; case "Tweezer Bottom": return "Tweezer Top"; case "Tweezer Top": return "Tweezer Bottom"; case "Bullish Harami Cross": return "Bearish Harami Cross"; case "Bearish Harami Cross": return "Bullish HaramiCross"; case "Bullish Meeting Lines": return "Bearish Meeting Lines"; case "Bearish Meeting Lines": return "Bullish Meeting Lines"; case "Bullish Kicking": return "Bearish Kicking"; case "Bearish Kicking": return "Bullish Kicking"; case "Matching High": return "Matching Low"; case "Matching Low": return "Matching High"; case "Bullish Doji Star": return "Bearish Doji Star"; case "Bearish Doji Star": return "Bullish Doji Star"; case "In Neck": return "On Neck"; case "On Neck": return "In Neck"; case "Bullish Separating Lines": return "Bearish Separating Lines"; case "Bearish Separating Lines": return "Bullish Separating Lines"; case "Bullish Counter Attack": return "Bearish Counter Attack"; case "Bearish Counter Attack": return "Bullish Counter Attack"; case "Inverted Hammer Combo": return "Hanging Man Combo"; case "Hanging Man Combo": return "Inverted Hammer Combo"; case "Side by Side White Lines": return "Side by Side Black Lines"; case "Side by Side Black Lines": return "Side by Side White Lines"; case "Upside Tasuki Gap": return "Downside Tasuki Gap"; case "Downside Tasuki Gap": return "Upside Tasuki Gap"; case "Identical Three Crows": return "Three White Soldiers"; case "Downside Gap Three Methods": return "Rising Three Methods"; case "Three Identical Crows": return "Three White Soldiers"; case "Dumpling Top": return "Frying Pan Bottom"; case "Frying Pan Bottom": return "Dumpling Top"; case "Tower Top": return "Tower Bottom"; case "Tower Bottom": return "Tower Top"; case "Bullish Marubozu Combo": return "Bearish Marubozu Combo"; case "Bearish Marubozu Combo": return "Bullish Marubozu Combo"; case "Morning Star": return "Evening Star"; case "Evening Star": return "Morning Star"; case "Morning Doji Star": return "Evening Doji Star"; case "Evening Doji Star": return "Morning Doji Star"; case "Three White Soldiers": return "Three Black Crows"; case "Three Black Crows": return "Three White Soldiers"; case "Three Inside Up": return "Three Inside Down"; case "Three Inside Down": return "Three Inside Up"; case "Three Outside Up": return "Three Outside Down"; case "Three Outside Down": return "Three Outside Up"; case "Rising Three Methods": return "Falling Three Methods"; case "Falling Three Methods": return "Rising Three Methods"; case "Bullish Abandoned Baby": return "Bearish Abandoned Baby"; case "Bearish Abandoned Baby": return "Bullish Abandoned Baby"; case "Tri-Star Top": return "Tri-Star Bottom"; case "Tri-Star Bottom": return "Tri-Star Top"; case "Bullish Three-Line Strike": return "Bearish Three-Line Strike"; case "Bearish Three-Line Strike": return "Bullish Three-Line Strike"; case "Up Three Method": return "Down Three Method"; case "Down Three Method": return "Up Three Method"; case "Bullish Breakaway": return "Bearish Breakaway"; case "Bearish Breakaway": return "Bullish Breakaway"; case "Ladder Bottom": return "Ladder Top"; case "Ladder Top": return "Ladder Bottom"; case "Three Buddha Top": return "Three Buddha Bottom"; case "Three Buddha Bottom": return "Three Buddha Top"; case "Side-by-Side White Lines Continuation": return "Gapping Side-by-Side Black Lines"; case "Gapping Side-by-Side Black Lines": return "Side-by-Side White Lines Continuation"; case "Three Advancing White Soldiers": return "Three Black Crows"; case "Identical Three Mountain Top": return "Identical Three River Bottom"; case "Identical Three River Bottom": return "Identical Three Mountain Top"; case "Bullish Belt Hold Trio": return "Bearish Belt Hold Trio"; case "Bearish Belt Hold Trio": return "Bullish Belt Hold Trio"; case "Rising Five Methods": return "Falling Five Methods"; case "Falling Five Methods": return "Rising Five Methods"; case "Rising Window": return "Falling Window"; case "Falling Window": return "Rising Window"; case "Gravestone Formation": return "Dragonfly Formation"; case "Dragonfly Formation": return "Gravestone Formation"; case "Shooting Star Cluster": return "Hammer Cluster"; case "Hammer Cluster": return "Shooting Star Cluster"; case "Ultimate Bullish Reversal": return "Ultimate Bearish Reversal"; case "Ultimate Bearish Reversal": return "Ultimate Bullish Reversal"; // Patterns that are their own opposite case "Standard Doji": return "Standard Doji"; case "Long-Legged Doji": return "Long-Legged Doji"; case "High Wave Candle": return "High Wave Candle"; case "Doji Star": return "Doji Star"; case "Rickshaw Man": return "Rickshaw Man"; case "Neutral Candle": return "Neutral Candle"; case "Thrusting Pattern": return "Thrusting Pattern"; case "Homing Pigeon": return "Homing Pigeon"; case "Stick Sandwich": return "Stick Sandwich"; case "High Wave Combination": return "High Wave Combination"; case "Upside Gap Two Crows": return "Upside Gap Two Crows"; case "Two Crows": return "Two Crows"; case "Long Shadow Combination": return "Long Shadow Combination"; case "Star Position": return "Star Position"; case "Three Stars in the South": return "Three Stars in the South"; case "Upside Gap Three Methods": return "Upside Gap Three Methods"; case "Concealing Baby Swallow": return "Concealing Baby Swallow"; case "Unique Three River Bottom": return "Unique Three River Bottom"; case "Deliberation": return "Deliberation"; case "Advance Block": return "Advance Block"; case "Stalled Pattern": return "Stalled Pattern"; case "Mat Hold Pattern": return "Mat Hold Pattern"; case "Inverted Hammer Series": return "Inverted Hammer Series"; case "Complex Harami": return "Complex Harami"; case "Four Price Doji": return "Four Price Doji"; default: return patternName; // Default to self if not found } } public override string ToString() { return string.Format("{0} ({1}){2}", IndicatorName, IndParam.ListParam[0].Text, (IndParam.CheckParam[0].Checked ? "*" : "")); } } }
//+--------------------------------------------------------------------+ //| Copyright: (C) 2025 NAYA. | //| Website: http://forexsb.com/ | //| Support: http://forexsb.com/forum/ | //| License: Proprietary under the following circumstances: | //| | //| This code is a part of Forex Strategy Builder. It is free for | //| use as an integral part of Forex Strategy Builder. | //| One can modify it in order to improve the code or to fit it for | //| personal use. This code or any part of it cannot be used in | //| other applications without a permission. | //| The contact information cannot be changed. | //| | //| NO LIABILITY FOR CONSEQUENTIAL DAMAGES | //| | //| In no event shall the author be liable for any damages whatsoever | //| (including, without limitation, incidental, direct, indirect and | //| consequential damages, damages for loss of business profits, | //| business interruption, loss of business information, or other | //| pecuniary loss) arising out of the use or inability to use this | //| product, even if advised of the possibility of such damages. | //+--------------------------------------------------------------------+ #property copyright "NAYA 2025." #property link "NAYA +237674724684" #property version "4.3" // Updated version #property strict #include <Forexsb.com/Indicator.mqh> #include <Forexsb.com/Enumerations.mqh> //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CandlestickPatternsX : public Indicator { public: CandlestickPatternsX(SlotTypes slotType) { SlotType = slotType; IndicatorName = "Candlestick PatternsX"; WarningMessage = ""; IsAllowLTF = true; ExecTime = ExecutionTime_DuringTheBar; IsSeparateChart = false; IsDiscreteValues = false; IsDefaultGroupAll = false; } virtual void Calculate(DataSet &dataSet); private: // Helper methods double GetBody(int bar); double GetRange(int bar); double GetUpperWick(int bar); double GetLowerWick(int bar); bool IsBullish(int bar); bool IsBearish(int bar); bool IsUptrend(int bar, int lookback = 3); bool IsDowntrend(int bar, int lookback = 3); bool IsApproximatelyEqual(double value1, double value2, double tolerance = 0.001); double GetAverageTrueRange(int bar, int periods = 14); // Single candlestick patterns bool IsBullishMarubozu(int bar); bool IsBearishMarubozu(int bar); bool IsOpeningWhiteMarubozu(int bar); bool IsOpeningBlackMarubozu(int bar); bool IsClosingWhiteMarubozu(int bar); bool IsClosingBlackMarubozu(int bar); bool IsStandardDoji(int bar); bool IsLongLeggedDoji(int bar); bool IsDragonflyDoji(int bar); bool IsGravestoneDoji(int bar); bool IsFourPriceDoji(int bar); bool IsHammer(int bar); bool IsInvertedHammer(int bar); bool IsBullishSpinningTop(int bar); bool IsBearishSpinningTop(int bar); bool IsHighWaveCandle(int bar); bool IsBullishBeltHold(int bar); bool IsBearishBeltHold(int bar); bool IsTakuriLine(int bar); bool IsPaperUmbrella(int bar); bool IsInvertedPaperUmbrella(int bar); bool IsDojiStar(int bar); bool IsLongWhiteCandle(int bar); bool IsLongBlackCandle(int bar); bool IsShortWhiteCandle(int bar); bool IsShortBlackCandle(int bar); bool IsOpeningWhiteBozu(int bar); bool IsOpeningBlackBozu(int bar); bool IsClosingWhiteBozu(int bar); bool IsClosingBlackBozu(int bar); bool IsHighCloseDoji(int bar); bool IsLowCloseDoji(int bar); bool IsNorthernDoji(int bar); bool IsSouthernDoji(int bar); bool IsRickshawMan(int bar); bool IsShavenHeadWhite(int bar); bool IsShavenHeadBlack(int bar); bool IsShavenBottomWhite(int bar); bool IsShavenBottomBlack(int bar); bool IsWhiteSpinningTop(int bar); bool IsBlackSpinningTop(int bar); bool IsSmallWhiteBody(int bar); bool IsSmallBlackBody(int bar); bool IsLongUpperShadow(int bar); bool IsLongLowerShadow(int bar); bool IsNeutralCandle(int bar); // Two candlestick patterns bool IsBullishEngulfing(int bar); bool IsBearishEngulfing(int bar); bool IsBullishHarami(int bar); bool IsBearishHarami(int bar); bool IsPiercingPattern(int bar); bool IsDarkCloudCover(int bar); bool IsTweezerBottom(int bar); bool IsTweezerTop(int bar); bool IsBullishHaramiCross(int bar); bool IsBearishHaramiCross(int bar); bool IsBullishMeetingLines(int bar); bool IsBearishMeetingLines(int bar); bool IsBullishKicking(int bar); bool IsBearishKicking(int bar); bool IsMatchingHigh(int bar); bool IsMatchingLow(int bar); bool IsBullishDojiStar(int bar); bool IsBearishDojiStar(int bar); bool IsInNeck(int bar); bool IsOnNeck(int bar); bool IsThrustingPattern(int bar); bool IsBullishSeparatingLines(int bar); bool IsBearishSeparatingLines(int bar); bool IsBullishCounterAttack(int bar); bool IsBearishCounterAttack(int bar); bool IsHomingPigeon(int bar); bool IsInvertedHammerCombo(int bar); bool IsHangingManCombo(int bar); bool IsStickSandwich(int bar); bool IsSideBySideWhiteLines(int bar); bool IsSideBySideBlackLines(int bar); bool IsUpsideTasukiGap(int bar); bool IsDownsideTasukiGap(int bar); bool IsHighWaveCombination(int bar); bool IsIdenticalThreeCrows(int bar); bool IsUpsideGapTwoCrows(int bar); bool IsDownsideGapThreeMethodsPattern(int bar); bool IsThreeIdenticalCrows(int bar); bool IsTwoCrows(int bar); bool IsDumplingTop(int bar); bool IsFryingPanBottom(int bar); bool IsTowerTop(int bar); bool IsTowerBottom(int bar); bool IsBullishMarubozuCombo(int bar); bool IsBearishMarubozuCombo(int bar); bool IsLongShadowCombination(int bar); bool IsStarPosition(int bar); // Three candlestick patterns bool IsMorningStar(int bar); bool IsEveningStar(int bar); bool IsMorningDojiStar(int bar); bool IsEveningDojiStar(int bar); bool IsThreeWhiteSoldiers(int bar); bool IsThreeBlackCrows(int bar); bool IsThreeInsideUp(int bar); bool IsThreeInsideDown(int bar); bool IsThreeOutsideUp(int bar); bool IsThreeOutsideDown(int bar); bool IsRisingThreeMethods(int bar); bool IsFallingThreeMethods(int bar); bool IsBullishAbandonedBaby(int bar); bool IsBearishAbandonedBaby(int bar); bool IsTriStarTop(int bar); bool IsTriStarBottom(int bar); bool IsThreeStarsInTheSouth(int bar); bool IsUpsideGapThreeMethods(int bar); bool IsConcealingBabySwallow(int bar); bool IsUniqueThreeRiverBottom(int bar); bool IsBullishThreeLineStrike(int bar); bool IsBearishThreeLineStrike(int bar); bool IsDeliberation(int bar); bool IsAdvanceBlock(int bar); bool IsStalledPattern(int bar); bool IsUpThreeMethod(int bar); bool IsDownThreeMethod(int bar); bool IsBullishBreakaway(int bar); bool IsBearishBreakaway(int bar); bool IsLadderBottom(int bar); bool IsLadderTop(int bar); bool IsThreeBuddhaTop(int bar); bool IsThreeBuddhaBottom(int bar); bool IsSideBySideWhiteLinesContinuation(int bar); bool IsGappingSideBySideBlackLines(int bar); bool IsThreeAdvancingWhiteSoldiers(int bar); bool IsIdenticalThreeMountainTop(int bar); bool IsIdenticalThreeRiverBottom(int bar); bool IsBullishBeltHoldTrio(int bar); bool IsBearishBeltHoldTrio(int bar); // Complex multi-candle patterns bool IsRisingFiveMethods(int bar); bool IsFallingFiveMethods(int bar); bool IsRisingWindow(int bar); bool IsFallingWindow(int bar); bool IsMatHoldPattern(int bar); bool IsGravestoneFormation(int bar); bool IsDragonflyFormation(int bar); bool IsShootingStarCluster(int bar); bool IsHammerCluster(int bar); bool IsInvertedHammerSeries(int bar); bool IsComplexHarami(int bar); bool IsUltimateBullishReversal(int bar); bool IsUltimateBearishReversal(int bar); // Pattern detection methods bool DetectPattern(string patternName, int bar); bool DetectOppositePattern(string patternName, int bar); }; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void CandlestickPatternsX::Calculate(DataSet &dataSet) { Data = GetPointer(dataSet); // Reading the parameters string pattern = ListParam[0].Text; string shiftMethod = ListParam[1].Text; int shift = (int)NumParam[0].Value; int previous = CheckParam[0].Checked ? 1 : 0; // Initialize arrays double signal[]; ArrayResize(signal, Data.Bars); ArrayInitialize(signal, 0); double oppositeSignal[]; ArrayResize(oppositeSignal, Data.Bars); ArrayInitialize(oppositeSignal, 0); int firstBar = MathMax(10, shift + previous + 1); // Ensure we have enough bars for complex patterns for(int bar = firstBar; bar < Data.Bars; bar++) { bool patternFound = false; bool oppositePatternFound = false; int evalBar = bar - previous; if(shiftMethod == "Shift in Bars") { // Traditional shift - look at specific bar in the past int targetBar = evalBar - shift - 1; if(targetBar >= 0) { patternFound = DetectPattern(pattern, targetBar); oppositePatternFound = DetectOppositePattern(pattern, targetBar); } } else // Shift in Recency { // Check if pattern occurred within the last 'shift + 1' bars int startLookbackBar = evalBar - shift - 1; for(int i = evalBar - 1; i >= startLookbackBar && i >= 0; i--) { if(DetectPattern(pattern, i)) { patternFound = true; break; } } for(int i = evalBar - 1; i >= startLookbackBar && i >= 0; i--) { if(DetectOppositePattern(pattern, i)) { oppositePatternFound = true; break; } } } signal[bar] = patternFound ? 1 : 0; oppositeSignal[bar] = oppositePatternFound ? 1 : 0; } // Initialize components if(ArraySize(Component) < 3) ArrayResize(Component, 3); Component[0].CompName = "Pattern Signal"; Component[0].DataType = IndComponentType_IndicatorValue; Component[0].ShowInDynInfo = true; Component[0].FirstBar = firstBar; ArrayResize(Component[0].Value, Data.Bars); ArrayCopy(Component[0].Value, signal); if(SlotType == SlotTypes_OpenFilter) { Component[1].DataType = IndComponentType_AllowOpenLong; Component[1].CompName = "Is long entry allowed"; Component[2].DataType = IndComponentType_AllowOpenShort; Component[2].CompName = "Is short entry allowed"; } else if(SlotType == SlotTypes_CloseFilter) { Component[1].DataType = IndComponentType_ForceCloseLong; Component[1].CompName = "Close out long position"; Component[2].DataType = IndComponentType_ForceCloseShort; Component[2].CompName = "Close out short position"; } Component[1].FirstBar = firstBar; ArrayResize(Component[1].Value, Data.Bars); ArrayCopy(Component[1].Value, signal); Component[2].FirstBar = firstBar; ArrayResize(Component[2].Value, Data.Bars); ArrayCopy(Component[2].Value, oppositeSignal); } //+------------------------------------------------------------------+ //| Helper methods | //+------------------------------------------------------------------+ double CandlestickPatternsX::GetBody(int bar) { return MathAbs(Data.Close[bar] - Data.Open[bar]); } //+------------------------------------------------------------------+ double CandlestickPatternsX::GetRange(int bar) { return Data.High[bar] - Data.Low[bar]; } //+------------------------------------------------------------------+ double CandlestickPatternsX::GetUpperWick(int bar) { return Data.High[bar] - MathMax(Data.Open[bar], Data.Close[bar]); } //+------------------------------------------------------------------+ double CandlestickPatternsX::GetLowerWick(int bar) { return MathMin(Data.Open[bar], Data.Close[bar]) - Data.Low[bar]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullish(int bar) { return Data.Close[bar] > Data.Open[bar]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearish(int bar) { return Data.Close[bar] < Data.Open[bar]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUptrend(int bar, int lookback = 3) { if(bar < lookback) return false; for(int i = 0; i < lookback; i++) { if(Data.Close[bar - i] < Data.Close[bar - i - 1]) return false; } return true; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDowntrend(int bar, int lookback = 3) { if(bar < lookback) return false; for(int i = 0; i < lookback; i++) { if(Data.Close[bar - i] > Data.Close[bar - i - 1]) return false; } return true; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsApproximatelyEqual(double value1, double value2, double tolerance = 0.001) { return MathAbs(value1 - value2) <= tolerance * MathMax(MathAbs(value1), MathAbs(value2)); } //+------------------------------------------------------------------+ double CandlestickPatternsX::GetAverageTrueRange(int bar, int periods = 14) { if(bar < periods) return GetRange(bar); double sum = 0; for(int i = 0; i < periods; i++) sum += GetRange(bar - i); return sum / periods; } //+------------------------------------------------------------------+ //| Pattern detection methods | //+------------------------------------------------------------------+ bool CandlestickPatternsX::DetectPattern(string patternName, int bar) { if(bar < 9) return false; // Ensure enough bars for the most complex patterns if(patternName == "Bullish Marubozu") return IsBullishMarubozu(bar); if(patternName == "Bearish Marubozu") return IsBearishMarubozu(bar); if(patternName == "Opening White Marubozu") return IsOpeningWhiteMarubozu(bar); if(patternName == "Opening Black Marubozu") return IsOpeningBlackMarubozu(bar); if(patternName == "Closing White Marubozu") return IsClosingWhiteMarubozu(bar); if(patternName == "Closing Black Marubozu") return IsClosingBlackMarubozu(bar); if(patternName == "Standard Doji") return IsStandardDoji(bar); if(patternName == "Long-Legged Doji") return IsLongLeggedDoji(bar); if(patternName == "Dragonfly Doji") return IsDragonflyDoji(bar); if(patternName == "Gravestone Doji") return IsGravestoneDoji(bar); if(patternName == "Four Price Doji") return IsFourPriceDoji(bar); if(patternName == "Hammer") return IsHammer(bar) && IsDowntrend(bar); if(patternName == "Hanging Man") return IsHammer(bar) && IsUptrend(bar); if(patternName == "Inverted Hammer") return IsInvertedHammer(bar) && IsDowntrend(bar); if(patternName == "Shooting Star") return IsInvertedHammer(bar) && IsUptrend(bar); if(patternName == "Bullish Spinning Top") return IsBullishSpinningTop(bar); if(patternName == "Bearish Spinning Top") return IsBearishSpinningTop(bar); if(patternName == "High Wave Candle") return IsHighWaveCandle(bar); if(patternName == "Bullish Belt Hold") return IsBullishBeltHold(bar); if(patternName == "Bearish Belt Hold") return IsBearishBeltHold(bar); if(patternName == "Takuri Line") return IsTakuriLine(bar); if(patternName == "Paper Umbrella") return IsPaperUmbrella(bar); if(patternName == "Inverted Paper Umbrella") return IsInvertedPaperUmbrella(bar); if(patternName == "Doji Star") return IsDojiStar(bar); if(patternName == "Long White Candle") return IsLongWhiteCandle(bar); if(patternName == "Long Black Candle") return IsLongBlackCandle(bar); if(patternName == "Short White Candle") return IsShortWhiteCandle(bar); if(patternName == "Short Black Candle") return IsShortBlackCandle(bar); if(patternName == "Opening White Bozu") return IsOpeningWhiteBozu(bar); if(patternName == "Opening Black Bozu") return IsOpeningBlackBozu(bar); if(patternName == "Closing White Bozu") return IsClosingWhiteBozu(bar); if(patternName == "Closing Black Bozu") return IsClosingBlackBozu(bar); if(patternName == "High Close Doji") return IsHighCloseDoji(bar); if(patternName == "Low Close Doji") return IsLowCloseDoji(bar); if(patternName == "Northern Doji") return IsNorthernDoji(bar); if(patternName == "Southern Doji") return IsSouthernDoji(bar); if(patternName == "Rickshaw Man") return IsRickshawMan(bar); if(patternName == "Shaven Head White") return IsShavenHeadWhite(bar); if(patternName == "Shaven Head Black") return IsShavenHeadBlack(bar); if(patternName == "Shaven Bottom White") return IsShavenBottomWhite(bar); if(patternName == "Shaven Bottom Black") return IsShavenBottomBlack(bar); if(patternName == "White Spinning Top") return IsWhiteSpinningTop(bar); if(patternName == "Black Spinning Top") return IsBlackSpinningTop(bar); if(patternName == "Small White Body") return IsSmallWhiteBody(bar); if(patternName == "Small Black Body") return IsSmallBlackBody(bar); if(patternName == "Long Upper Shadow") return IsLongUpperShadow(bar); if(patternName == "Long Lower Shadow") return IsLongLowerShadow(bar); if(patternName == "Neutral Candle") return IsNeutralCandle(bar); if(patternName == "Bullish Engulfing") return IsBullishEngulfing(bar); if(patternName == "Bearish Engulfing") return IsBearishEngulfing(bar); if(patternName == "Bullish Harami") return IsBullishHarami(bar); if(patternName == "Bearish Harami") return IsBearishHarami(bar); if(patternName == "Piercing Pattern") return IsPiercingPattern(bar); if(patternName == "Dark Cloud Cover") return IsDarkCloudCover(bar); if(patternName == "Tweezer Bottom") return IsTweezerBottom(bar); if(patternName == "Tweezer Top") return IsTweezerTop(bar); if(patternName == "Bullish Harami Cross") return IsBullishHaramiCross(bar); if(patternName == "Bearish Harami Cross") return IsBearishHaramiCross(bar); if(patternName == "Bullish Meeting Lines") return IsBullishMeetingLines(bar); if(patternName == "Bearish Meeting Lines") return IsBearishMeetingLines(bar); if(patternName == "Bullish Kicking") return IsBullishKicking(bar); if(patternName == "Bearish Kicking") return IsBearishKicking(bar); if(patternName == "Matching High") return IsMatchingHigh(bar); if(patternName == "Matching Low") return IsMatchingLow(bar); if(patternName == "Bullish Doji Star") return IsBullishDojiStar(bar); if(patternName == "Bearish Doji Star") return IsBearishDojiStar(bar); if(patternName == "In Neck") return IsInNeck(bar); if(patternName == "On Neck") return IsOnNeck(bar); if(patternName == "Thrusting Pattern") return IsThrustingPattern(bar); if(patternName == "Bullish Separating Lines") return IsBullishSeparatingLines(bar); if(patternName == "Bearish Separating Lines") return IsBearishSeparatingLines(bar); if(patternName == "Bullish Counter Attack") return IsBullishCounterAttack(bar); if(patternName == "Bearish Counter Attack") return IsBearishCounterAttack(bar); if(patternName == "Homing Pigeon") return IsHomingPigeon(bar); if(patternName == "Inverted Hammer Combo") return IsInvertedHammerCombo(bar); if(patternName == "Hanging Man Combo") return IsHangingManCombo(bar); if(patternName == "Stick Sandwich") return IsStickSandwich(bar); if(patternName == "Side by Side White Lines") return IsSideBySideWhiteLines(bar); if(patternName == "Side by Side Black Lines") return IsSideBySideBlackLines(bar); if(patternName == "Upside Tasuki Gap") return IsUpsideTasukiGap(bar); if(patternName == "Downside Tasuki Gap") return IsDownsideTasukiGap(bar); if(patternName == "High Wave Combination") return IsHighWaveCombination(bar); if(patternName == "Identical Three Crows") return IsIdenticalThreeCrows(bar); if(patternName == "Upside Gap Two Crows") return IsUpsideGapTwoCrows(bar); if(patternName == "Downside Gap Three Methods") return IsDownsideGapThreeMethodsPattern(bar); if(patternName == "Three Identical Crows") return IsThreeIdenticalCrows(bar); if(patternName == "Two Crows") return IsTwoCrows(bar); if(patternName == "Dumpling Top") return IsDumplingTop(bar); if(patternName == "Frying Pan Bottom") return IsFryingPanBottom(bar); if(patternName == "Tower Top") return IsTowerTop(bar); if(patternName == "Tower Bottom") return IsTowerBottom(bar); if(patternName == "Bullish Marubozu Combo") return IsBullishMarubozuCombo(bar); if(patternName == "Bearish Marubozu Combo") return IsBearishMarubozuCombo(bar); if(patternName == "Long Shadow Combination") return IsLongShadowCombination(bar); if(patternName == "Star Position") return IsStarPosition(bar); if(patternName == "Morning Star") return IsMorningStar(bar); if(patternName == "Evening Star") return IsEveningStar(bar); if(patternName == "Morning Doji Star") return IsMorningDojiStar(bar); if(patternName == "Evening Doji Star") return IsEveningDojiStar(bar); if(patternName == "Three White Soldiers") return IsThreeWhiteSoldiers(bar); if(patternName == "Three Black Crows") return IsThreeBlackCrows(bar); if(patternName == "Three Inside Up") return IsThreeInsideUp(bar); if(patternName == "Three Inside Down") return IsThreeInsideDown(bar); if(patternName == "Three Outside Up") return IsThreeOutsideUp(bar); if(patternName == "Three Outside Down") return IsThreeOutsideDown(bar); if(patternName == "Rising Three Methods") return IsRisingThreeMethods(bar); if(patternName == "Falling Three Methods") return IsFallingThreeMethods(bar); if(patternName == "Bullish Abandoned Baby") return IsBullishAbandonedBaby(bar); if(patternName == "Bearish Abandoned Baby") return IsBearishAbandonedBaby(bar); if(patternName == "Tri-Star Top") return IsTriStarTop(bar); if(patternName == "Tri-Star Bottom") return IsTriStarBottom(bar); if(patternName == "Three Stars in the South") return IsThreeStarsInTheSouth(bar); if(patternName == "Upside Gap Three Methods") return IsUpsideGapThreeMethods(bar); if(patternName == "Concealing Baby Swallow") return IsConcealingBabySwallow(bar); if(patternName == "Unique Three River Bottom") return IsUniqueThreeRiverBottom(bar); if(patternName == "Bullish Three-Line Strike") return IsBullishThreeLineStrike(bar); if(patternName == "Bearish Three-Line Strike") return IsBearishThreeLineStrike(bar); if(patternName == "Deliberation") return IsDeliberation(bar); if(patternName == "Advance Block") return IsAdvanceBlock(bar); if(patternName == "Stalled Pattern") return IsStalledPattern(bar); if(patternName == "Up Three Method") return IsUpThreeMethod(bar); if(patternName == "Down Three Method") return IsDownThreeMethod(bar); if(patternName == "Bullish Breakaway") return IsBullishBreakaway(bar); if(patternName == "Bearish Breakaway") return IsBearishBreakaway(bar); if(patternName == "Ladder Bottom") return IsLadderBottom(bar); if(patternName == "Ladder Top") return IsLadderTop(bar); if(patternName == "Three Buddha Top") return IsThreeBuddhaTop(bar); if(patternName == "Three Buddha Bottom") return IsThreeBuddhaBottom(bar); if(patternName == "Side-by-Side White Lines Continuation") return IsSideBySideWhiteLinesContinuation(bar); if(patternName == "Gapping Side-by-Side Black Lines") return IsGappingSideBySideBlackLines(bar); if(patternName == "Three Advancing White Soldiers") return IsThreeAdvancingWhiteSoldiers(bar); if(patternName == "Identical Three Mountain Top") return IsIdenticalThreeMountainTop(bar); if(patternName == "Identical Three River Bottom") return IsIdenticalThreeRiverBottom(bar); if(patternName == "Bullish Belt Hold Trio") return IsBullishBeltHoldTrio(bar); if(patternName == "Bearish Belt Hold Trio") return IsBearishBeltHoldTrio(bar); if(patternName == "Rising Five Methods") return IsRisingFiveMethods(bar); if(patternName == "Falling Five Methods") return IsFallingFiveMethods(bar); if(patternName == "Rising Window") return IsRisingWindow(bar); if(patternName == "Falling Window") return IsFallingWindow(bar); if(patternName == "Mat Hold Pattern") return IsMatHoldPattern(bar); if(patternName == "Gravestone Formation") return IsGravestoneFormation(bar); if(patternName == "Dragonfly Formation") return IsDragonflyFormation(bar); if(patternName == "Shooting Star Cluster") return IsShootingStarCluster(bar); if(patternName == "Hammer Cluster") return IsHammerCluster(bar); if(patternName == "Inverted Hammer Series") return IsInvertedHammerSeries(bar); if(patternName == "Complex Harami") return IsComplexHarami(bar); if(patternName == "Ultimate Bullish Reversal") return IsUltimateBullishReversal(bar); if(patternName == "Ultimate Bearish Reversal") return IsUltimateBearishReversal(bar); return false; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::DetectOppositePattern(string patternName, int bar) { if(bar < 9) return false; // Patterns with direct opposites if(patternName == "Bullish Marubozu") return IsBearishMarubozu(bar); if(patternName == "Bearish Marubozu") return IsBullishMarubozu(bar); if(patternName == "Opening White Marubozu") return IsOpeningBlackMarubozu(bar); if(patternName == "Opening Black Marubozu") return IsOpeningWhiteMarubozu(bar); if(patternName == "Closing White Marubozu") return IsClosingBlackMarubozu(bar); if(patternName == "Closing Black Marubozu") return IsClosingWhiteMarubozu(bar); if(patternName == "Dragonfly Doji") return IsGravestoneDoji(bar); if(patternName == "Gravestone Doji") return IsDragonflyDoji(bar); if(patternName == "Hammer") return IsInvertedHammer(bar) && IsUptrend(bar); // Shooting Star if(patternName == "Hanging Man") return IsInvertedHammer(bar) && IsDowntrend(bar); // Inverted Hammer if(patternName == "Inverted Hammer") return IsHammer(bar) && IsUptrend(bar); // Hanging Man if(patternName == "Shooting Star") return IsHammer(bar) && IsDowntrend(bar); // Hammer if(patternName == "Bullish Spinning Top") return IsBearishSpinningTop(bar); if(patternName == "Bearish Spinning Top") return IsBullishSpinningTop(bar); if(patternName == "Bullish Belt Hold") return IsBearishBeltHold(bar); if(patternName == "Bearish Belt Hold") return IsBullishBeltHold(bar); if(patternName == "Takuri Line") return IsGravestoneDoji(bar); if(patternName == "Paper Umbrella") return IsInvertedPaperUmbrella(bar); if(patternName == "Inverted Paper Umbrella") return IsPaperUmbrella(bar); if(patternName == "Long White Candle") return IsLongBlackCandle(bar); if(patternName == "Long Black Candle") return IsLongWhiteCandle(bar); if(patternName == "Short White Candle") return IsShortBlackCandle(bar); if(patternName == "Short Black Candle") return IsShortWhiteCandle(bar); if(patternName == "Opening White Bozu") return IsOpeningBlackBozu(bar); if(patternName == "Opening Black Bozu") return IsOpeningWhiteBozu(bar); if(patternName == "Closing White Bozu") return IsClosingBlackBozu(bar); if(patternName == "Closing Black Bozu") return IsClosingWhiteBozu(bar); if(patternName == "High Close Doji") return IsLowCloseDoji(bar); if(patternName == "Low Close Doji") return IsHighCloseDoji(bar); if(patternName == "Northern Doji") return IsSouthernDoji(bar); if(patternName == "Southern Doji") return IsNorthernDoji(bar); if(patternName == "Shaven Head White") return IsShavenHeadBlack(bar); if(patternName == "Shaven Head Black") return IsShavenHeadWhite(bar); if(patternName == "Shaven Bottom White") return IsShavenBottomBlack(bar); if(patternName == "Shaven Bottom Black") return IsShavenBottomWhite(bar); if(patternName == "White Spinning Top") return IsBlackSpinningTop(bar); if(patternName == "Black Spinning Top") return IsWhiteSpinningTop(bar); if(patternName == "Small White Body") return IsSmallBlackBody(bar); if(patternName == "Small Black Body") return IsSmallWhiteBody(bar); if(patternName == "Long Upper Shadow") return IsLongLowerShadow(bar); if(patternName == "Long Lower Shadow") return IsLongUpperShadow(bar); if(patternName == "Bullish Engulfing") return IsBearishEngulfing(bar); if(patternName == "Bearish Engulfing") return IsBullishEngulfing(bar); if(patternName == "Bullish Harami") return IsBearishHarami(bar); if(patternName == "Bearish Harami") return IsBullishHarami(bar); if(patternName == "Piercing Pattern") return IsDarkCloudCover(bar); if(patternName == "Dark Cloud Cover") return IsPiercingPattern(bar); if(patternName == "Tweezer Bottom") return IsTweezerTop(bar); if(patternName == "Tweezer Top") return IsTweezerBottom(bar); if(patternName == "Bullish Harami Cross") return IsBearishHaramiCross(bar); if(patternName == "Bearish Harami Cross") return IsBullishHaramiCross(bar); if(patternName == "Bullish Meeting Lines") return IsBearishMeetingLines(bar); if(patternName == "Bearish Meeting Lines") return IsBullishMeetingLines(bar); if(patternName == "Bullish Kicking") return IsBearishKicking(bar); if(patternName == "Bearish Kicking") return IsBullishKicking(bar); if(patternName == "Matching High") return IsMatchingLow(bar); if(patternName == "Matching Low") return IsMatchingHigh(bar); if(patternName == "Bullish Doji Star") return IsBearishDojiStar(bar); if(patternName == "Bearish Doji Star") return IsBullishDojiStar(bar); if(patternName == "In Neck") return IsOnNeck(bar); if(patternName == "On Neck") return IsInNeck(bar); if(patternName == "Bullish Separating Lines") return IsBearishSeparatingLines(bar); if(patternName == "Bearish Separating Lines") return IsBullishSeparatingLines(bar); if(patternName == "Bullish Counter Attack") return IsBearishCounterAttack(bar); if(patternName == "Bearish Counter Attack") return IsBullishCounterAttack(bar); if(patternName == "Inverted Hammer Combo") return IsHangingManCombo(bar); if(patternName == "Hanging Man Combo") return IsInvertedHammerCombo(bar); if(patternName == "Side by Side White Lines") return IsSideBySideBlackLines(bar); if(patternName == "Side by Side Black Lines") return IsSideBySideWhiteLines(bar); if(patternName == "Upside Tasuki Gap") return IsDownsideTasukiGap(bar); if(patternName == "Downside Tasuki Gap") return IsUpsideTasukiGap(bar); if(patternName == "Identical Three Crows") return IsThreeWhiteSoldiers(bar); if(patternName == "Downside Gap Three Methods") return IsRisingThreeMethods(bar); if(patternName == "Three Identical Crows") return IsThreeWhiteSoldiers(bar); if(patternName == "Dumpling Top") return IsFryingPanBottom(bar); if(patternName == "Frying Pan Bottom") return IsDumplingTop(bar); if(patternName == "Tower Top") return IsTowerBottom(bar); if(patternName == "Tower Bottom") return IsTowerTop(bar); if(patternName == "Bullish Marubozu Combo") return IsBearishMarubozuCombo(bar); if(patternName == "Bearish Marubozu Combo") return IsBullishMarubozuCombo(bar); if(patternName == "Morning Star") return IsEveningStar(bar); if(patternName == "Evening Star") return IsMorningStar(bar); if(patternName == "Morning Doji Star") return IsEveningDojiStar(bar); if(patternName == "Evening Doji Star") return IsMorningDojiStar(bar); if(patternName == "Three White Soldiers") return IsThreeBlackCrows(bar); if(patternName == "Three Black Crows") return IsThreeWhiteSoldiers(bar); if(patternName == "Three Inside Up") return IsThreeInsideDown(bar); if(patternName == "Three Inside Down") return IsThreeInsideUp(bar); if(patternName == "Three Outside Up") return IsThreeOutsideDown(bar); if(patternName == "Three Outside Down") return IsThreeOutsideUp(bar); if(patternName == "Rising Three Methods") return IsFallingThreeMethods(bar); if(patternName == "Falling Three Methods") return IsRisingThreeMethods(bar); if(patternName == "Bullish Abandoned Baby") return IsBearishAbandonedBaby(bar); if(patternName == "Bearish Abandoned Baby") return IsBullishAbandonedBaby(bar); if(patternName == "Tri-Star Top") return IsTriStarBottom(bar); if(patternName == "Tri-Star Bottom") return IsTriStarTop(bar); if(patternName == "Bullish Three-Line Strike") return IsBearishThreeLineStrike(bar); if(patternName == "Bearish Three-Line Strike") return IsBullishThreeLineStrike(bar); if(patternName == "Up Three Method") return IsDownThreeMethod(bar); if(patternName == "Down Three Method") return IsUpThreeMethod(bar); if(patternName == "Bullish Breakaway") return IsBearishBreakaway(bar); if(patternName == "Bearish Breakaway") return IsBullishBreakaway(bar); if(patternName == "Ladder Bottom") return IsLadderTop(bar); if(patternName == "Ladder Top") return IsLadderBottom(bar); if(patternName == "Three Buddha Top") return IsThreeBuddhaBottom(bar); if(patternName == "Three Buddha Bottom") return IsThreeBuddhaTop(bar); if(patternName == "Side-by-Side White Lines Continuation") return IsGappingSideBySideBlackLines(bar); if(patternName == "Gapping Side-by-Side Black Lines") return IsSideBySideWhiteLinesContinuation(bar); if(patternName == "Three Advancing White Soldiers") return IsThreeBlackCrows(bar); if(patternName == "Identical Three Mountain Top") return IsIdenticalThreeRiverBottom(bar); if(patternName == "Identical Three River Bottom") return IsIdenticalThreeMountainTop(bar); if(patternName == "Bullish Belt Hold Trio") return IsBearishBeltHoldTrio(bar); if(patternName == "Bearish Belt Hold Trio") return IsBullishBeltHoldTrio(bar); if(patternName == "Rising Five Methods") return IsFallingFiveMethods(bar); if(patternName == "Falling Five Methods") return IsRisingFiveMethods(bar); if(patternName == "Rising Window") return IsFallingWindow(bar); if(patternName == "Falling Window") return IsRisingWindow(bar); if(patternName == "Gravestone Formation") return IsDragonflyFormation(bar); if(patternName == "Dragonfly Formation") return IsGravestoneFormation(bar); if(patternName == "Shooting Star Cluster") return IsHammerCluster(bar); if(patternName == "Hammer Cluster") return IsShootingStarCluster(bar); if(patternName == "Ultimate Bullish Reversal") return IsUltimateBearishReversal(bar); if(patternName == "Ultimate Bearish Reversal") return IsUltimateBullishReversal(bar); // Patterns that are their own opposite if(patternName == "Standard Doji") return IsStandardDoji(bar); if(patternName == "Long-Legged Doji") return IsLongLeggedDoji(bar); if(patternName == "High Wave Candle") return IsHighWaveCandle(bar); if(patternName == "Doji Star") return IsDojiStar(bar); if(patternName == "Rickshaw Man") return IsRickshawMan(bar); if(patternName == "Neutral Candle") return IsNeutralCandle(bar); if(patternName == "Thrusting Pattern") return IsThrustingPattern(bar); if(patternName == "Homing Pigeon") return IsHomingPigeon(bar); if(patternName == "Stick Sandwich") return IsStickSandwich(bar); if(patternName == "High Wave Combination") return IsHighWaveCombination(bar); if(patternName == "Upside Gap Two Crows") return IsUpsideGapTwoCrows(bar); if(patternName == "Two Crows") return IsTwoCrows(bar); if(patternName == "Long Shadow Combination") return IsLongShadowCombination(bar); if(patternName == "Star Position") return IsStarPosition(bar); if(patternName == "Three Stars in the South") return IsThreeStarsInTheSouth(bar); if(patternName == "Upside Gap Three Methods") return IsUpsideGapThreeMethods(bar); if(patternName == "Concealing Baby Swallow") return IsConcealingBabySwallow(bar); if(patternName == "Unique Three River Bottom") return IsUniqueThreeRiverBottom(bar); if(patternName == "Deliberation") return IsDeliberation(bar); if(patternName == "Advance Block") return IsAdvanceBlock(bar); if(patternName == "Stalled Pattern") return IsStalledPattern(bar); if(patternName == "Mat Hold Pattern") return IsMatHoldPattern(bar); if(patternName == "Inverted Hammer Series") return IsInvertedHammerSeries(bar); if(patternName == "Complex Harami") return IsComplexHarami(bar); if(patternName == "Four Price Doji") return IsFourPriceDoji(bar); return false; } //+------------------------------------------------------------------+ //| Single Candlestick Pattern Methods | //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishMarubozu(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Low[bar]) && IsApproximatelyEqual(Data.Close[bar], Data.High[bar]) && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishMarubozu(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && IsApproximatelyEqual(Data.Close[bar], Data.Low[bar]) && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsOpeningWhiteMarubozu(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Low[bar]) && GetUpperWick(bar) > 0 && GetLowerWick(bar) < GetRange(bar) * 0.1 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsOpeningBlackMarubozu(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && GetLowerWick(bar) > 0 && GetUpperWick(bar) < GetRange(bar) * 0.1 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsClosingWhiteMarubozu(int bar) { return IsApproximatelyEqual(Data.Close[bar], Data.High[bar]) && GetLowerWick(bar) > 0 && GetUpperWick(bar) < GetRange(bar) * 0.1 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsClosingBlackMarubozu(int bar) { return IsApproximatelyEqual(Data.Close[bar], Data.Low[bar]) && GetUpperWick(bar) > 0 && GetLowerWick(bar) < GetRange(bar) * 0.1 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsStandardDoji(int bar) { return GetBody(bar) <= GetRange(bar) * 0.1; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLongLeggedDoji(int bar) { return IsStandardDoji(bar) && GetRange(bar) > GetAverageTrueRange(bar) * 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDragonflyDoji(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Close[bar]) && IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && GetLowerWick(bar) >= GetRange(bar) * 0.6; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsGravestoneDoji(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Close[bar]) && IsApproximatelyEqual(Data.Open[bar], Data.Low[bar]) && GetUpperWick(bar) >= GetRange(bar) * 0.6; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsFourPriceDoji(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && IsApproximatelyEqual(Data.High[bar], Data.Low[bar]) && IsApproximatelyEqual(Data.Low[bar], Data.Close[bar]); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHammer(int bar) { return GetLowerWick(bar) >= GetBody(bar) * 2 && GetUpperWick(bar) <= GetBody(bar) * 0.5; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsInvertedHammer(int bar) { return GetUpperWick(bar) >= GetBody(bar) * 2 && GetLowerWick(bar) <= GetBody(bar) * 0.5; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishSpinningTop(int bar) { return GetBody(bar) < GetRange(bar) * 0.3 && IsBullish(bar) && GetUpperWick(bar) >= GetBody(bar) * 0.8 && GetLowerWick(bar) >= GetBody(bar) * 0.8; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishSpinningTop(int bar) { return GetBody(bar) < GetRange(bar) * 0.3 && IsBearish(bar) && GetUpperWick(bar) >= GetBody(bar) * 0.8 && GetLowerWick(bar) >= GetBody(bar) * 0.8; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHighWaveCandle(int bar) { return GetBody(bar) < GetRange(bar) * 0.2 && GetUpperWick(bar) >= GetRange(bar) * 0.4 && GetLowerWick(bar) >= GetRange(bar) * 0.4; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishBeltHold(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Low[bar]) && GetUpperWick(bar) < GetRange(bar) * 0.1 && IsBullish(bar) && GetBody(bar) > GetAverageTrueRange(bar) * 0.7; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishBeltHold(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && GetLowerWick(bar) < GetRange(bar) * 0.1 && IsBearish(bar) && GetBody(bar) > GetAverageTrueRange(bar) * 0.7; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTakuriLine(int bar) { return GetLowerWick(bar) >= GetRange(bar) * 0.67 && GetBody(bar) <= GetRange(bar) * 0.2 && GetUpperWick(bar) <= GetRange(bar) * 0.1; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsPaperUmbrella(int bar) { return IsHammer(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsInvertedPaperUmbrella(int bar) { return IsInvertedHammer(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDojiStar(int bar) { if(bar < 1) return false; return IsStandardDoji(bar) && (MathAbs(Data.Open[bar] - Data.Close[bar-1]) > GetAverageTrueRange(bar) * 0.1); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLongWhiteCandle(int bar) { return GetBody(bar) >= GetAverageTrueRange(bar) * 1.2 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLongBlackCandle(int bar) { return GetBody(bar) >= GetAverageTrueRange(bar) * 1.2 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShortWhiteCandle(int bar) { return GetBody(bar) <= GetAverageTrueRange(bar) * 0.5 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShortBlackCandle(int bar) { return GetBody(bar) <= GetAverageTrueRange(bar) * 0.5 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsOpeningWhiteBozu(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Low[bar]) && GetUpperWick(bar) > 0 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsOpeningBlackBozu(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && GetLowerWick(bar) > 0 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsClosingWhiteBozu(int bar) { return IsApproximatelyEqual(Data.Close[bar], Data.High[bar]) && GetLowerWick(bar) > 0 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsClosingBlackBozu(int bar) { return IsApproximatelyEqual(Data.Close[bar], Data.Low[bar]) && GetUpperWick(bar) > 0 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHighCloseDoji(int bar) { return IsStandardDoji(bar) && IsApproximatelyEqual(Data.Close[bar], Data.High[bar]) && GetLowerWick(bar) > GetRange(bar) * 0.3; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLowCloseDoji(int bar) { return IsStandardDoji(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Low[bar]) && GetUpperWick(bar) > GetRange(bar) * 0.3; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsNorthernDoji(int bar) { return IsStandardDoji(bar) && (Data.Close[bar] + Data.Open[bar]) / 2 > (Data.High[bar] + Data.Low[bar]) / 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsSouthernDoji(int bar) { return IsStandardDoji(bar) && (Data.Close[bar] + Data.Open[bar]) / 2 < (Data.High[bar] + Data.Low[bar]) / 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsRickshawMan(int bar) { return IsStandardDoji(bar) && IsApproximatelyEqual(GetUpperWick(bar), GetLowerWick(bar)); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShavenHeadWhite(int bar) { return IsApproximatelyEqual(Data.Close[bar], Data.High[bar]) && GetLowerWick(bar) > GetRange(bar) * 0.05 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShavenHeadBlack(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.High[bar]) && GetLowerWick(bar) > GetRange(bar) * 0.05 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShavenBottomWhite(int bar) { return IsApproximatelyEqual(Data.Open[bar], Data.Low[bar]) && GetUpperWick(bar) > GetRange(bar) * 0.05 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShavenBottomBlack(int bar) { return IsApproximatelyEqual(Data.Close[bar], Data.Low[bar]) && GetUpperWick(bar) > GetRange(bar) * 0.05 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsWhiteSpinningTop(int bar) { return IsBullishSpinningTop(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBlackSpinningTop(int bar) { return IsBearishSpinningTop(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsSmallWhiteBody(int bar) { return GetBody(bar) <= GetRange(bar) * 0.2 && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsSmallBlackBody(int bar) { return GetBody(bar) <= GetRange(bar) * 0.2 && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLongUpperShadow(int bar) { return GetUpperWick(bar) >= GetRange(bar) * 0.67; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLongLowerShadow(int bar) { return GetLowerWick(bar) >= GetRange(bar) * 0.67; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsNeutralCandle(int bar) { return GetBody(bar) <= GetRange(bar) * 0.2 && GetUpperWick(bar) >= GetRange(bar) * 0.3 && GetLowerWick(bar) >= GetRange(bar) * 0.3; } //+------------------------------------------------------------------+ //| Two Candlestick Pattern Methods | //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishEngulfing(int bar) { return bar > 0 && IsBearish(bar-1) && IsBullish(bar) && Data.Open[bar] < Data.Close[bar-1] && Data.Close[bar] > Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishEngulfing(int bar) { return bar > 0 && IsBullish(bar-1) && IsBearish(bar) && Data.Open[bar] > Data.Close[bar-1] && Data.Close[bar] < Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishHarami(int bar) { return bar > 0 && IsBearish(bar-1) && IsBullish(bar) && Data.Open[bar] > Data.Close[bar-1] && Data.Close[bar] < Data.Open[bar-1] && GetBody(bar) < GetBody(bar-1); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishHarami(int bar) { return bar > 0 && IsBullish(bar-1) && IsBearish(bar) && Data.Open[bar] < Data.Close[bar-1] && Data.Close[bar] > Data.Open[bar-1] && GetBody(bar) < GetBody(bar-1); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsPiercingPattern(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && Data.Open[bar] < Data.Low[bar-1] && Data.Close[bar] > (Data.Open[bar-1] + Data.Close[bar-1]) / 2 && Data.Close[bar] < Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDarkCloudCover(int bar) { return bar > 0 && IsUptrend(bar-1) && IsBullish(bar-1) && IsBearish(bar) && Data.Open[bar] > Data.High[bar-1] && Data.Close[bar] < (Data.Open[bar-1] + Data.Close[bar-1]) / 2 && Data.Close[bar] > Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTweezerBottom(int bar) { return bar > 0 && IsDowntrend(bar-1, 5) && IsBearish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Low[bar], Data.Low[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTweezerTop(int bar) { return bar > 0 && IsUptrend(bar-1, 5) && IsBullish(bar-1) && IsBearish(bar) && IsApproximatelyEqual(Data.High[bar], Data.High[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishHaramiCross(int bar) { return bar > 0 && IsBearish(bar-1) && IsStandardDoji(bar) && Data.High[bar] < Data.Open[bar-1] && Data.Low[bar] > Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishHaramiCross(int bar) { return bar > 0 && IsBullish(bar-1) && IsStandardDoji(bar) && Data.High[bar] < Data.Close[bar-1] && Data.Low[bar] > Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishMeetingLines(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Close[bar-1], Data.Close[bar], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishMeetingLines(int bar) { return bar > 0 && IsUptrend(bar-1) && IsBullish(bar-1) && IsBearish(bar) && IsApproximatelyEqual(Data.Close[bar-1], Data.Close[bar], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishKicking(int bar) { return bar > 0 && IsBearishMarubozu(bar-1) && IsBullishMarubozu(bar) && Data.Open[bar] > Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishKicking(int bar) { return bar > 0 && IsBullishMarubozu(bar-1) && IsBearishMarubozu(bar) && Data.Open[bar] < Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsMatchingHigh(int bar) { return bar > 0 && IsUptrend(bar-1) && IsBullish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Close[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsMatchingLow(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBearish(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Close[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishDojiStar(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsLongBlackCandle(bar-1) && IsStandardDoji(bar) && Data.Open[bar] < Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishDojiStar(int bar) { return bar > 0 && IsUptrend(bar-1) && IsLongWhiteCandle(bar-1) && IsStandardDoji(bar) && Data.Open[bar] > Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsInNeck(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Close[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsOnNeck(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Low[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThrustingPattern(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && Data.Close[bar] < (Data.Open[bar-1] + Data.Close[bar-1]) / 2 && Data.Close[bar] > Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishSeparatingLines(int bar) { return bar > 0 && IsUptrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Open[bar], Data.Open[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishSeparatingLines(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBullish(bar-1) && IsBearish(bar) && IsApproximatelyEqual(Data.Open[bar], Data.Open[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishCounterAttack(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBullish(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Close[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishCounterAttack(int bar) { return bar > 0 && IsUptrend(bar-1) && IsBullish(bar-1) && IsBearish(bar) && IsApproximatelyEqual(Data.Close[bar], Data.Close[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHomingPigeon(int bar) { return bar > 0 && IsDowntrend(bar-1) && IsBearish(bar-1) && IsBearish(bar) && Data.Open[bar] < Data.Open[bar-1] && Data.Close[bar] > Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsInvertedHammerCombo(int bar) { return bar > 1 && IsInvertedHammer(bar-1) && IsDowntrend(bar-2) && IsHammer(bar) && IsDowntrend(bar-1); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHangingManCombo(int bar) { return bar > 1 && IsHammer(bar-1) && IsUptrend(bar-2) && IsInvertedHammer(bar) && IsUptrend(bar-1); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsStickSandwich(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBearish(bar-2) && IsBullish(bar-1) && Data.Close[bar-1] > Data.Close[bar-2] && IsBearish(bar) && IsApproximatelyEqual(Data.Close[bar-2], Data.Close[bar], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsSideBySideWhiteLines(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-1) && IsBullish(bar) && Data.Open[bar] > Data.Close[bar-1] && IsApproximatelyEqual(Data.Open[bar-1], Data.Open[bar], 0.002) && IsApproximatelyEqual(Data.Close[bar-1], Data.Close[bar], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsSideBySideBlackLines(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsBearish(bar-1) && IsBearish(bar) && Data.Open[bar] < Data.Close[bar-1] && IsApproximatelyEqual(Data.Open[bar-1], Data.Open[bar], 0.002) && IsApproximatelyEqual(Data.Close[bar-1], Data.Close[bar], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUpsideTasukiGap(int bar) { return bar > 1 && IsBullish(bar-1) && IsBullish(bar) && Data.Open[bar] > Data.Close[bar-1] && IsBearish(bar) && Data.Open[bar] > Data.Open[bar-1] && Data.Open[bar] < Data.Close[bar-1] && Data.Close[bar] < Data.Open[bar-1] && Data.Close[bar] > Data.Close[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDownsideTasukiGap(int bar) { return bar > 1 && IsBearish(bar-1) && IsBearish(bar) && Data.Open[bar] < Data.Close[bar-1] && IsBullish(bar) && Data.Open[bar] < Data.Open[bar-1] && Data.Open[bar] > Data.Close[bar-1] && Data.Close[bar] > Data.Open[bar-1] && Data.Close[bar] < Data.Close[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHighWaveCombination(int bar) { return bar > 0 && IsHighWaveCandle(bar-1) && IsHighWaveCandle(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsIdenticalThreeCrows(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBearish(bar-2) && IsBearish(bar-1) && IsBearish(bar) && Data.Open[bar-1] > Data.Open[bar-2] && Data.Open[bar-1] < Data.Close[bar-2] && IsApproximatelyEqual(Data.Open[bar-1], Data.Close[bar-2], 0.002) && IsApproximatelyEqual(Data.Open[bar], Data.Close[bar-1], 0.002); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUpsideGapTwoCrows(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-2) && IsBearish(bar-1) && Data.Open[bar-1] > Data.Close[bar-2] && IsBearish(bar) && Data.Open[bar] > Data.Open[bar-1] && Data.Close[bar] < Data.Close[bar-2] && Data.Close[bar] > Data.Open[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDownsideGapThreeMethodsPattern(int bar) { return bar > 3 && IsDowntrend(bar-4) && IsBearish(bar-3) && IsBearish(bar-2) && Data.High[bar-2] < Data.Low[bar-3] && IsBullish(bar-1) && Data.Open[bar-1] > Data.High[bar-2] && Data.Close[bar-1] < Data.Close[bar-3] && IsBearish(bar) && Data.Open[bar] < Data.Open[bar-1] && Data.Close[bar] < Data.Close[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeIdenticalCrows(int bar) { return IsIdenticalThreeCrows(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTwoCrows(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-2) && IsBearish(bar-1) && Data.Open[bar-1] > Data.Close[bar-2] && IsBearish(bar) && Data.Open[bar] > Data.Open[bar-1] && Data.Close[bar] < Data.Close[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDumplingTop(int bar) { return bar > 3 && IsUptrend(bar-4) && Data.High[bar-2] > Data.High[bar-3] && Data.High[bar-2] > Data.High[bar-1] && IsBearish(bar) && Data.Open[bar] < Data.Low[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsFryingPanBottom(int bar) { return bar > 3 && IsDowntrend(bar-4) && Data.Low[bar-2] < Data.Low[bar-3] && Data.Low[bar-2] < Data.Low[bar-1] && IsBullish(bar) && Data.Open[bar] > Data.High[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTowerTop(int bar) { return bar > 3 && IsUptrend(bar-4) && IsLongWhiteCandle(bar-1) && Data.High[bar-1] > Data.High[bar-2] && IsBearish(bar) && Data.Close[bar] < Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTowerBottom(int bar) { return bar > 3 && IsDowntrend(bar-4) && IsLongBlackCandle(bar-1) && Data.Low[bar-1] < Data.Low[bar-2] && IsBullish(bar) && Data.Close[bar] > Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishMarubozuCombo(int bar) { return bar > 0 && IsBullishMarubozu(bar-1) && IsBullishMarubozu(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishMarubozuCombo(int bar) { return bar > 0 && IsBearishMarubozu(bar-1) && IsBearishMarubozu(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLongShadowCombination(int bar) { return bar > 0 && ((IsLongUpperShadow(bar-1) && IsLongUpperShadow(bar)) || (IsLongLowerShadow(bar-1) && IsLongLowerShadow(bar))); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsStarPosition(int bar) { return bar > 0 && (Data.Open[bar] > Data.High[bar-1] || Data.Open[bar] < Data.Low[bar-1]) && GetBody(bar) <= GetRange(bar) * 0.3; } //+------------------------------------------------------------------+ //| Three Candlestick Pattern Methods | //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsMorningStar(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsLongBlackCandle(bar-2) && GetBody(bar-1) <= GetRange(bar-1) * 0.3 && Data.Open[bar-1] < Data.Close[bar-2] && IsBullish(bar) && Data.Close[bar] > (Data.Open[bar-2] + Data.Close[bar-2]) / 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsEveningStar(int bar) { return bar > 1 && IsUptrend(bar-2) && IsLongWhiteCandle(bar-2) && GetBody(bar-1) <= GetRange(bar-1) * 0.3 && Data.Open[bar-1] > Data.Close[bar-2] && IsBearish(bar) && Data.Close[bar] < (Data.Open[bar-2] + Data.Close[bar-2]) / 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsMorningDojiStar(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsLongBlackCandle(bar-2) && IsStandardDoji(bar-1) && Data.Open[bar-1] < Data.Close[bar-2] && IsBullish(bar) && Data.Close[bar] > (Data.Open[bar-2] + Data.Close[bar-2]) / 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsEveningDojiStar(int bar) { return bar > 1 && IsUptrend(bar-2) && IsLongWhiteCandle(bar-2) && IsStandardDoji(bar-1) && Data.Open[bar-1] > Data.Close[bar-2] && IsBearish(bar) && Data.Close[bar] < (Data.Open[bar-2] + Data.Close[bar-2]) / 2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeWhiteSoldiers(int bar) { return bar > 1 && IsBullish(bar-2) && IsBullish(bar-1) && IsBullish(bar) && Data.Close[bar-1] > Data.Close[bar-2] && Data.Close[bar] > Data.Close[bar-1] && Data.Open[bar-1] > Data.Open[bar-2] && Data.Open[bar] > Data.Open[bar-1] && Data.Open[bar-1] < Data.Close[bar-2] && Data.Open[bar] < Data.Close[bar-1] && GetUpperWick(bar-2) < GetBody(bar-2) * 0.2 && GetUpperWick(bar-1) < GetBody(bar-1) * 0.2 && GetUpperWick(bar) < GetBody(bar) * 0.2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeBlackCrows(int bar) { return bar > 1 && IsBearish(bar-2) && IsBearish(bar-1) && IsBearish(bar) && Data.Close[bar-1] < Data.Close[bar-2] && Data.Close[bar] < Data.Close[bar-1] && Data.Open[bar-1] < Data.Open[bar-2] && Data.Open[bar] < Data.Open[bar-1] && Data.Open[bar-1] > Data.Close[bar-2] && Data.Open[bar] > Data.Close[bar-1] && GetLowerWick(bar-2) < GetBody(bar-2) * 0.2 && GetLowerWick(bar-1) < GetBody(bar-1) * 0.2 && GetLowerWick(bar) < GetBody(bar) * 0.2; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeInsideUp(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsBullishHarami(bar-1) && IsBullish(bar) && Data.Close[bar] > Data.Close[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeInsideDown(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBearishHarami(bar-1) && IsBearish(bar) && Data.Close[bar] < Data.Close[bar-2]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeOutsideUp(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsBullishEngulfing(bar-1) && IsBullish(bar) && Data.Close[bar] > Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeOutsideDown(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBearishEngulfing(bar-1) && IsBearish(bar) && Data.Close[bar] < Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsRisingThreeMethods(int bar) { return bar > 3 && IsUptrend(bar-4) && IsLongWhiteCandle(bar-4) && IsBearish(bar-3) && IsBearish(bar-2) && IsBearish(bar-1) && Data.High[bar-3] < Data.High[bar-4] && Data.Low[bar-3] > Data.Low[bar-4] && Data.High[bar-2] < Data.High[bar-4] && Data.Low[bar-2] > Data.Low[bar-4] && Data.High[bar-1] < Data.High[bar-4] && Data.Low[bar-1] > Data.Low[bar-4] && IsBullish(bar) && Data.Close[bar] > Data.Close[bar-4]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsFallingThreeMethods(int bar) { return bar > 3 && IsDowntrend(bar-4) && IsLongBlackCandle(bar-4) && IsBullish(bar-3) && IsBullish(bar-2) && IsBullish(bar-1) && Data.High[bar-3] < Data.High[bar-4] && Data.Low[bar-3] > Data.Low[bar-4] && Data.High[bar-2] < Data.High[bar-4] && Data.Low[bar-2] > Data.Low[bar-4] && Data.High[bar-1] < Data.High[bar-4] && Data.Low[bar-1] > Data.Low[bar-4] && IsBearish(bar) && Data.Close[bar] < Data.Close[bar-4]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishAbandonedBaby(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsBearish(bar-2) && IsStandardDoji(bar-1) && Data.High[bar-1] < Data.Low[bar-2] && IsBullish(bar) && Data.Low[bar] > Data.High[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishAbandonedBaby(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-2) && IsStandardDoji(bar-1) && Data.Low[bar-1] > Data.High[bar-2] && IsBearish(bar) && Data.High[bar] < Data.Low[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTriStarTop(int bar) { return bar > 1 && IsStandardDoji(bar-2) && IsStandardDoji(bar-1) && IsStandardDoji(bar) && Data.High[bar-1] > Data.High[bar-2] && Data.High[bar-1] > Data.High[bar]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsTriStarBottom(int bar) { return bar > 1 && IsStandardDoji(bar-2) && IsStandardDoji(bar-1) && IsStandardDoji(bar) && Data.Low[bar-1] < Data.Low[bar-2] && Data.Low[bar-1] < Data.Low[bar]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeStarsInTheSouth(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsLongBlackCandle(bar-2) && GetLowerWick(bar-2) > GetBody(bar-2) && IsBearish(bar-1) && Data.Low[bar-1] > Data.Low[bar-2] && IsBearish(bar) && GetBody(bar) < GetRange(bar) * 0.3 && Data.High[bar] < Data.High[bar-1] && Data.Low[bar] > Data.Low[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUpsideGapThreeMethods(int bar) { return IsRisingThreeMethods(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsConcealingBabySwallow(int bar) { return bar > 2 && IsDowntrend(bar-3) && IsBearishMarubozu(bar-3) && IsBearishMarubozu(bar-2) && IsBearish(bar-1) && Data.Open[bar-1] > Data.High[bar-2] && Data.Close[bar-1] < Data.Low[bar-2] && IsBullish(bar) && Data.Close[bar] > Data.Open[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUniqueThreeRiverBottom(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsLongBlackCandle(bar-2) && IsBearish(bar-1) && IsHammer(bar-1) && Data.Low[bar-1] == Data.Low[bar-2] && IsBullish(bar) && Data.Close[bar] < Data.Close[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishThreeLineStrike(int bar) { return bar > 2 && IsDowntrend(bar-3) && IsBearish(bar-3) && IsBearish(bar-2) && IsBearish(bar-1) && Data.Close[bar-2] < Data.Close[bar-3] && Data.Close[bar-1] < Data.Close[bar-2] && IsBullish(bar) && Data.Open[bar] < Data.Close[bar-1] && Data.Close[bar] > Data.Open[bar-3]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishThreeLineStrike(int bar) { return bar > 2 && IsUptrend(bar-3) && IsBullish(bar-3) && IsBullish(bar-2) && IsBullish(bar-1) && Data.Close[bar-2] > Data.Close[bar-3] && Data.Close[bar-1] > Data.Close[bar-2] && IsBearish(bar) && Data.Open[bar] > Data.Close[bar-1] && Data.Close[bar] < Data.Open[bar-3]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDeliberation(int bar) { return bar > 1 && IsUptrend(bar-2) && IsThreeWhiteSoldiers(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsAdvanceBlock(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-2) && IsBullish(bar-1) && IsBullish(bar) && GetBody(bar) < GetBody(bar-1) && GetBody(bar-1) < GetBody(bar-2) && GetUpperWick(bar-1) > GetBody(bar-1) && GetUpperWick(bar) > GetBody(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsStalledPattern(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-2) && IsBullish(bar-1) && IsBullish(bar) && Data.Open[bar] > Data.Open[bar-1] && Data.Open[bar] < Data.Close[bar-1] && GetBody(bar) < GetBody(bar-1); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUpThreeMethod(int bar) { return IsRisingThreeMethods(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDownThreeMethod(int bar) { return IsFallingThreeMethods(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishBreakaway(int bar) { return bar > 3 && IsDowntrend(bar-4) && IsLongBlackCandle(bar-4) && IsBearish(bar-3) && Data.Open[bar-3] < Data.Close[bar-4] && IsBearish(bar-2) && IsBearish(bar-1) && IsBullish(bar) && Data.Close[bar] > Data.Open[bar-3] && Data.Close[bar] < Data.Close[bar-4]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishBreakaway(int bar) { return bar > 3 && IsUptrend(bar-4) && IsLongWhiteCandle(bar-4) && IsBullish(bar-3) && Data.Open[bar-3] > Data.Close[bar-4] && IsBullish(bar-2) && IsBullish(bar-1) && IsBearish(bar) && Data.Close[bar] < Data.Open[bar-3] && Data.Close[bar] > Data.Close[bar-4]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLadderBottom(int bar) { return bar > 3 && IsDowntrend(bar-4) && IsBearish(bar-4) && IsBearish(bar-3) && IsBearish(bar-2) && IsBearish(bar-1) && IsBullish(bar) && IsInvertedHammer(bar) && Data.Open[bar] > Data.High[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsLadderTop(int bar) { return bar > 3 && IsUptrend(bar-4) && IsBullish(bar-4) && IsBullish(bar-3) && IsBullish(bar-2) && IsBullish(bar-1) && IsBearish(bar) && IsHammer(bar) && Data.Open[bar] < Data.Low[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeBuddhaTop(int bar) { // Head and Shoulders Top: Left Shoulder, Head, Right Shoulder return bar > 4 && Data.High[bar-4] < Data.High[bar-2] && Data.Low[bar-4] > Data.Low[bar-5] && // Left Shoulder Data.High[bar-2] > Data.High[bar] && Data.Low[bar-2] > Data.Low[bar-3] && // Head is highest Data.High[bar] < Data.High[bar-2] && Data.Low[bar] > Data.Low[bar-1]; // Right Shoulder } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeBuddhaBottom(int bar) { // Inverse Head and Shoulders Bottom return bar > 4 && Data.Low[bar-4] > Data.Low[bar-2] && Data.High[bar-4] < Data.High[bar-5] && // Left Shoulder Data.Low[bar-2] < Data.Low[bar] && Data.High[bar-2] < Data.High[bar-3] && // Head is lowest Data.Low[bar] > Data.Low[bar-2] && Data.High[bar] < Data.High[bar-1]; // Right Shoulder } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsSideBySideWhiteLinesContinuation(int bar) { return bar > 1 && IsUptrend(bar-2) && IsBullish(bar-2) && IsSideBySideWhiteLines(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsGappingSideBySideBlackLines(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsBearish(bar-2) && IsSideBySideBlackLines(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsThreeAdvancingWhiteSoldiers(int bar) { return IsThreeWhiteSoldiers(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsIdenticalThreeMountainTop(int bar) { // Triple Top return bar > 4 && IsUptrend(bar-5) && IsApproximatelyEqual(Data.High[bar-4], Data.High[bar-2], 0.005) && IsApproximatelyEqual(Data.High[bar-2], Data.High[bar], 0.005) && Data.High[bar-3] < Data.High[bar-4] && Data.High[bar-1] < Data.High[bar-2] && IsBearish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsIdenticalThreeRiverBottom(int bar) { // Triple Bottom return bar > 4 && IsDowntrend(bar-5) && IsApproximatelyEqual(Data.Low[bar-4], Data.Low[bar-2], 0.005) && IsApproximatelyEqual(Data.Low[bar-2], Data.Low[bar], 0.005) && Data.Low[bar-3] > Data.Low[bar-4] && Data.Low[bar-1] > Data.Low[bar-2] && IsBullish(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBullishBeltHoldTrio(int bar) { return bar > 1 && IsBullishBeltHold(bar-2) && IsBullishBeltHold(bar-1) && IsBullishBeltHold(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsBearishBeltHoldTrio(int bar) { return bar > 1 && IsBearishBeltHold(bar-2) && IsBearishBeltHold(bar-1) && IsBearishBeltHold(bar); } //+------------------------------------------------------------------+ //| Complex Multi-Candle Pattern Methods | //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsRisingFiveMethods(int bar) { return bar > 5 && IsUptrend(bar-6) && IsLongWhiteCandle(bar-5) && IsBearish(bar-4) && Data.High[bar-4] < Data.High[bar-5] && Data.Low[bar-4] > Data.Low[bar-5] && IsBearish(bar-3) && Data.High[bar-3] < Data.High[bar-5] && Data.Low[bar-3] > Data.Low[bar-5] && IsBearish(bar-2) && Data.High[bar-2] < Data.High[bar-5] && Data.Low[bar-2] > Data.Low[bar-5] && IsBearish(bar-1) && Data.High[bar-1] < Data.High[bar-5] && Data.Low[bar-1] > Data.Low[bar-5] && IsBullish(bar) && Data.Close[bar] > Data.Close[bar-5]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsFallingFiveMethods(int bar) { return bar > 5 && IsDowntrend(bar-6) && IsLongBlackCandle(bar-5) && IsBullish(bar-4) && Data.High[bar-4] < Data.High[bar-5] && Data.Low[bar-4] > Data.Low[bar-5] && IsBullish(bar-3) && Data.High[bar-3] < Data.High[bar-5] && Data.Low[bar-3] > Data.Low[bar-5] && IsBullish(bar-2) && Data.High[bar-2] < Data.High[bar-5] && Data.Low[bar-2] > Data.Low[bar-5] && IsBullish(bar-1) && Data.High[bar-1] < Data.High[bar-5] && Data.Low[bar-1] > Data.Low[bar-5] && IsBearish(bar) && Data.Close[bar] < Data.Close[bar-5]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsRisingWindow(int bar) { return bar > 0 && Data.Low[bar] > Data.High[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsFallingWindow(int bar) { return bar > 0 && Data.High[bar] < Data.Low[bar-1]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsMatHoldPattern(int bar) { return bar > 3 && IsUptrend(bar-4) && IsLongWhiteCandle(bar-4) && Data.Open[bar-3] > Data.Close[bar-4] && IsBearish(bar-3) && IsBearish(bar-2) && IsBearish(bar-1) && Data.High[bar-1] < Data.High[bar-4] && Data.Low[bar-1] > Data.Low[bar-4] && IsBullish(bar) && Data.Close[bar] > Data.High[bar-4]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsGravestoneFormation(int bar) { return bar > 1 && IsUptrend(bar-2) && IsGravestoneDoji(bar-2) && IsGravestoneDoji(bar-1) && IsGravestoneDoji(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsDragonflyFormation(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsDragonflyDoji(bar-2) && IsDragonflyDoji(bar-1) && IsDragonflyDoji(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsShootingStarCluster(int bar) { return bar > 1 && IsUptrend(bar-2) && IsInvertedHammer(bar-2) && IsInvertedHammer(bar-1) && IsInvertedHammer(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsHammerCluster(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsHammer(bar-2) && IsHammer(bar-1) && IsHammer(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsInvertedHammerSeries(int bar) { return bar > 1 && IsDowntrend(bar-2) && IsInvertedHammer(bar-2) && IsInvertedHammer(bar-1) && IsInvertedHammer(bar); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsComplexHarami(int bar) { return bar > 3 && GetBody(bar-4) > GetAverageTrueRange(bar) * 1.5 && Data.High[bar] < Data.High[bar-4] && Data.Low[bar] > Data.Low[bar-4]; } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUltimateBullishReversal(int bar) { return bar > 4 && ((IsHammer(bar-4) || IsBullishEngulfing(bar-4)) && (IsMorningStar(bar-2) || IsPiercingPattern(bar-2)) && IsBullish(bar) && Data.Close[bar] > Data.High[bar-5]); } //+------------------------------------------------------------------+ bool CandlestickPatternsX::IsUltimateBearishReversal(int bar) { return bar > 4 && (((IsInvertedHammer(bar-4) && IsUptrend(bar-4)) || IsBearishEngulfing(bar-4)) && (IsEveningStar(bar-2) || IsDarkCloudCover(bar-2)) && IsBearish(bar) && Data.Close[bar] < Data.Low[bar-5]); } //+------------------------------------------------------------------+
Risk warning: Forex, spread bets and CFD are leveraged products. They may not be suitable for you as they carry a high degree of risk to your capital and you can lose more than your initial investment. You should ensure you understand all of the risks.
Copyright © 2006 - 2025, Forex Software Ltd.;