//+------------------------------------------------------------------+ //| Bol Band.mq4 | //| Flow | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Flow" #property link "https://www.mql5.com" #property version "1.00" #property strict input int MagicNumber = 9321; input double Lot = 0.1; input double StopLoss = 1000; input double TPRetracement = 0.5; input double TakeProfit = 100; input int BandPeriod = 10; input int BandShift = 0; input double BandDeviation = 2.5; input double BandTriggerBuffer = 50; input bool MultipleOrders = true; input int MagicNumber2 = 9322; input int RetracementActivate = 0; input int MaximumOrders = 5; input double OrderInterval = 500; input double OrderMultiplier = 3; input double OrderIncrementMin = 0.01; input bool LotMultiplier = false; input double LotMultiplierPercent = 1; input double InitialEquity = 10000; input bool EquityKillSwitch = false; input double EquityCutoff = 1700; /*input*/ bool StochasticFilter = false; /*input*/ int StoK = 50; /*input*/ int StoD = 20; /*input*/ int StoSlow = 20; input bool SameSL = false; enum inputOptionsB{ C1 = PERIOD_M1, //1 Minute C2 = PERIOD_M5, //5 Minute C3 = PERIOD_M15, //15 Minute C4 = PERIOD_M30, //30 Minute C5 = PERIOD_H1, //1 Hour C6 = PERIOD_H4, //4 Hours C7 = PERIOD_D1, //1 Day C8 = PERIOD_W1, //1 Week }; input bool HigherBandFilter = false; input inputOptionsB HighTimeframe = C5; input int HighBandPeriod = 10; input int HighBandShift = 0; input double HighBandDeviation = 0.1; input bool TimeFilter = true;//Hourly filter enum inputOptionsA{ B1 = 2, //Long & Short B2 = 1, //Long Only B3 = 3, //Short Only B4 = 0, //None }; input inputOptionsA t00to01 = B1; input inputOptionsA t01to02 = B1; input inputOptionsA t02to03 = B1; input inputOptionsA t03to04 = B1; input inputOptionsA t04to05 = B1; input inputOptionsA t05to06 = B1; input inputOptionsA t06to07 = B1; input inputOptionsA t07to08 = B1; input inputOptionsA t08to09 = B1; input inputOptionsA t09to10 = B1; input inputOptionsA t10to11 = B1; input inputOptionsA t11to12 = B1; input inputOptionsA t12to13 = B1; input inputOptionsA t13to14 = B1; input inputOptionsA t14to15 = B1; input inputOptionsA t15to16 = B1; input inputOptionsA t16to17 = B1; input inputOptionsA t17to18 = B1; input inputOptionsA t18to19 = B1; input inputOptionsA t19to20 = B1; input inputOptionsA t20to21 = B1; input inputOptionsA t21to22 = B1; input inputOptionsA t22to23 = B1; input inputOptionsA t23to00 = B1; input bool DayFilter = true; input inputOptionsA Monday = B1; input inputOptionsA Tuesday = B1; input inputOptionsA Wednesday = B1; input inputOptionsA Thursday = B1; input inputOptionsA Friday = B1; bool StoInd; double StoSignal, StoMain; double Lot1, SL, TP, SubLot1, SubSL, SubTP; double BandUpper, BandMain, BandLower; double counter, counterFinal,counter1, counterFinal1; bool OkaySign, OkaySignBuy, OkaySignSell,NewBar; static int BARS; int MN; double InitPrice, LastPrice, LotHolder, HighBandUpper, HighBandLower; bool CloseBool; int OrderHolder; double SLHolder; //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- InitPrice = 0; LastPrice = 0; CloseBool = false; OrderHolder = 0; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- if(IsNewBar()) { NewBar = true; BandMain = iBands(Symbol(),0,BandPeriod,BandDeviation,BandShift,PRICE_CLOSE,0,1); BandUpper = iBands(Symbol(),0,BandPeriod,BandDeviation,BandShift,PRICE_CLOSE,1,1); BandLower = iBands(Symbol(),0,BandPeriod,BandDeviation,BandShift,PRICE_CLOSE,2,1); StoCheckLong(); BandCheckLong(); StoCheckShort(); BandCheckShort(); for(int a=0; a<=OrdersTotal(); a++) { if(OrderSelect(a,SELECT_BY_POS,MODE_TRADES)) { if (OrderSymbol() == Symbol()&& (OrderMagicNumber()== MagicNumber || OrderMagicNumber() == MagicNumber2)) { counter = counter +1; } if(a+1 == OrdersTotal()) { counterFinal = counter; counter = 0; } } } if(counterFinal == 0) { if(iClose(Symbol(),0,1) > BandUpper + BandTriggerBuffer*SymbolInfoDouble(Symbol(),SYMBOL_POINT) && StoCheckShort()) { if(LotMultiplier == true) {Lot1 = NormalizeDouble(Lot * (1 + LotMultiplierPercent*(AccountEquity()/InitialEquity-1)),2); } else {Lot1 = Lot;} MN = MagicNumber; SL = StopLoss; TP = TakeProfit; makeOrder(OP_SELL); InitPrice = SymbolInfoDouble(Symbol(),SYMBOL_BID); LastPrice = 0; LotHolder = Lot1; } if(iClose(Symbol(),0,1) < BandLower - BandTriggerBuffer*SymbolInfoDouble(Symbol(),SYMBOL_POINT) && StoCheckLong()) { if(LotMultiplier == true) {Lot1 = NormalizeDouble(Lot * (1 + LotMultiplierPercent*(AccountEquity()/InitialEquity-1)),2); } else {Lot1 = Lot;} MN = MagicNumber; SL = StopLoss; TP = TakeProfit; makeOrder(OP_BUY); InitPrice = SymbolInfoDouble(Symbol(),SYMBOL_ASK); LastPrice = 0; LotHolder = Lot1; } } SymbolInfoDouble("EURUSD",SYMBOL_BID); } for(int c=0; c<=OrdersTotal(); c++) { if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol()&& (OrderMagicNumber()== MagicNumber || OrderMagicNumber() == MagicNumber2)) { counter1 = counter1 +1; } if(c+1 == OrdersTotal()) { counterFinal1 = counter1; counter1 = 0; } } } if(MultipleOrders == true) { for(int b=0; b<=OrdersTotal(); b++) { if(OrderSelect(b,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol()&&OrderMagicNumber()== MagicNumber) { if(OrderLots() == LotHolder) { if(OrderProfit() < (-1)*OrderLots()*OrderInterval*counterFinal1 && counterFinal1>0) { if(OrderType() == OP_BUY) {OkaySignBuy = true;} if(OrderType() == OP_SELL) {OkaySignSell = true;} OkaySign = true; SLHolder = OrderStopLoss(); } } SubLot1 = OrderLots(); SubTP = OrderTakeProfit(); SubSL = OrderStopLoss(); } if(b+1 == OrdersTotal()) { if(counterFinal1 < MaximumOrders && OkaySign == true) { if(OkaySignBuy == true) {if(LotMultiplier == true){Lot1 = NormalizeDouble(MathMax(SubLot1 + OrderIncrementMin,Lot*MathPow(OrderMultiplier,counterFinal1)* (1 + LotMultiplierPercent*(AccountEquity()/InitialEquity-1))),2);} else {Lot1 = NormalizeDouble(MathMax(SubLot1 + OrderIncrementMin,Lot*MathPow(OrderMultiplier,counterFinal1)),2);} MN = MagicNumber2; TP = NormalizeDouble((SubTP-SymbolInfoDouble(Symbol(),SYMBOL_ASK))*(1/SymbolInfoDouble(Symbol(),SYMBOL_POINT)),0); if(SameSL == true) {SL = NormalizeDouble((SymbolInfoDouble(Symbol(),SYMBOL_ASK)-SLHolder)*(1/SymbolInfoDouble(Symbol(),SYMBOL_POINT)),0);} else {SL = StopLoss;} makeOrder(OP_BUY);} if(OkaySignSell == true) {if(LotMultiplier == true) {Lot1 = NormalizeDouble(MathMax(SubLot1 + OrderIncrementMin,Lot*MathPow(OrderMultiplier,counterFinal1)* (1 + LotMultiplierPercent*(AccountEquity()/InitialEquity-1))),2);} else {Lot1 = NormalizeDouble(MathMax(SubLot1 + OrderIncrementMin,Lot*MathPow(OrderMultiplier,counterFinal1)),2);} MN = MagicNumber2; TP = NormalizeDouble((SymbolInfoDouble(Symbol(),SYMBOL_BID)-SubTP)*(1/SymbolInfoDouble(Symbol(),SYMBOL_POINT)),0); if(SameSL == true) {SL = NormalizeDouble((SLHolder-SymbolInfoDouble(Symbol(),SYMBOL_BID))*(1/SymbolInfoDouble(Symbol(),SYMBOL_POINT)),0);} else {SL = StopLoss;} makeOrder(OP_SELL);} OkaySign = false; OkaySignBuy = false; OkaySignSell = false; } } if(OrderSymbol() == Symbol()&&OrderMagicNumber()== MagicNumber2) { if(counterFinal1 > 1) { if(OrderType() == OP_BUY) {LastPrice = OrderOpenPrice();} if(OrderType() == OP_SELL) {LastPrice = OrderOpenPrice();} } } } } if(counterFinal1 >= RetracementActivate) { for(int c=0; c<=OrdersTotal(); c++) { if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol()&&(OrderMagicNumber()== MagicNumber || OrderMagicNumber() == MagicNumber2)) { if(OrderType() == OP_BUY) { if(SymbolInfoDouble(Symbol(),SYMBOL_BID) > (LastPrice + TPRetracement*(InitPrice - LastPrice)) && LastPrice > 0) { CloseBool = true; } } if(OrderType() == OP_SELL) { if(SymbolInfoDouble(Symbol(),SYMBOL_ASK) < (LastPrice - TPRetracement*(LastPrice - InitPrice)) && LastPrice > 0) { CloseBool = true; } } } } } if(CloseBool == true) {OrderHolder = OrdersTotal(); for(int d=OrderHolder; d>=0; d--) { if(OrderSelect(d,SELECT_BY_POS,MODE_TRADES)) { if(OrderSymbol() == Symbol()&&(OrderMagicNumber()== MagicNumber || OrderMagicNumber() == MagicNumber2)) { if(OrderType() == OP_BUY) { OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(Symbol(),SYMBOL_BID),999,Red); } if(OrderType() == OP_SELL) { OrderClose(OrderTicket(),OrderLots(),SymbolInfoDouble(Symbol(),SYMBOL_ASK),999,Red); } } } } } } } if(NewBar == true) { //Print(Symbol() + " counterFinal1 " + counterFinal1 + " counterfinal " + counterFinal + " InitPrice " + InitPrice + " LastPrice " + LastPrice + " LotHolder " + LotHolder); NewBar = false; } CloseBool = false; counterFinal = 0; counterFinal1 = 0; OkaySign = false; OkaySignBuy = false; OkaySignSell = false; OrderHolder = 0; SubLot1 = 0; SubSL = 0; SubTP = 0;SLHolder = 0; } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- } //+------------------------------------------------------------------+ void makeOrder(int ORDER) { Print("Lot1 " + Lot1 + " counterFinal1 " + counterFinal1 + " counterfinal " + counterFinal + " InitPrice " + InitPrice + " LastPrice " + LastPrice + " LotHolder " + LotHolder + " Okay Buy " + OkaySignBuy + " Okay Sell " + OkaySignSell); if(ORDER==OP_BUY && gooddayLong() == true && goodtimeLong() == true && EquityCheck()) { if(BandCheckLong() == true) { bool res=OrderSend(Symbol(),OP_BUY,Lot1,Ask,5, Ask-SL*Point(), Ask+TP*Point(), "Buy Order",MN,0,Green); if(!res) Print("Error in OrderModify. Error code = ",GetLastError()); else Print("Buy Opened"); } } else if(ORDER==OP_SELL && gooddayShort() == true && goodtimeShort() == true && EquityCheck()) { if(BandCheckShort() == true) { bool res=OrderSend(Symbol(),OP_SELL,Lot1,Bid,5, Bid+SL*Point(), Bid-TP*Point(), "Sell Order",MN,0,Green); if(!res) Print("Error in OrderModify. Error code = ",GetLastError()); else Print("Sell Opened"); } } else { Print("Error Occured in order()"); } } bool IsNewBar() { if(BARS!=iBars(NULL,0)) { BARS=iBars(NULL,0); return(true); } return(false); } bool goodtimeShort() { datetime Today = StrToTime(StringConcatenate(Year(), ".", Month(), ".", Day())); int weekday=TimeDayOfWeek(Today); if( (weekday ==5 && Hour() ==23) || (weekday==1 && Hour() == 0) || weekday ==0 || weekday == 6) { return false; } else if(TimeFilter == true){ if((Hour()==0 && t00to01<2) || (Hour()==1 && t01to02<2) || (Hour()==2 && t02to03<2) || (Hour()==3 && t03to04<2) || (Hour()==4 && t04to05<2) || (Hour()==5 && t05to06<2) || (Hour()==6 && t06to07<2) || (Hour()==7 && t07to08<2) || (Hour()==8 && t08to09<2) || (Hour()==9 && t09to10<2) || (Hour()==10 && t10to11<2) || (Hour()==11 && t11to12<2) || (Hour()==12 && t12to13<2) || (Hour()==13 && t13to14<2) || (Hour()==14 && t14to15<2) || (Hour()==15 && t15to16<2) || (Hour()==16 && t16to17<2) || (Hour()==17 && t17to18<2) || (Hour()==18 && t18to19<2) || (Hour()==19 && t19to20<2) || (Hour()==20 && t20to21<2) || (Hour()==21 && t21to22<2) || (Hour()==22 && t22to23<2) || (Hour()==23 && t23to00<2) ) { return false; } else return true; } else return true; } bool goodtimeLong() { datetime Today = StrToTime(StringConcatenate(Year(), ".", Month(), ".", Day())); int weekday=TimeDayOfWeek(Today); if( (weekday ==5 && Hour() ==23) || (weekday==1 && Hour() == 0) || weekday ==0 || weekday == 6) { return false; } else if(TimeFilter == true){ if((Hour()==0 && (t00to01==0 || t00to01 ==3)) || (Hour()==1 && (t01to02==0 || t01to02 ==3)) || (Hour()==2 && (t02to03==0 || t02to03 ==3)) || (Hour()==3 && (t03to04==0 || t03to04 ==3)) || (Hour()==4 && (t04to05==0 || t04to05 ==3)) || (Hour()==5 && (t05to06==0 || t05to06 ==3)) || (Hour()==6 && (t06to07==0 || t06to07 ==3)) || (Hour()==7 && (t07to08==0 || t07to08 ==3)) || (Hour()==8 && (t08to09==0 || t08to09 ==3)) || (Hour()==9 && (t09to10==0 || t09to10 ==3)) || (Hour()==10 && (t10to11==0 || t10to11 ==3)) || (Hour()==11 && (t11to12==0 || t11to12 ==3)) || (Hour()==12 && (t12to13==0 || t12to13 ==3)) || (Hour()==13 && (t13to14==0 || t13to14 ==3)) || (Hour()==14 && (t14to15==0 || t14to15 ==3)) || (Hour()==15 && (t15to16==0 || t15to16 ==3)) || (Hour()==16 && (t16to17==0 || t16to17 ==3)) || (Hour()==17 && (t17to18==0 || t17to18 ==3)) || (Hour()==18 && (t18to19==0 || t18to19 ==3)) || (Hour()==19 && (t19to20==0 || t19to20 ==3)) || (Hour()==20 && (t20to21==0 || t20to21 ==3)) || (Hour()==21 && (t21to22==0 || t21to22 ==3)) || (Hour()==22 && (t22to23==0 || t22to23 ==3)) || (Hour()==23 && (t23to00==0 || t23to00 ==3)) ) { return false; } else return true; } else return true; } bool gooddayLong() { if(DayFilter == true) { if( (DayOfWeek() == 1 && (Monday == 3 || Monday == 0)) || (DayOfWeek() == 2 && (Tuesday == 3 || Tuesday == 0)) || (DayOfWeek() == 3 && (Wednesday == 3 || Wednesday == 0)) || (DayOfWeek() == 4 && (Thursday == 3 || Thursday == 0)) || (DayOfWeek() == 5 && (Friday == 3 || Friday == 0)) ) {return false;} else {return true;} } else {return true;} } bool gooddayShort() { if(DayFilter == true) { if( (DayOfWeek() == 1 && (Monday == 1 || Monday == 0)) || (DayOfWeek() == 2 && (Tuesday == 1 || Tuesday == 0)) || (DayOfWeek() == 3 && (Wednesday == 1 || Wednesday == 0)) || (DayOfWeek() == 4 && (Thursday == 1 || Thursday == 0)) || (DayOfWeek() == 5 && (Friday == 1 || Friday == 0)) ) {return false;} else {return true;} } else {return true;} } bool StoCheckLong() { StoMain = iStochastic(Symbol(),0,StoK,StoD,StoSlow,MODE_SMA,0,0,1); StoSignal = iStochastic(Symbol(),0,StoK,StoD,StoSlow,MODE_SMA,0,1,1); if(StochasticFilter == true) { if(StoMain >= StoSignal) {return true;} else{return false;} } else {return true;} } bool StoCheckShort() { StoMain = iStochastic(Symbol(),0,StoK,StoD,StoSlow,MODE_SMA,0,0,1); StoSignal = iStochastic(Symbol(),0,StoK,StoD,StoSlow,MODE_SMA,0,1,1); if(StochasticFilter == true) { if(StoMain < StoSignal) {return true;} else{return false;} } else {return true;} } bool BandCheckLong() { HighBandUpper = iBands(Symbol(),HighTimeframe,HighBandPeriod,HighBandDeviation,HighBandShift,PRICE_CLOSE,1,1); HighBandLower = iBands(Symbol(),HighTimeframe,HighBandPeriod,HighBandDeviation,HighBandShift,PRICE_CLOSE,2,1); if(HigherBandFilter == true) { if(iClose(Symbol(),HighTimeframe,1) < HighBandLower) { return true; } else return false; } else return true; } bool BandCheckShort() { HighBandUpper = iBands(Symbol(),HighTimeframe,HighBandPeriod,HighBandDeviation,HighBandShift,PRICE_CLOSE,1,1); HighBandLower = iBands(Symbol(),HighTimeframe,HighBandPeriod,HighBandDeviation,HighBandShift,PRICE_CLOSE,2,1); if(HigherBandFilter == true) { if(iClose(Symbol(),HighTimeframe,1) > HighBandUpper) { return true; } else return false; } else return true; } bool EquityCheck() { if(EquityKillSwitch == true) { if(AccountEquity() > EquityCutoff) { return true; } else return false; } else return true; }