/*-----------------------------+ | | | Shared by www.Aptrafx.com | | | +------------------------------*/ //+------------------------------------------------------------------+ //| Pivot.mq4 | //| Copyright © 2004, MetaQuotes Software Corp. | //| http://www.metaquotes.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2004, MetaQuotes Software Corp." #property link "http://www.metaquotes.net" #property indicator_chart_window // ---- user input --------------- /* LocalTimeZone: TimeZone for which MT4 shows your local time, e.g. 1 or 2 for Europe (GMT+1 or GMT+2 (daylight savings time). Use zero for no adjustment. DestTimeZone: TimeZone for the session from which to calculate the levels (e.g. 1 or 2 for the European session (without or with daylight savings time). Use zero for GMT The following doesn't work yet, please leave it to 0/24: TradingHoursFrom: First hour of the trading session in the destination time zone. TradingHoursTo: Last hour of the trading session in the destination time zone (the hour starting with this value is excluded, i.e. 18 means up to 17:59 o'clock) Example: If you are lving in the EST (Eastern Standard Time, GMT-5) zone and want to calculate the levels for the London trading session (European time GMT+1, 08:00 - 17:00), then enter -5 for LocalTimeZone, 1 for Dest TimeZone, 8 for HourFrom and 17 for hour to. */ extern int LocalTimeZone= 0; extern int DestTimeZone= 0; int TradingHoursFrom= 0; int TradingHoursTo= 24; extern bool ShowPivots = true; extern bool ShowCamarilla = false; extern bool ShowMidPitvot = false; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { return(0); } int deinit() { ObjectDelete("YesterdayStart"); ObjectDelete("YesterdayEnd"); ObjectDelete("YesterdayStart Label"); ObjectDelete("YesterdayEnd Label"); ObjectDelete("Pivot Label"); ObjectDelete("Pivot Line"); string types= "RSHLM"; // beginning letters of objects for (int i= 0; i<StringLen(types); i++) { for (int j= 0; j<6; j++) { ObjectDelete(StringSubstr(types, i, 1) + j +" Line"); ObjectDelete(StringSubstr(types, i, 1) + j +" Label"); } } return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { static datetime timelastupdate= 0; if (CurTime()-timelastupdate < 600) return (0); timelastupdate= CurTime(); //---- exit if period is greater than daily charts if(Period() > 1440) { Print("Error - Chart period is greater than 1 day."); return(-1); // then exit } datetime startofday= 0; double day_high= 0; double day_low= 0; double yesterday_high= 0; double yesterday_open= 0; double yesterday_low= 0; double yesterday_close= 0; double today_open= 0; double today_high= 0; double today_low= 0; double P= 0; double Q= 0; double R1,R2,R3; double M0,M1,M2,M3,M4,M5; double S1,S2,S3; double H4,H3,L4,L3; double nQ= 0; double nD= 0; double D= 0; double rates_d1[2][6]; double rates_h1[2][6]; //---- Get new daily prices /* flat time ArrayCopyRates(rates_d1, Symbol(), PERIOD_D1); yesterday_close= rates_d1[1][4]; yesterday_open= rates_d1[1][1]; today_open= rates_d1[0][1]; yesterday_high= rates_d1[1][3]; yesterday_low= rates_d1[1][2]; day_high= rates_d1[0][3]; day_low= rates_d1[0][2]; Print("unzoned1: yc =", yesterday_close, ", yo= ", yesterday_open, ", to= ", today_open, ", yhigh= ", yesterday_high, ", ylow= ", yesterday_low); */ Print("Local time current bar:", TimeToStr(iTime(NULL, PERIOD_H1, 0))); Print("Dest time current bar: ", TimeToStr(iTime(NULL, PERIOD_H1, 0)- (LocalTimeZone - DestTimeZone)*3600), ", tzdiff= ", LocalTimeZone - DestTimeZone); for (int i=0; i<=25; i++) { datetime time= iTime(NULL, PERIOD_H1, i); int tzdiff= LocalTimeZone - DestTimeZone, tzdiffsec= tzdiff*3600; Print("Looking at H1 bar ", i, " time on bar local= ", TimeToStr(time), ", bar time dest= ", TimeToStr(time-tzdiffsec)); if (TimeHour(time - tzdiffsec)==0) { int idxfirstbaroftoday= i, idxfirstbarofyesterday= 0, idxlastbarofyesterday= 0; Print("Dest time zone\'s current day starts:", TimeToStr(iTime(NULL, PERIOD_H1, idxfirstbaroftoday)), " (local time), idxbar= ", idxfirstbaroftoday); // search backwards for a 00:00 o'clock bar in the destination time zone for (int j= 1; j<=48; j++) { datetime timey= iTime(NULL, PERIOD_H1, i+j) - tzdiffsec; if (TimeHour(timey)==0 && TimeDayOfWeek(timey)!=6) { // ignore saturdays (a Sa may happen due to TZ conversion) idxfirstbarofyesterday= i+j; break; } } datetime timeyesterdayopen= iTime(NULL, PERIOD_H1, idxfirstbarofyesterday); Print("Dest time zone\'s previous day starts:", TimeToStr(timeyesterdayopen), " (local time), idxbar= ", idxfirstbarofyesterday); // // walk forward from yestday's start and collect hours within the same day and within trading hours // yesterday_high= -99999; // not high enough to remain alltime high yesterday_low= +99999; // not low enough to remain alltime low for (j= 0; j<24; j++) { int idxbar= idxfirstbarofyesterday-j; datetime bartime= iTime(NULL, PERIOD_H1, idxbar) - tzdiffsec; if (TimeDayOfWeek(bartime)==TimeDayOfWeek(iTime(NULL, PERIOD_H1, idxfirstbarofyesterday)-tzdiffsec) && TimeHour(bartime) >= TradingHoursFrom && TimeHour(bartime) < TradingHoursTo) { if (yesterday_open==0) // grab first value for open yesterday_open= iOpen(NULL, PERIOD_H1, idxbar); yesterday_high= MathMax(iHigh(NULL, PERIOD_H1, idxbar), yesterday_high); yesterday_low= MathMin(iLow(NULL, PERIOD_H1, idxbar), yesterday_low); // overwrite close in loop until we leave with the last bar's value yesterday_close= iClose(NULL, PERIOD_H1, idxbar); idxlastbarofyesterday= idxbar; } } Print("Dest time zone\'s previous day ends:", TimeToStr(iTime(NULL, PERIOD_H1, idxlastbarofyesterday)), " (local time), idxbar= ", idxlastbarofyesterday); if (tzdiff!=0 || TradingHoursFrom!=0 || TradingHoursTo!=24|| true) { double level= (yesterday_high + yesterday_low + yesterday_close) / 3; SetTimeLine("YesterdayStart", "start", idxfirstbarofyesterday, CadetBlue, level - 4*Point); SetTimeLine("YesterdayEnd", "end", idxlastbarofyesterday-1, CadetBlue, level - 4*Point); } today_open= iOpen(NULL, PERIOD_H1, idxfirstbaroftoday); // should be open of today start trading hour startofday= iTime(NULL, PERIOD_H1, idxfirstbaroftoday); // Print("Ybar= ", idxlastbarofyesterday, " tbar= ", idxfirstbaroftoday, "/", TimeToStr(startofday)); day_high= -99999; // not high enough to remain alltime high day_low= +99999; // not low enough to remain alltime low for (j= idxfirstbaroftoday; j>=0; j--) { day_high= MathMax(day_high, iHigh(NULL, PERIOD_H1, j)); day_low= MathMin(day_low, iLow(NULL, PERIOD_H1, j)); } break; } } Print("Timezoned values: yo= ", yesterday_open, ", yc =", yesterday_close, ", yhigh= ", yesterday_high, ", ylow= ", yesterday_low, ", to= ", today_open); //---- Calculate Pivots D = (day_high - day_low); Q = (yesterday_high - yesterday_low); P = (yesterday_high + yesterday_low + yesterday_close) / 3; R1 = (2*P)-yesterday_low; R2 = P+(yesterday_high - yesterday_low); R3 = (2*P)+(yesterday_high-(2*yesterday_low)); S1 = (2*P)-yesterday_high; S2 = P-(yesterday_high - yesterday_low); S3 = (2*P)-((2* yesterday_high)-yesterday_low); // R2 = P-S1+R1; // R1 = (2*P)-yesterday_low; // P = (yesterday_high + yesterday_low + yesterday_close)/3; // S1 = (2*P)-yesterday_high; // S2 = P-R1+S1; // Camarilla (http://www.moneytec.com/forums/showthread.php?t=14179&page=5) // H4= (high-low)*1.1/2+close; H3= (high-low)*1.1/4+close; // H2= (high-low)*1.1/6+close; H1= (high-low)*1.1/12+close // L1= close-(high-low)*1.1/12; L2= close-(high-low)*1.1/6; // L3= close-(high-low)*1.1/4; L4= close-(high-low)*1.1/2; H4 = (Q*0.55)+yesterday_close; H3 = (Q*0.27)+yesterday_close; L3 = yesterday_close-(Q*0.27); L4 = yesterday_close-(Q*0.55); // // midpoints between pivots // M5 = (R2+R3)/2; M4 = (R1+R2)/2; M3 = (P+R1)/2; M2 = (P+S1)/2; M1 = (S1+S2)/2; M0 = (S2+S3)/2; if (Q > 5) { nQ = Q; } else { nQ = Q/Point; } if (D > 5) { nD = D; } else { nD = D/Point; } Comment("-- Good Morning, Good Luck Trading RICKY Ds System! ---\n", "Range: Yesterday ",nQ," pips", ", Today ",nD," pips","\n", "Highs: Yesterday ",yesterday_high, ", Today ",day_high, "\n", "Lows: Yesterday ",yesterday_low, ", Today ",day_low, "\n", "Close: Yesterday ",yesterday_close); //---- Set line labels on chart window //---- Pivot Lines if (ShowPivots==true) { SetLevel("R1", R1, Blue, startofday); SetLevel("R2", R2, Blue, startofday); SetLevel("R3", R3, Blue, startofday); SetLevel("Pivot", P, Magenta, startofday); SetLevel("S1", S1, Red, startofday); SetLevel("S2", S2, Red, startofday); SetLevel("S3", S3, Red, startofday); } //----- Camarilla Lines if (ShowCamarilla==true) { SetLevel("H3", H3, Yellow, startofday); SetLevel("H4", H4, Yellow, startofday); SetLevel("L3", L3, Yellow, startofday); SetLevel("L4", L4, Yellow, startofday); } //------ Midpoints Pivots if (ShowMidPitvot==true) { SetLevel("M5", M5, Green, startofday); SetLevel("M4", M4, Green, startofday); SetLevel("M3", M3, Green, startofday); SetLevel("M2", M2, Green, startofday); SetLevel("M1", M1, Green, startofday); SetLevel("M0", M0, Green, startofday); } return(0); } //+------------------------------------------------------------------+ //| Helper | //+------------------------------------------------------------------+ void SetLevel(string text, double level, color col1, datetime startofday) { string labelname= text + " Label"; string linename= text + " Line"; if (ObjectFind(labelname) != 0) { ObjectCreate(labelname, OBJ_TEXT, 0, Time[20], level); ObjectSetText(labelname, " " + text, 8, "Arial", White); } else { ObjectMove(labelname, 0, Time[20], level); } if (ObjectFind(linename) != 0) { ObjectCreate(linename, OBJ_TREND, 0, startofday, level, Time[0],level); ObjectSet(linename, OBJPROP_STYLE, STYLE_DASHDOTDOT); ObjectSet(linename, OBJPROP_COLOR, col1); } else { ObjectMove(linename, 1, Time[0],level); ObjectMove(linename, 0, startofday, level); } } //+------------------------------------------------------------------+ //| Helper | //+------------------------------------------------------------------+ void SetTimeLine(string name, string text, int idx, color col1, double vleveltext) { int x= iTime(NULL, PERIOD_H1, idx); if (ObjectFind(name) != 0) ObjectCreate(name, OBJ_TREND, 0, x, 0, x, 100); else { ObjectMove(name, 0, x, 0); ObjectMove(name, 1, x, 100); } ObjectSet(name, OBJPROP_STYLE, STYLE_DOT); ObjectSet(name, OBJPROP_COLOR, DarkGray); if (ObjectFind(name + " Label") != 0) ObjectCreate(name + " Label", OBJ_TEXT, 0, x, vleveltext); else ObjectMove(name + " Label", 0, x, vleveltext); ObjectSetText(name + " Label", text, 8, "Arial", col1); }
Sample
Analysis
Market Information Used:
Series array that contains open prices of each bar
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
Series array that contains open time of each bar
Indicator Curves created:
Indicators Used:
Custom Indicators Used:
Order Management characteristics:
Other Features: