//+------------------------------------------------------------------+
//|                                                   UpDownOpen.mq4 |
//|                                                            Roger |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Roger"
#property link      ""
//This EA opens Buy and Sell orders when Bid price crosses one of the line.
//When you launch EA and allow it to trade, you will see two line in the chart - yellow and red.
//Yellow - is a buy line, red - sell line.
//You can mark these lines (double click)and move as you want, up or down of price, any angle. 
//When Bid price crosses or touches yellow line to any direction (up or down), Buy orders will be opened.
//When red line - Sell order.
//When order is opened, lines will resign to avoid dubbed opening, and you will see Labels "Old lines" to remind you.
//If TrailingStop is not zero it will be working.
//For the new coridor you have to launch EA again.
//---- input parameters
extern double    Lots=0.1;
extern int       Stop=50;
extern int       Take=50;
extern int       TrailingStop=15; 
double openprice;
int slip;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
if(ObjectFind("Up1")!=-1) ObjectDelete("Up1");  //delete old lines
if(ObjectFind("Down1")!=-1) ObjectDelete("Down1");  
if(ObjectFind("Text1")!=-1) ObjectDelete("Text1");  //and labels
if(ObjectFind("Text2")!=-1) ObjectDelete("Text2");  
if(MarketInfo(Symbol(),MODE_DIGITS)==3||MarketInfo(Symbol(),MODE_DIGITS)==5)slip=50; else slip=5;
ObjectCreate("Down",OBJ_TREND,0,TimeCurrent()-3600*Period(),Bid-3*slip*Point,TimeCurrent()-20*Period(),Bid-3*slip*Point);  //create new
ObjectSet("Down",OBJPROP_COLOR,Red);
ObjectCreate("Up",OBJ_TREND,0,TimeCurrent()-3600*Period(),Bid+3*slip*Point,TimeCurrent()-20*Period(),Bid+3*slip*Point);   
ObjectSet("Up",OBJPROP_COLOR,Yellow);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
 ObjectDelete("Up");  //delete everything
 ObjectDelete("Down");  
 ObjectDelete("Up1");  
 ObjectDelete("Down1");  
 ObjectDelete("Text1");  
 ObjectDelete("Text2");  
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int i,x;
   if(OrdersTotal()>0)//check opened orders
      {
      for(i=0;i<OrdersTotal();i++)
         {
         RefreshRates();
         if(TrailingStop>0)//if trailingstop works
            {
            if(OrderSymbol()==Symbol()&&OrderType()==0&&Bid-OrderOpenPrice()>TrailingStop*Point&&Bid-OrderStopLoss()>TrailingStop*Point)
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE))
            Print("ErrorModifyBuy - ",GetLastError());            
            if(OrderSymbol()==Symbol()&&OrderType()==1&&OrderOpenPrice()-Ask>TrailingStop*Point&&(OrderStopLoss()-Ask>TrailingStop*Point||OrderStopLoss()==0))
            if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE))
            Print("ErrorModifySell - ",GetLastError());            
            }
         if(OrderSymbol()==Symbol())x++;//only one order for one pair
         }
       } 
   if(x==0)//no order for this pair
      {
      if(ObjectFind("Up")!=-1)//calculate coordinates Up line
         {
         double resist_price1=ObjectGet("Up",OBJPROP_PRICE1);
         double resist_price2=ObjectGet("Up",OBJPROP_PRICE2);
         int resist_time1=ObjectGet("Up",OBJPROP_TIME1);
         int resist_time2=ObjectGet("Down",OBJPROP_TIME2);
         //Print("time - ",resist_time1," ",TimeToStr(resist_time1,TIME_DATE|TIME_MINUTES)," ",resist_time2," ",TimeToStr(resist_time2,TIME_DATE|TIME_MINUTES));
         int resist_bar1=iBarShift(Symbol(),0,resist_time1);
         int resist_bar2=iBarShift(Symbol(),0,resist_time2);
         //Print(resist_bar1," ",resist_bar2);
         double resist_price=resist_price2-(resist_price1-resist_price2)*resist_bar2/(resist_bar1-resist_bar2);
         double resist_price_1=resist_price2+(resist_price1-resist_price2)*(1-resist_bar2)/(resist_bar1-resist_bar2);
         }
      if(ObjectFind("Down")!=-1)//and Down line
         {
         double Down_price1=ObjectGet("Down",OBJPROP_PRICE1);
         double Down_price2=ObjectGet("Down",OBJPROP_PRICE2);
         int Down_time1=ObjectGet("Down",OBJPROP_TIME1);
         int Down_time2=ObjectGet("Down",OBJPROP_TIME2);
         int Down_bar1=iBarShift(Symbol(),0,Down_time1);
         int Down_bar2=iBarShift(Symbol(),0,Down_time2);
         //Print(Down_bar1,Down_bar2);
         double Down_price=Down_price2-(Down_price1-Down_price2)*Down_bar2/(Down_bar1-Down_bar2);
         double Down_price_1=Down_price2+(Down_price1-Down_price2)*(1-Down_bar2)/(Down_bar1-Down_bar2);
         }
      //Comment("Close1 - ",DoubleToStr(Close[1],Digits)," Bid - ",DoubleToStr(Bid,Digits)," Up1 - ",DoubleToStr(resist_price_1,Digits)," Up - ",DoubleToStr(resist_price,Digits));
      if(((Close[1]<resist_price_1&&Bid>=resist_price)||(Close[1]>resist_price_1&&Bid<=resist_price))&&openprice==0)//if Bid line crosses Up line
         {
         Print("PriceBuy - ",Ask," Stop - ",Bid-Point*Stop," Take - ",Bid+Point*Take);         
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,slip,Bid-Point*Stop,Ask+Point*Take,"",0,0,CLR_NONE)==-1)Print("ErrorSell - ",GetLastError());
         else 
            {
            x=1;openprice=Ask;
            ObjectCreate("Down1",OBJ_TREND,0,Down_time1,Down_price1,Down_time2,Down_price2);  //resign lines
            ObjectSet("Down1",OBJPROP_COLOR,Red);
            ObjectCreate("Up1",OBJ_TREND,0,resist_time1,resist_price1,resist_time2,resist_price2);   
            ObjectSet("Up1",OBJPROP_COLOR,Yellow);
            ObjectDelete("Up"); //Delete old
            ObjectDelete("Down");              
            ObjectCreate("Text1",OBJ_TEXT,0,Time[0]+Period()*300,Down_price2);//create labels
            ObjectCreate("Text2",OBJ_TEXT,0,Time[0]+Period()*300,resist_price2);
            ObjectSetText("Text1","Old Line ! ! !",10,"Arial",White);
            ObjectSetText("Text2","Old Line ! ! !",10,"Arial",White);
            }
         }
      if(((Close[1]>Down_price_1&&Bid<=Down_price)||(Close[1]<Down_price_1&&Bid>=Down_price))&&openprice==0)// if Bid line crosses Down line
      
         {
         Print("PriceSell - ",Bid," Stop - ",Ask+Point*Stop," Take - ",Ask-Point*Take);
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,slip,Ask+Point*Stop,Ask-Point*Take,"",0,0,CLR_NONE)==-1)Print("ErrorSell - ",GetLastError());
         else 
            {
            x=1;openprice=Bid;
            ObjectCreate("Down1",OBJ_TREND,0,Down_time1,Down_price1,Down_time2,Down_price2);   
            ObjectSet("Down1",OBJPROP_COLOR,Red);
            ObjectCreate("Up1",OBJ_TREND,0,resist_time1,resist_price1,resist_time2,resist_price1);   
            ObjectSet("Up1",OBJPROP_COLOR,Yellow);
            ObjectDelete("Up");  
            ObjectDelete("Down");              
            ObjectCreate("Text1",OBJ_TEXT,0,Time[0]+Period()*300,Down_price2);
            ObjectCreate("Text2",OBJ_TEXT,0,Time[0]+Period()*300,resist_price2);
            ObjectSetText("Text1","Old Line ! ! !",10,"Arial",White);
            ObjectSetText("Text2","Old Line ! ! !",10,"Arial",White);
            }
         }
      }     
//----
   return(0);
  }
//+------------------------------------------------------------------+