/*+-------------------------------------------------------------------+
| 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 |
+-------------------------------------------------------------------+*/
Comments