Monster, a Harmonic Trading Indicator

Monster, a Harmonic Trading Indicator

7 August 2017, 11:37
Paul Geirnaerdt
1 142

Monster Harmonics Indicator is a harmonic pattern indicator. It recognizes Gartley, Bat, Crab, Butterfly, Cypher, White Swan, Black Swan, Shark, AB=CD, Alt Bat, 3 Drives, Deep Crab and 5-0 patterns. Projected patterns that are not yet completed are recognized, too. Monster even shows the PRZ (Potential Reversal Zone).

Users can add their own user defined patterns to Monster.

Besides the current pattern, Monster also shows all patterns in the symbols history.

Monster will provide alerts for developing patterns.

Introduced by H.M. Gartley and popularized by Scott M. Carney, harmonic patterns are one of the best instruments in the traders' toolkit. While the underlying Fibonacci projections and ratios are fairly complex, this indicator makes detection and discovery of the harmonics patterns easy. Monster gives you the right tool to become a better Harmonics trader.


Monster's default settings are good enough most of the time. Feel free to fine tune them to your needs.

  • Show Control Panel? - show/hide control panel.
  • Show Pattern Projections? - show/hide projected patterns.
  • Show Invalidated Patterns? - show/hide invalidated patterns.
  • Minimum Accuracy Percent - minimum accuracy percentage for pattern recognition.
  • Price Must Touch All Minimum Ratios - set to true to force Monster to touch all minimum ratios, set this if you want the price to touch all minimum ratios and provide even better patterns.
  • Show 'PatternName' Patterns? - show/hide specific pattern.
  • Show Pattern Label? - set to true to show the pattern label in the chart.
  • Show Pattern Accuracy? - set to true to show the pattern accuracy in the chart.
  • Show Ratio Labels and Lines? - set to true to show the ratios of the pattern in the chart.
  • Show Initialization User Patterns? - set to true to show the results of the initialization of the user patterns in the Experts tab.
  • Show Fibonacci Projections in PRZ? - show/hide Fibonacci projections in PRZ.
  • Show Perfect Ratio Levels? - show/hide perfect Fibonacci projections in different color.
  • Show Risk/Reward in PRZ? - show/hide risk/reward PRZ.
  • Show Alerts? - enable/disable all alerts.
  • Show Screen Alerts? - show/hide screen alerts.
  • Email Alerts? - set to true to email alerts.
  • Push Alert Notifications? - set to true to push alerts.
  • Color Palette - choose a color palette for a 'Dark' or 'Light' background.
  • colo(u)rs - you know what to do.
  • Zigzag parameters - set ZigZag parameters.

Perfect Fibonacci projections are the Fibonacci retracement levels where the pattern should retrace or stop according to its definition.

The Potential Reversal Zone (PRZ) is split in a Risk and Reward part. The Reward part of the PRZ is the price of the D point of the pattern to the 0.382 Fibonacci retracement from the C or A point (whichever is higher or lower).

User Patterns

Users can add their own patterns to Monster. Just modify the Monster_UserPatterns.csv to include your patterns. The .csv file can be found in the files folder of the User Data Directory. A sample pattern is already included in the file.

Control Panel

Beginning from the version 2.300, Monster features an optional Control Panel. The Control Panel shows the current detected pattern. You can enable and disable projected patterns and the PRZ. Keep in mind that Monster updates your new settings on the next tick, so changes can take some seconds. The Control Panel can be dragged and minimized. Removing the Control Panel removes the indicator entirely.

Free Demo

Monster will work in the Strategy Tester. However, only the last pattern, if any, in the virtual price feed is detected and displayed. This is a limitation of the Strategy Tester. Monster is best tested in Visual Mode as you can see the detected patterns in the display. Try EURUSD on H1 starting January 1, 2017.


Monster publishes the current pattern through the iCustom() function.

Example script code:

#define PATTERN_NONE            -1
#define PATTERN_GARTLEY         0
#define PATTERN_BAT             1
#define PATTERN_CRAB            2
#define PATTERN_BUTTERFLY       3
#define PATTERN_CYPHER          4
#define PATTERN_BLACK_SWAN      5
#define PATTERN_WHITE_SWAN      6
#define PATTERN_SHARK           7
#define PATTERN_ABCD            8
#define PATTERN_DRAGON          9
#define PATTERN_ALTBAT          10
#define PATTERN_DEEPCRAB        11
#define PATTERN_3DRIVES         12
#define PATTERN_50              13

#define IS_BULLISH              0

#define IS_BEARISH              1

void OnStart()


   int maxBars = 200;

   int pattern  = (int)iCustom( Symbol(), Period(), "Market\\Monster Harmonics", "", false, maxBars, true, 90.0, 1, 0 );
   int direction  = (int)iCustom( Symbol(), Period(), "Market\\Monster Harmonics", "", false, maxBars, true, 90.0, 1, 1 );
   bool projected  = (bool)iCustom( Symbol(), Period(), "Market\\Monster Harmonics", "", false, maxBars, true, 90.0, 1, 2 );
   string patternName;
   switch ( pattern )
      case PATTERN_NONE:
         patternName = "NONE";
         patternName = "GARTLEY";
      case PATTERN_BAT:
         patternName = "BAT";
      case PATTERN_CRAB:
         patternName = "CRAB";
         patternName = "BUTTERFLY";
      case PATTERN_CYPHER:
         patternName = "CYPHER";
         patternName = "BLACK_SWAN";
         patternName = "WHITE_SWAN";
      case PATTERN_SHARK:
         patternName = "SHARK";
      case PATTERN_ABCD:
         patternName = "ABCD";
      case PATTERN_DRAGON:
         patternName = "DRAGON";
      case PATTERN_ALTBAT:
         patternName = "ALT BAT";
         patternName = "DEEP CRAB";
      case PATTERN_3DRIVES:
         patternName = "3 DRIVES";
      case PATTERN_50:
         patternName = "5-0";
         patternName = "USER DEFINED (index=" + IntegerToString( pattern ) + ")";
   if ( pattern != PATTERN_NONE )
      Print ( "Pattern found: ", patternName, "|", direction == IS_BULLISH ? "Bullish" : "Bearish", "|", projected ? "Projected" : "Completed" );
      for ( int i = maxBars; i >= 0; i-- )
         double price  = iCustom( Symbol(), Period(), "Market\\Monster Harmonics", "", false, maxBars, true, 90.0, 2, i );
         if ( price != EMPTY_VALUE )
            Print ( "Pattern point at bar: ", i, ", price :", NormalizeDouble( price, 4 ) );
      Print ( "Pattern found: NONE" );



Loose Ends

Monster will only repaint the last point of the pattern (the D point) to its definition, it follows price. Other points (X, A, B, C) are not repainted.

Do not hesitate to contact me. Let me know what you think of Monster. Only with your help, I can create better tools for MT4.

Share it with friends: