/*-----------------------------+ | | | Shared by www.Aptrafx.com | | | +------------------------------*/ //+------------------------------------------------------------------+ //| Bunnygirl Cross and Daily Open.mq4 | //| Copyright © 2005, David W. Thomas | //| mailto:davidwt@usa.net | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, David W. Thomas" #property link "mailto:davidwt@usa.net" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 DarkViolet #property indicator_color2 Blue #property indicator_color3 Red #property indicator_color4 Gray //---- input parameters extern int PipsForBounce=3; extern int TimeZoneOfData=2; extern int ma_method=MODE_LWMA; //---- buffers double DailyOpenBuffer[]; double BuyFilterBuffer[]; double SellFilterBuffer[]; double CrossBounceBuffer[]; //---- variables int indexbegin = 0; string mastrtype = ""; double dailyopen = 0, crossamount, filter = 0; int crosstime = 0; bool crossdir = true; bool FilterTradingTime = true; int beginfiltertime = 0; int endfiltertime = 24; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- indicators SetIndexStyle(0, DRAW_LINE); SetIndexBuffer(0, DailyOpenBuffer); SetIndexLabel(0, "Daily Open"); SetIndexEmptyValue(0, 0.0); SetIndexStyle(1, DRAW_LINE); SetIndexBuffer(1, BuyFilterBuffer); SetIndexLabel(1, "Buy Filter"); SetIndexEmptyValue(1, 0.0); SetIndexStyle(2, DRAW_LINE); SetIndexBuffer(2, SellFilterBuffer); SetIndexLabel(2, "Sell Filter"); SetIndexEmptyValue(2, 0.0); SetIndexStyle(3, DRAW_LINE, STYLE_DOT); SetIndexBuffer(3, CrossBounceBuffer); SetIndexLabel(3, "Cross/Bounce"); SetIndexEmptyValue(3, 0.0); //---- indexbegin = Bars - 20; if (indexbegin < 0) indexbegin = 0; if (Symbol() == "EURUSD") filter = 20 * Point + Bid; else filter = 25 * Point + Bid; if (ma_method == MODE_EMA) mastrtype = "EMA"; else mastrtype = "WMA"; if (FilterTradingTime) { beginfiltertime = 6 + TimeZoneOfData; endfiltertime = 17 + TimeZoneOfData; } else { beginfiltertime = 0; endfiltertime = 24; } return(0); } //+------------------------------------------------------------------+ //| Custor indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- TODO: add your code here //---- return(0); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int start() { int i; int counted_bars = IndicatorCounted(); string crossdirstr = ""; //---- check for possible errors if (counted_bars < 0) counted_bars = 0; //---- last counted bar will be recounted if (counted_bars > 0) counted_bars--; if (counted_bars > indexbegin) counted_bars = indexbegin; if (Period() == 30) { double ma20c, ma20p1, ma20p2, diff0, diff1, diff2; for (i = indexbegin-counted_bars; i >= 0; i--) { if ((TimeMinute(Time[i]) == 0) && (TimeHour(Time[i]) - TimeZoneOfData == 0)) dailyopen = Open[i]; DailyOpenBuffer[i] = dailyopen; ma20c = iMA(NULL, PERIOD_M30, 20, 0, ma_method, PRICE_CLOSE, i); ma20p1 = iMA(NULL, PERIOD_M30, 20, 0, ma_method, PRICE_CLOSE, i+1); ma20p2 = iMA(NULL, PERIOD_M30, 20, 0, ma_method, PRICE_CLOSE, i+2); diff0 = iMA(NULL, PERIOD_M30, 5, 0, ma_method, PRICE_CLOSE, i) - ma20c; diff1 = iMA(NULL, PERIOD_M30, 5, 0, ma_method, PRICE_CLOSE, i+1) - ma20p1; diff2 = iMA(NULL, PERIOD_M30, 5, 0, ma_method, PRICE_CLOSE, i+2) - ma20p2; // bull signals: if (diff0 > 0) { if (diff1 < 0) // simple bull cross. { crossdir = true; // determine which bar is closer to the cross: if (MathAbs(diff0) < MathAbs(diff1)) { crosstime = Time[i]; crossamount = ma20c; } else { crosstime = Time[i+1]; crossamount = ma20p1; } } else if (diff1 == 0 && diff2 < 0) // exact cross on last bar. { crossdir = true; crosstime = Time[i+1]; crossamount = ma20p1; } else if (diff1 > 0 && diff2 > diff1 && diff0 >= diff1 && diff1 <= PipsForBounce*Point) // a bounce. { crossdir = true; crosstime = Time[i+1]; crossamount = ma20p1; } } else // bear signals: if (diff0 < 0) { if (diff1 > 0) // simple bear cross. { crossdir = false; // determine which bar is closer to the cross: if (MathAbs(diff0) < MathAbs(diff1)) { crosstime = Time[i]; crossamount = ma20c; } else crosstime = Time[i+1]; crossamount = ma20p1; { } } else if (diff1 == 0 && diff2 > 0) // exact cross on last bar. { crossdir = false; crosstime = Time[i+1]; crossamount = ma20p1; } else if (diff1 < 0 && diff2 < diff1 && diff0 <= diff1 && MathAbs(diff1) <= PipsForBounce*Point) // a bounce. { crossdir = false; crosstime = Time[i+1]; crossamount = ma20p1; } } CrossBounceBuffer[i] = crossamount; if (TimeHour(Time[i]) >= beginfiltertime && TimeHour(Time[i]) <= endfiltertime) { if (crossdir) { BuyFilterBuffer[i] = crossamount + filter + Ask - Bid; SellFilterBuffer[i] = 0; } else { SellFilterBuffer[i] = crossamount - filter; BuyFilterBuffer[i] = 0; } } if (crosstime == Time[i+1] && TimeHour(Time[i+1]) >= beginfiltertime && TimeHour(Time[i+1]) <= endfiltertime) { CrossBounceBuffer[i+1] = crossamount; if (crossdir) BuyFilterBuffer[i+1] = crossamount + filter + Ask - Bid; else SellFilterBuffer[i+1] = crossamount - filter; } } } else if (Period() < 30) { int per30 = 30 / Period(); int j; for (i = indexbegin-counted_bars; i >= 0; i--) { j = (i + per30 - 1)/per30; dailyopen = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 0, j); DailyOpenBuffer[i] = dailyopen; crossamount = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 3, j); CrossBounceBuffer[i] = crossamount; if (CrossBounceBuffer[i+1] != crossamount) crosstime = Time[i]; BuyFilterBuffer[i] = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 1, j); SellFilterBuffer[i] = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 2, j); } crossdir = BuyFilterBuffer[0] != 0.0; } else { dailyopen = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 0, 0); crossamount = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 3, 0); BuyFilterBuffer[0] = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 1, 0); SellFilterBuffer[0] = iCustom(NULL, PERIOD_M30, "Bunnygirl Cross and Daily Open", PipsForBounce, TimeZoneOfData, ma_method, 2, 0); crossdir = BuyFilterBuffer[0] != 0.0; } if (crossdir) crossdirstr = "bull"; else crossdirstr = "bear"; if (crosstime != 0) Comment("Current daily open = ", dailyopen, "\nLast ", mastrtype, " cross/bounce: ", TimeToStr(crosstime), ", ", crossdirstr, " at ", crossamount); else Comment("Current daily open = ", dailyopen, "\nLast ", mastrtype, " cross/bounce: ", crossdirstr, " at ", crossamount); return(0); } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains open time of each bar
Series array that contains open prices of each bar
Indicator Curves created:
Implements a curve of type DRAW_LINE
Indicators Used:
Moving average indicator
Custom Indicators Used:
Order Management characteristics:
Other Features: