//+------------------------------------------------------------------+ //| Bollinger bands.mq4 | //| Copyright © 2008, Eugene Taranov | //| email: etaranov@live.com | //+------------------------------------------------------------------+ #property copyright "Copyright © 2008, Eugene Taranov, etaranov@live.com" #property show_confirm #define magic 578443 //+------------------------------------------------------------------+ //| Extern variables | //+------------------------------------------------------------------+ extern int bb_period = 150; //BollingerBands period extern int dev = 3; //BollingerBands deviatiion extern int h1 = 10; //set level 1 extern int h2 = 50; //set level 2 extern int h3 = 50; //set level 3 extern double delta = 60; //level_h3 - bb_main extern double delta_h = 150; //level_h3 - bb_main high vol extern int time = 15; //+------------------------------------------------------------------+ //| script program start function | //+------------------------------------------------------------------+ int start() { //------------------------------variables----------------------------+ int orders = OrdersTotal (); //the number of orders int bb_shift = 0; //BollingerBands shift int app_price = 4; //BollingerBands applied price int type; //flag market/put off double price = Bid; //getting Bid double spread = Ask-Bid; //get spread int error; //Getlasterror variable bool setorder; //set new order int ticket; //order number double mlot; //market order size bool closedmarket; //market order is closed //--------------------------------check------------------------------+ if (orders > 1) { Alert("There are too many orders, ", orders); return; } //------------------------------getordertype-------------------------+ if (OrderSelect(0,SELECT_BY_POS)==true && OrderMagicNumber()==magic) { if (OrderType()==OP_BUY || OrderType()==OP_SELL) type = 1; //there is a market order else type = 0; //there is a put off order } //------------------------------getBBlines---------------------------+ double bb_main = iBands(NULL,0,bb_period,dev,bb_shift,app_price,0,0); double bb_high = iBands(NULL,0,bb_period,dev,bb_shift,app_price,1,0); double bb_low = iBands(NULL,0,bb_period,dev,bb_shift,app_price,2,0); double level_h1 = (bb_high - bb_main)*0.01*h1+bb_main; double level_h2 = (bb_high - bb_main)*0.01*h2+bb_main; double level_h3 = (bb_high - bb_main)*0.01*h3+bb_main; double level_l1 = bb_main-((bb_main - bb_low)*0.01*h1); double level_l2 = bb_main-((bb_main - bb_low)*0.01*h2); double level_l3 = bb_main-((bb_main - bb_low)*0.01*h3); //+----------------------------CloseOrder----------------------------+ if (OrderSelect(0,SELECT_BY_POS)==true) { datetime timecur = TimeCurrent(); datetime optime = OrderOpenTime(); if (OrderType()==OP_BUY && OrderMagicNumber()==magic) { if ((timecur-optime)>time*3600) { ticket = OrderTicket(); mlot = OrderLots(); closedmarket = OrderClose(ticket,mlot,Bid,0); if (closedmarket == true) Alert("Buy order ",ticket," has been closed by the time"); else Alert("Could not be closed: ",GetLastError()); } } if (OrderType()==OP_SELL && OrderMagicNumber()==magic) { if ((timecur-optime)>time*3600) { ticket = OrderTicket(); mlot = OrderLots(); closedmarket = OrderClose(ticket,mlot,Ask,0); if (closedmarket == true) Alert("Sell order ",ticket," has been closed by the time"); else Alert("Could not be closed: ",GetLastError()); } } } //-----------------------------modifyorder---------------------------+ if (type == 1 && ((Bid=(level_h3-0.002)) || (Bid>level_l3 && Bid<=(level_l3+0.002)))) { if (OrderSelect(0,SELECT_BY_POS)==true) { if (OrderType()==OP_BUY && OrderMagicNumber()==magic) //modify buy order { ticket = OrderTicket(); OrderModify(ticket,OrderOpenPrice(),level_l2,level_h3,0); Alert("Order ", ticket," has been modified"); } else Alert(GetLastError()); if (OrderType()==OP_SELL && OrderMagicNumber()==magic) //modify sell order { ticket = OrderTicket(); OrderModify(ticket,OrderOpenPrice(),level_h2+spread,level_l3+spread,0); Alert("Order ", ticket," has been modified"); } else Alert(GetLastError()); } else Alert ("Cannot select order to modify, error: ", GetLastError()); } else Alert ("No need to modify"); //-------------------------------setorder----------------------------+ RefreshRates(); if (((level_h3-bb_main)>delta*Point)==true && (level_h3-bb_main)(level_h1+spread) && iHigh(NULL,0,2) < level_h1 && iHigh(NULL,0,1)0) Alert("Set buy order #",setorder); else Alert(GetLastError()); if (price < level_l1 && iLow(NULL,0,2) > level_l1 && iLow(NULL,0,1) > level_l1) setorder = OrderSend (Symbol(),OP_SELL,0.01,price,1,level_h2,level_l3,NULL,magic,0); if (setorder>0) Alert("Set sell order #",setorder); else Alert(GetLastError()); } else { Alert("Too calm market ",level_h3-bb_main); return; } //-------------------------------------------------------------------+ return(0); } //+------------------------------------------------------------------+