//+------------------------------------------------------------------+ //| 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); } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+
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 open time of each bar
Indicator Curves created:
Implements a curve of type DRAW_SECTION
Implements a curve of type DRAW_ARROW
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: