/*+-------------------------------------------------------------------+ | iMAX3.mq4 | | | | iMAX3 is a "hybrid" indicator based upon my prior works... | | The original "iMAX" indicator and the follow on "iMAXhp" | | indicator. Both indicators phase shift a "Modified Optimum | | Elliptic Filter" ref: | | | | Source of calculations: | | Stocks & Commodities vol 18:7 p20-29 | | Optimal Detrending by John F. Ehlers | | | | Original iMAX indicator: | | | | The MOEF signal was phase shifted by 1 bar period... The base | | phase and shifted phase cross are used to detect fast trends in | | price action. The MOEF signal as used iMAX has extremely useful | | characteristics... it provides fast trend information with | | no adjustments in parameters in all timeframes, and currencies. | | It is extremely resistant to price spikes and holds a valid | | trend in all market conditions... from extemely volatile, until | | price action goes flat. It is not the fastest trend detection | | system, but one of best overall for both speed and stability. | | It is an ideal indicator for general purpose applications | | such as trend change detection/alerts, MTF displays, and | | filters. | | | | The original iMAX indicator was published by me without copyright | | for use in the public domain. Subsequent publications of iMAXhp, | | iMAXhpx, and iMAX3 are copyrighted works. | | | | iMAXhp (high performance) | | | | To improve responsiveness or speed of detection of the iMAX | | indicator the iMAXhp (high perfomance) indicator, swiched from | | frequecy or bar/phase shifting the MOEF signal, to amplitude | | phase shifting. This improves response time by about two bars, | | at the expense of some filtering characteristics, and it | | requires the second phase amplitude be specified... A general | | purpose set of amplitude values is built into this indicator for | | ease of application, and can be adjusted if needed. | | | | For example: Adjustment of the general purpose set of amplitude | | values would be necessary when you are applying the indicator to | | JPY currency pairs, because the JPY currency is so very different | | in it's price compared to other currencies. Amplitude is | | adjusted by varying the Ph1step variable values in the code below.| | An approximate change in value to compensate for price | | difference in the JPY currency would be to multiply the preset | | Ph1step variable values by 100. You can change a Ph1step value, | | recompile the code, and observe the amplitude change using the | | phase lines generated by the indicator in the chart price area. | | | | iMAXhpx | | | | Not publically introduced before... I change the formula for | | Ehlers' calculations slightly, and again boost speed in trend | | detection. | | | | All three modes are built into this indicator, and any, or all | | modes can be used simultaneously. Welcome to iMAX3... | | | | iMAX3 attempts to standardize application of the prior indicators,| | offering the utility of either frequency, or amplitude phase | | shifting. By default this indicator will operate in the original | | bar/phase shifted mode... just drop in on a chart and it works | | well in any timeframe and any currency. For higher speed | | amplitude phase shifted modes, the preset amplitude settings can | | be used, or unique settings specified. | | | | Another good reason for creating this hybrid version is that the | | former frequency and amplitude shifted versions are intrinsically | | 180 degrees out of phase with each other. So, in this version, | | which I intend to base all future work upon, both methods of | | phase shifting are compensated for in terms of phase | | differences... so all future applications can use either method | | of phase shifting interchangeably. If you build an application | | using one method of phase shifting and decide later to change it, | | either for speed advantages, or better filtering characteristics, | | you can use this single indicator without potentially confusing | | phase differences between them. | | | | This indicator changes it's values on the open bar with no other | | modifications to it's bar/price history. | | | | Indicator buffers are not read unless a particular mode is | | specified, so execution speed of this hybrid indicator is on par | | with a dedicated indicator executing a single mode. | | | | Crafted by Wylie | | Copyright © 2009 | | dazzle.html@live.com | +-------------------------------------------------------------------+*/ #property copyright "Copyright © 2009, Wylie" #property link "dazzle.html@live.com" #property indicator_chart_window #property indicator_buffers 6 #property indicator_color1 Lime #property indicator_color2 HotPink #property indicator_color3 White #property indicator_color4 Orange #property indicator_color5 Aqua #property indicator_color6 Red /*+-------------------------------------------------------------------+ | iMAX3 Parameters | +-------------------------------------------------------------------+*/ extern string _0 = "Select Mode"; extern bool iMAXmode = true; extern bool hpMode = false; extern bool hpxMode = false; extern string _1 = ""; extern string _2 = "Display on chart"; extern bool iMAXPhases = true; extern bool hpPhases = false; extern bool hpxPhases = false; extern string _3 = ""; extern string _4 = "Amplitude shift for hp modes."; extern string _5 = "0.0 = Use internal presets."; extern double Ph1stepHPmodes = 0.0; extern string _6 = ""; extern color hpxPh1color = Lime; extern color hpxPh2color = HotPink; extern string _7 = ""; extern color hpPh1color = White; extern color hpPh2color = Orange; extern string _8 = ""; extern color iMAXph1color = Aqua; extern color iMAXph2color = Red; double iMAX0[],iMAX1[],hp0[],hp1[],hpx0[],hpx1[],Ph1step,x,xhp0,xhp1; int MinBars,c,limit,countedBars; /*+-------------------------------------------------------------------+ | iMAX3 Initialization | +-------------------------------------------------------------------+*/ int init() { IndicatorBuffers(6); if(hpxMode) {SetIndexBuffer(0,hpx0); SetIndexBuffer(1,hpx1); if(hpxPhases) {SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,hpxPh1color); SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,1,hpxPh2color);} else {SetIndexStyle(0,DRAW_NONE); SetIndexStyle(1,DRAW_NONE);}} if(hpMode) {SetIndexBuffer(2,hp0); SetIndexBuffer(3,hp1); if(hpPhases) {SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,1,hpPh1color); SetIndexStyle(3,DRAW_LINE,STYLE_SOLID,1,hpPh2color);} else {SetIndexStyle(2,DRAW_NONE); SetIndexStyle(3,DRAW_NONE);}} SetIndexBuffer(4,iMAX0); SetIndexBuffer(5,iMAX1); if(iMAXmode && iMAXPhases) {SetIndexStyle(4,DRAW_LINE,STYLE_SOLID,1,iMAXph1color); SetIndexStyle(5,DRAW_LINE,STYLE_SOLID,1,iMAXph2color);} else {SetIndexStyle(4,DRAW_NONE); SetIndexStyle(5,DRAW_NONE);} if(hpMode || hpxMode) {if(Ph1stepHPmodes == 0.0) {switch(Period()) {case 1: Ph1step = 0.0001; break; case 5: Ph1step = 0.00015; break; case 15: Ph1step = 0.0003; break; case 30: Ph1step = 0.0005; break; case 60: Ph1step = 0.00075; break; case 240: Ph1step = 0.0015; break; case 1440: Ph1step = 0.003; break; case 10080: Ph1step = 0.005; break; case 43200: Ph1step = 0.01; break;}} else {Ph1step = Ph1stepHPmodes;}} MinBars = 20; IndicatorShortName("iMAX3"); return (0); } // int init() /*+-------------------------------------------------------------------+ | iMAX3 Main cycle | +-------------------------------------------------------------------+*/ int start() { if(Bars <= MinBars){return (0);} countedBars = IndicatorCounted(); if(countedBars < 0){return (-1);} if(countedBars > 0){countedBars--;} limit = Bars - countedBars - 1; x = 0.5; c = limit; while(c >= 0) { if(hpxMode) {hpx1[c] = (0.13785 * (2 * ((High[c] + Low[c]) * x) - ((High[c+1] + Low[c+1]) * x))) + (0.0007 * (2 * ((High[c+1] + Low[c+1]) * x) - ((High[c+2] + Low[c+2]) * x))) + (0.13785 * (2 * ((High[c+2] + Low[c+2]) * x) - ((High[c+3] + Low[c+3]) * x))) + (1.2103 * hpx0[c + 1] - 0.4867 * hpx0[c + 2]); if(Close[c] > hpx1[c]) {hpx0[c] = hpx1[c] + Ph1step;} if(Close[c] < hpx1[c]) {hpx0[c] = hpx1[c] - Ph1step;}} if(iMAXmode || hpMode) {iMAX0[c] = (0.13785 * (2 * ((High[c] + Low[c]) * x) - ((High[c+1] + Low[c+1]) * x))) + (0.0007 * (2 * ((High[c+1] + Low[c+1]) * x) - ((High[c+2] + Low[c+2]) * x))) + (0.13785 * (2 * ((High[c+2] + Low[c+2]) * x) - ((High[c+3] + Low[c+3]) * x))) + (1.2103 * iMAX0[c + 1] - 0.4867 * iMAX0[c + 2]); xhp0 = iMAX0[c]; iMAX1[c] = iMAX0[c+1];} if(hpMode) {if(Close[c] > iMAX0[c]) {xhp1 = iMAX0[c] + Ph1step;} if(Close[c] < iMAX0[c]) {xhp1 = iMAX0[c] - Ph1step;} hp0[c] = xhp1;hp1[c] = xhp0;} c--; } // while(c >= 0) return (0); } // int start() /*+-------------------------------------------------------------------+ | End iMAX3 Main cycle | +-------------------------------------------------------------------+*/
Sample
Analysis
Market Information Used:
Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Implements a curve of type DRAW_NONE
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: