//+------------------------------------------------------------------+ //| Homodyne Discriminator.mq4 | //| Tantalus - from J. Ehlers | //| | //+------------------------------------------------------------------+ #property copyright "Tantalus - from J. Ehlers" #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 DodgerBlue double dDomPeriod[]; double dDeTrend[]; double Q1[]; double I1[]; double jQ, jI; double I2, Q2, LastI2, LastQ2; double Re, Im, LastRe, LastIm; int init() { IndicatorBuffers(4); SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, dDomPeriod); SetIndexStyle(1, DRAW_NONE); SetIndexBuffer(1, dDeTrend); SetIndexStyle(2, DRAW_NONE); SetIndexBuffer(2, Q1); SetIndexStyle(3, DRAW_NONE); SetIndexBuffer(3, I1); int k; for (k = Bars; k >= 0; k --) { dDomPeriod[k] = 0.0; dDeTrend[k] = 0.0; Q1[k] = 0.0; I1[k] = 0.0; } return(0); } int start() { int k; for (k = Bars - 6; k >= 0; k --) { dDeTrend[k] = (0.0962 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k) + 0.5769 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k + 2) - 0.5769 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k + 4) - 0.0962 * iMA(Symbol(), 0, 4, 0, MODE_LWMA, PRICE_MEDIAN, k + 6)) * (0.075 * dDomPeriod[k + 1] + 0.54); Q1[k] = (0.0962 * dDeTrend[k] + 0.5769 * dDeTrend[k + 2] - 0.5769 * dDeTrend[k + 4] - 0.0962 * dDeTrend[k + 6]) * (0.075 * dDomPeriod[k + 1] + 0.54); I1[k] = dDeTrend[k + 3]; jI = (0.0962 * I1[k] + 0.5769 * I1[k + 2] - 0.5769 * I1[k + 4] - 0.0962 * I1[k + 6]) * (0.075 * dDomPeriod[k + 1] + 0.54); jQ = (0.0962 * Q1[k] + 0.5769 * Q1[k + 2] - 0.5769 * Q1[k + 4] - 0.0962 * Q1[k + 6]) * (0.075 * dDomPeriod[k + 1] + 0.54); I2 = I1[k] - jQ; Q2 = Q1[k] + jI; I2 = 0.2 * I2 + 0.8 * LastI2; Q2 = 0.2 * Q2 + 0.8 * LastQ2; Re = I2 * LastI2 + Q2 * LastQ2; Im = I2 * LastQ2 - Q2 * LastI2; Re = 0.2 * Re + 0.8 * LastRe; Im = 0.2 * Im + 0.8 * LastIm; LastI2 = I2; LastQ2 = Q2; LastRe = Re; LastIm = Im; if (Im != 0 && Re != 0) dDomPeriod[k] = 360 / MathArctan(Im / Re); if (dDomPeriod[k] > 1.5 * dDomPeriod[k + 1]) dDomPeriod[k] = 1.5 * dDomPeriod[k + 1]; if (dDomPeriod[k] < 0.6667 * dDomPeriod[k + 1]) dDomPeriod[k] = 0.6667 * dDomPeriod[k + 1]; if (dDomPeriod[k] < 6.0) dDomPeriod[k] = 6.0; if (dDomPeriod[k] > 50.0) dDomPeriod[k] = 50.0; dDomPeriod[k] = 0.2 * dDomPeriod[k] + 0.8 * dDomPeriod[k + 1]; } return(0); }