//+------------------------------------------------------------------+ //| FX5_NellyElliotWave.mq4 | //| FX5, Copyright © 2007 | //| hazem@uk2.net | //+------------------------------------------------------------------+ #property copyright "FX5, Copyright © 2007" #property link "hazem@uk2.net" #property indicator_chart_window #property indicator_buffers 8 #define Sunday 0 #define Monday 1 //---- input parameters extern string segment_0 = "*** Daily Close Settings ***"; extern bool enableCustomDailyClose = false; extern string dailyCloseTime = "00:00"; extern string segment_1 = "*** Waves Display Setting ***"; extern bool showMonthlyWaves = true; extern bool showWeeklyWaves = true; extern bool showDailyWaves = true; extern bool showQuarterDailyWaves = true; extern string segment_2 = "*** Waves Color Settings ***"; extern color monthlyWavesColor = BlueViolet; extern color weeklyWavesColor = Green; extern color dailyWavesColor = Blue; extern color quarterDailyWavesColor = Yellow; extern string segment_3 = "*** SwingPoints Color Settings ***"; extern color monthlySwingColor = Yellow; extern color weeklySwingColor = FireBrick; extern color dailySwingColor = Red; extern color quarterDailySwingColor = Chocolate; //---- buffers double monthlyWaves[]; double monthlySwings[]; double weeklyWaves[]; double weeklySwings[]; double dailyWaves[]; double dailySwings[]; double quarterDailyWaves[]; double quarterDailySwings[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { datetime time = StrToTime(dailyCloseTime); dailyCloseTime = TimeToStr(time, TIME_MINUTES); //---- indicators int timeFrame = Period(); int monthlyWidth = 2; int weeklyWidth = 2; int dailyWidth = 2; int quarterDailyWidth = 1; if (timeFrame >= PERIOD_D1) weeklyWidth = 1; if (timeFrame >= PERIOD_H4) dailyWidth = 1; SetIndexStyle(0, DRAW_SECTION, STYLE_SOLID, monthlyWidth, monthlyWavesColor); SetIndexStyle(2, DRAW_SECTION, STYLE_SOLID, weeklyWidth, weeklyWavesColor); SetIndexStyle(4, DRAW_SECTION, STYLE_SOLID, dailyWidth, dailyWavesColor); SetIndexStyle(6, DRAW_SECTION, STYLE_SOLID, quarterDailyWidth, quarterDailyWavesColor); SetIndexStyle(1, DRAW_ARROW, EMPTY, monthlyWidth, monthlySwingColor); SetIndexStyle(3, DRAW_ARROW, EMPTY, weeklyWidth, weeklySwingColor); SetIndexStyle(5, DRAW_ARROW, EMPTY, dailyWidth, dailySwingColor); SetIndexStyle(7, DRAW_ARROW, EMPTY, quarterDailyWidth, quarterDailySwingColor); SetIndexArrow(1, 159); SetIndexArrow(3, 159); SetIndexArrow(5, 159); SetIndexArrow(7, 159); SetIndexBuffer(0, monthlyWaves); SetIndexBuffer(1, monthlySwings); SetIndexBuffer(2, weeklyWaves); SetIndexBuffer(3, weeklySwings); SetIndexBuffer(4, dailyWaves); SetIndexBuffer(5, dailySwings); SetIndexBuffer(6, quarterDailyWaves); SetIndexBuffer(7, quarterDailySwings); SetIndexEmptyValue(0, 0); SetIndexEmptyValue(1, 0); SetIndexEmptyValue(2, 0); SetIndexEmptyValue(3, 0); SetIndexEmptyValue(4, 0); SetIndexEmptyValue(5, 0); SetIndexEmptyValue(6, 0); SetIndexEmptyValue(7, 0); IndicatorDigits(Digits); //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { Comment(""); return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { Comment("Designed & Prgramed By: FX5\n", "***hazem@uk2.net***"); int countedBars = IndicatorCounted(); if (countedBars < 0) countedBars = 0; int timeFrame = Period(); if (showMonthlyWaves) { if (timeFrame == PERIOD_D1 || timeFrame == PERIOD_H4) IdentifyMonthlyWaves(countedBars); } if (showWeeklyWaves) { if (timeFrame == PERIOD_D1 || timeFrame == PERIOD_H4 || timeFrame == PERIOD_H1) IdentifyWeeklyWaves(countedBars); } if (showDailyWaves) { if (timeFrame == PERIOD_H4 || timeFrame == PERIOD_H1 || timeFrame == PERIOD_M30 ||timeFrame == PERIOD_M15 || timeFrame == PERIOD_M5 || timeFrame == PERIOD_M1) IdentifyDailyWaves(countedBars); } if (showQuarterDailyWaves) { if (timeFrame == PERIOD_H1 || timeFrame == PERIOD_M30 || timeFrame == PERIOD_M15 || timeFrame == PERIOD_M5 || timeFrame == PERIOD_M1) IdentifyQuarterDailyWaves(countedBars); } return(0); } //+------------------------------------------------------------------+ void IdentifyMonthlyWaves(int countedBars) { int lastShift = -1; for (int i = Bars - countedBars; i >= 0; i--) { int lastClose = GetLastMonthlyClose(i); if (lastShift == lastClose) continue; else lastShift = lastClose; int lastOpen = GetLastMonthlyClose(lastClose); if (lastClose == -1 || lastOpen == -1) continue; int highShift = GetHighestHighShift(lastClose + 1, lastOpen - lastClose); int lowShift = GetLowestLowShift(lastClose + 1, lastOpen - lastClose); double highPrice = High[highShift]; double lowPrice = Low[lowShift]; if (highShift > lowShift) { monthlyWaves[lastOpen] = highPrice; int middleShift = lastClose + MathCeil((lastOpen - lastClose + 1) / 2); monthlyWaves[middleShift] = lowPrice; } else { monthlyWaves[lastOpen] = lowPrice; middleShift = lastClose + MathCeil((lastOpen - lastClose + 1) / 2); monthlyWaves[middleShift] = highPrice; } int swing_0 = GetLastMonthlySwing(i); int swing_1 = GetLastMonthlySwing(swing_0); int swing_2 = GetLastMonthlySwing(swing_1); int swing_3 = GetLastMonthlySwing(swing_2); if (monthlyWaves[swing_1] > monthlyWaves[swing_0] && monthlyWaves[swing_1] > monthlyWaves[swing_2]) monthlySwings[swing_1] = monthlyWaves[swing_1]; if (monthlyWaves[swing_1] < monthlyWaves[swing_0] && monthlyWaves[swing_1] < monthlyWaves[swing_2]) monthlySwings[swing_1] = monthlyWaves[swing_1]; if (monthlyWaves[swing_2] > monthlyWaves[swing_1] && monthlyWaves[swing_2] > monthlyWaves[swing_3]) monthlySwings[swing_2] = monthlyWaves[swing_2]; if (monthlyWaves[swing_2] < monthlyWaves[swing_1] && monthlyWaves[swing_2] < monthlyWaves[swing_3]) monthlySwings[swing_2] = monthlyWaves[swing_2]; } } //+------------------------------------------------------------------+ void IdentifyWeeklyWaves(int countedBars) { int lastShift = -1; for (int i = Bars - countedBars; i >= 0; i--) { int lastWeekClose = GetLastWeeklyClose(i); if (lastShift == lastWeekClose) continue; else lastShift = lastWeekClose; int lastWeekOpen = GetLastWeeklyClose(lastWeekClose); if (lastWeekClose == -1 || lastWeekOpen == -1) continue; int weekHighShift = GetHighestHighShift(lastWeekClose + 1, lastWeekOpen - lastWeekClose); int weekLowShift = GetLowestLowShift(lastWeekClose + 1, lastWeekOpen - lastWeekClose); double weekHighPrice = High[weekHighShift]; double weekLowPrice = Low[weekLowShift]; if (weekHighShift > weekLowShift) { weeklyWaves[lastWeekOpen] = weekHighPrice; int middleWeekShift = lastWeekClose + MathCeil((lastWeekOpen - lastWeekClose + 1) / 2); weeklyWaves[middleWeekShift] = weekLowPrice; } else { weeklyWaves[lastWeekOpen] = weekLowPrice; middleWeekShift = lastWeekClose + MathCeil((lastWeekOpen - lastWeekClose + 1) / 2); weeklyWaves[middleWeekShift] = weekHighPrice; } int swing_0 = GetLastWeeklySwing(i); int swing_1 = GetLastWeeklySwing(swing_0); int swing_2 = GetLastWeeklySwing(swing_1); int swing_3 = GetLastWeeklySwing(swing_2); if (weeklyWaves[swing_1] > weeklyWaves[swing_0] && weeklyWaves[swing_1] > weeklyWaves[swing_2]) weeklySwings[swing_1] = weeklyWaves[swing_1]; if (weeklyWaves[swing_1] < weeklyWaves[swing_0] && weeklyWaves[swing_1] < weeklyWaves[swing_2]) weeklySwings[swing_1] = weeklyWaves[swing_1]; if (weeklyWaves[swing_2] > weeklyWaves[swing_1] && weeklyWaves[swing_2] > weeklyWaves[swing_3]) weeklySwings[swing_2] = weeklyWaves[swing_2]; if (weeklyWaves[swing_2] < weeklyWaves[swing_1] && weeklyWaves[swing_2] < weeklyWaves[swing_3]) weeklySwings[swing_2] = weeklyWaves[swing_2]; } } //+------------------------------------------------------------------+ void IdentifyDailyWaves(int countedBars) { int lastShift = -1; for (int i = Bars - countedBars; i >= 0; i--) { int lastDayClose = GetLastDailyClose(i); if (lastShift == lastDayClose) continue; else lastShift = lastDayClose; int lastDayOpen = GetLastDailyClose(lastDayClose); if (lastDayClose == -1 || lastDayOpen == -1) continue; int dayHighShift = GetHighestHighShift(lastDayClose + 1, lastDayOpen - lastDayClose); int dayLowShift = GetLowestLowShift(lastDayClose + 1, lastDayOpen - lastDayClose); double dayHighPrice = High[dayHighShift]; double dayLowPrice = Low[dayLowShift]; if (dayHighShift > dayLowShift) { dailyWaves[lastDayOpen] = dayHighPrice; int middleDayShift = lastDayClose + MathCeil((lastDayOpen - lastDayClose + 1) / 2); dailyWaves[middleDayShift] = dayLowPrice; } else { dailyWaves[lastDayOpen] = dayLowPrice; middleDayShift = lastDayClose + MathCeil((lastDayOpen - lastDayClose + 1) / 2); dailyWaves[middleDayShift] = dayHighPrice; } int swing_0 = GetLastDailySwing(i); int swing_1 = GetLastDailySwing(swing_0); int swing_2 = GetLastDailySwing(swing_1); int swing_3 = GetLastDailySwing(swing_2); if (dailyWaves[swing_1] > dailyWaves[swing_0] && dailyWaves[swing_1] > dailyWaves[swing_2]) dailySwings[swing_1] = dailyWaves[swing_1]; if (dailyWaves[swing_1] < dailyWaves[swing_0] && dailyWaves[swing_1] < dailyWaves[swing_2]) dailySwings[swing_1] = dailyWaves[swing_1]; if (dailyWaves[swing_2] > dailyWaves[swing_1] && dailyWaves[swing_2] > dailyWaves[swing_3]) dailySwings[swing_2] = dailyWaves[swing_2]; if (dailyWaves[swing_2] < dailyWaves[swing_1] && dailyWaves[swing_2] < dailyWaves[swing_3]) dailySwings[swing_2] = dailyWaves[swing_2]; } } //+------------------------------------------------------------------+ void IdentifyQuarterDailyWaves(int countedBars) { int lastShift = -1; for (int i = Bars - countedBars; i >= 0; i--) { int lastClose = GetLastQuarterDailyClose(i); if (lastShift == lastClose) continue; else lastShift = lastClose; int lastOpen = GetLastQuarterDailyClose(lastClose); if (lastClose == -1 || lastOpen == -1) continue; int highShift = GetHighestHighShift(lastClose + 1, lastOpen - lastClose); int lowShift = GetLowestLowShift(lastClose + 1, lastOpen - lastClose); double highPrice = High[highShift]; double lowPrice = Low[lowShift]; if (highShift > lowShift) { quarterDailyWaves[lastOpen] = highPrice; int middleShift = lastClose + MathCeil((lastOpen - lastClose + 1) / 2); quarterDailyWaves[middleShift] = lowPrice; } else { quarterDailyWaves[lastOpen] = lowPrice; middleShift = lastClose + MathCeil((lastOpen - lastClose + 1) / 2); quarterDailyWaves[middleShift] = highPrice; } int swing_0 = GetLastQuarterDailySwing(i); int swing_1 = GetLastQuarterDailySwing(swing_0); int swing_2 = GetLastQuarterDailySwing(swing_1); int swing_3 = GetLastQuarterDailySwing(swing_2); if (quarterDailyWaves[swing_1] > quarterDailyWaves[swing_0] && quarterDailyWaves[swing_1] > quarterDailyWaves[swing_2]) quarterDailySwings[swing_1] = quarterDailyWaves[swing_1]; if (quarterDailyWaves[swing_1] < quarterDailyWaves[swing_0] && quarterDailyWaves[swing_1] < quarterDailyWaves[swing_2]) quarterDailySwings[swing_1] = quarterDailyWaves[swing_1]; if (quarterDailyWaves[swing_2] > quarterDailyWaves[swing_1] && quarterDailyWaves[swing_2] > quarterDailyWaves[swing_3]) quarterDailySwings[swing_2] = quarterDailyWaves[swing_2]; if (quarterDailyWaves[swing_2] < quarterDailyWaves[swing_1] && quarterDailyWaves[swing_2] < quarterDailyWaves[swing_3]) quarterDailySwings[swing_2] = quarterDailyWaves[swing_2]; } } //+------------------------------------------------------------------+ int GetLastMonthlySwing(int shift) { for (int i = shift + 1; i < Bars; i++) { if (monthlyWaves[i] != 0) return(i); } return(-1); } //+------------------------------------------------------------------+ int GetLastWeeklySwing(int shift) { for (int i = shift + 1; i < Bars; i++) { if (weeklyWaves[i] != 0) return(i); } return(-1); } //+------------------------------------------------------------------+ int GetLastDailySwing(int shift) { for (int i = shift + 1; i < Bars; i++) { if (dailyWaves[i] != 0) return(i); } return(-1); } //+------------------------------------------------------------------+ int GetLastQuarterDailySwing(int shift) { for (int i = shift + 1; i < Bars; i++) { if (quarterDailyWaves[i] != 0) return(i); } return(-1); } //+------------------------------------------------------------------+ int GetLastMonthlyClose(int shift) { for (int i = shift + 1; i < Bars; i++) { if (TimeDay(Time[i]) < TimeDay(Time[i+1])) return(i); } return(-1); } //+------------------------------------------------------------------+ int GetLastWeeklyClose(int shift) { for (int i = shift + 1; i < Bars; i++) { if (TimeDayOfWeek(Time[i]) < TimeDayOfWeek(Time[i+1])) return(i); } return(-1); } //+------------------------------------------------------------------+ int GetLastDailyClose(int shift) { if (enableCustomDailyClose) { for (int i = shift + 1; i < Bars; i++) { string candleDateString = TimeToStr(Time[i], TIME_DATE); datetime closeTime = StrToTime(candleDateString + " " + dailyCloseTime); if (closeTime < Time[shift] && closeTime >= Time[i]) return(i); } } else { for (i = shift + 1; i < Bars; i++) { if (TimeDayOfWeek(Time[i]) != TimeDayOfWeek(Time[i+1]) && TimeDayOfWeek(Time[i]) != Monday && TimeDayOfWeek(Time[i+1]) != Sunday) return(i); } } return(-1); } //+------------------------------------------------------------------+ int GetLastQuarterDailyClose(int shift) { if (enableCustomDailyClose) { int colonIndex = StringFind(dailyCloseTime, ":", 0); if (colonIndex == -1) return(-1); string closeHourString = StringSubstr(dailyCloseTime, 0, colonIndex); int closeHour = StrToInteger(closeHourString); } else closeHour = 0; for (int i = shift + 1; i < Bars; i++) { string candleDateString = TimeToStr(Time[i], TIME_DATE); int quarterHour = HourSum(closeHour, 0); datetime closeTime = StrToTime(candleDateString + " " + DoubleToStr(quarterHour, 0) + ":00"); if (closeTime < Time[shift] && closeTime >= Time[i]) return(i); quarterHour = HourSum(closeHour, 6); closeTime = StrToTime(candleDateString + " " + DoubleToStr(quarterHour, 0) + ":00"); if (closeTime < Time[shift] && closeTime >= Time[i]) return(i); quarterHour = HourSum(closeHour, 12); closeTime = StrToTime(candleDateString + " " + DoubleToStr(quarterHour, 0) + ":00"); if (closeTime < Time[shift] && closeTime >= Time[i]) return(i); quarterHour = HourSum(closeHour, 18); closeTime = StrToTime(candleDateString + " " + DoubleToStr(quarterHour, 0) + ":00"); if (closeTime < Time[shift] && closeTime >= Time[i]) return(i); } return(-1); } //+------------------------------------------------------------------+ int HourSum(int firstHour, int secondHour) { int sum = firstHour + secondHour; if (sum >= 24) sum -= 24; return(sum); } //+------------------------------------------------------------------+ int GetHighestHighShift(int start, int count) { int highestShift = -1; double highestPrice = -1; for (int i = start; i < start + count; i++) { if (High[i] > highestPrice) { highestShift = i; highestPrice = High[i]; } } return(highestShift); } //+------------------------------------------------------------------+ int GetLowestLowShift(int start, int count) { int lowestShift = -1; double lowestPrice = 9999999; for (int i = start; i < start + count; i++) { if (Low[i] < lowestPrice) { lowestShift = i; lowestPrice = Low[i]; } } return(lowestShift); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+