//+------------------------------------------------------------------+ //| BolBands.mq5 | //| Copyright 2010, AM2. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2010, AM2." #property link "http://www.mql5.com" #property version "1.05" //--- input parameters input int bands_period= 20; // Bollinger Bands period input int dema_period= 20; // DEMA period input int bands_shift = 0; // Bollinger Bands shift input double deviation= 2; // Standard deviation input double Lot=0.5; // Lots to trade //--- global variables int BolBandsHandle; // Bolinger Bands handle int demaHandle; // DEMA handle double BBUp[],BBLow[],BBMidle[]; // dynamic arrays for numerical values of Bollinger Bands double demaVal[]; // dynamic array for numerical values of Moving Average //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Do we have sufficient bars to work if(Bars(_Symbol,_Period)<60) // total number of bars is less than 60? { Alert("We have less than 60 bars on the chart, an Expert Advisor terminated!!"); return(-1); } //--- get handle of the Bollinger Bands and DEMA indicators BolBandsHandle=iBands(NULL,PERIOD_M30,bands_period,bands_shift,deviation,PRICE_CLOSE); demaHandle=iDEMA(NULL,PERIOD_D1,dema_period,0,PRICE_CLOSE); //--- Check for Invalid Handle if((BolBandsHandle<0) || (demaHandle<0)) { Alert("Error in creation of indicators - error: ",GetLastError(),"!!"); return(-1); } return(0); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- Release indicator handles IndicatorRelease(BolBandsHandle); IndicatorRelease(demaHandle); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { // We will use the static Old_Time variable to serve the bar time. // At each OnTick execution we will check the current bar time with the saved one. // If the bar time isn't equal to the saved time, it indicates that we have a new tick. static datetime Old_Time; datetime New_Time[1]; bool IsNewBar=false; // copying the last bar time to the element New_Time[0] int copied=CopyTime(_Symbol,_Period,0,1,New_Time); if(copied>0) // ok, the data has been copied successfully { if(Old_Time!=New_Time[0]) // if old time isn't equal to new bar time { IsNewBar=true; // if it isn't a first call, the new bar has appeared if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("We have new bar here ",New_Time[0]," old time was ",Old_Time); Old_Time=New_Time[0]; // saving bar time } } else { Alert("Error in copying historical times data, error =",GetLastError()); ResetLastError(); return; } //--- EA should only check for new trade if we have a new bar if(IsNewBar==false) { return; } //--- Do we have enough bars to work with int Mybars=Bars(_Symbol,_Period); if(Mybars<60) // if total bars is less than 60 bars { Alert("We have less than 60 bars, EA will now exit!!"); return; } //--- Define some MQL5 Structures we will use for our trade MqlTradeRequest mrequest; // To be used for sending our trade requests MqlTradeResult mresult; // To be used to get our trade results MqlRates mrate[]; // To be used to store the prices, volumes and spread of each bar /* Let's make sure our arrays values for the Rates and Indicators is stored serially similar to the timeseries array */ // the rates arrays ArraySetAsSeries(mrate,true); ArraySetAsSeries(demaVal,true); // the indicator arrays ArraySetAsSeries(BBUp,true); ArraySetAsSeries(BBLow,true); ArraySetAsSeries(BBMidle,true); //--- Get the details of the latest 3 bars if(CopyRates(_Symbol,_Period,0,3,mrate)<0) { Alert("Error copying rates/history data - error:",GetLastError(),"!!"); return; } //--- Copy the new values of our indicators to buffers (arrays) using the handle if(CopyBuffer(BolBandsHandle,0,0,3,BBMidle)<0 || CopyBuffer(BolBandsHandle,1,0,3,BBUp)<0 || CopyBuffer(BolBandsHandle,2,0,3,BBLow)<0) { Alert("Error copying Bollinger Bands indicator Buffers - error:",GetLastError(),"!!"); return; } if(CopyBuffer(demaHandle,0,0,3,demaVal)<0) { Alert("Error copying DEMA indicator buffer - error:",GetLastError()); return; } double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // Ask price double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // Bid price //--- Declare bool type variables to hold our Buy and Sell Conditions bool Buy_Condition =(mrate[1].close > BBLow[1] && mrate[1].open < BBLow[1] && // White (bull) candle crossed the Lower Band from below to above demaVal[0]>demaVal[1] && demaVal[1]>demaVal[2]); // and DEMA is growing up bool Sell_Condition = (mrate[1].close < BBUp[1] && mrate[1].open > BBUp[1] && // Black (bear) candle crossed the Upper Band from above to below demaVal[0]BBUp[1]); // Black candle crossed the Upper Band from above to below bool Sell_Close=(mrate[1].close>BBLow[1] && mrate[1].open