Trendline Trading

Created at 20 Jun 2016, 12:27
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
BE

bernard.boshoff

Joined 20.06.2016

Trendline Trading
20 Jun 2016, 12:27


Hi There,

 

I would love the ability to have cTrader execute an order when price either touches or closes over a trend line...

I have a MT4 EA that I am currently using for this exact function and was wondering if this is something that you would possibly build into the software...

Code for EA below

//+------------------------------------------------------------------+
//|                                                 TrendLine_EA.mq4 |
//|                                                           oromek |
//|                                                oromeks@gmail.com |
//+------------------------------------------------------------------+
#property copyright "oromek"
#property link      "oromeks@gmail.com"

#include <stderror.mqh>
#include <stdlib.mqh>

extern string  BuyTouchDescription="tbuy-";
extern string  SellTouchDescription="tsell-";
extern string  BuyCrossDescription="cbuy-";
extern string  SellCrossDescription="csell-";

extern string  CloseTouchDescription="tclose-";
extern string  CloseCrossDescription="cclose-";
extern string  PermanentCloseTouchDescription="ptclose-";
extern string  PermanentCloseCrossDescription="pcclose-";
extern string  TicketCloseTouchDescription="tic-tclose-";
extern string  TicketCloseCrossDescription="tic-cclose-";

extern string  AddTouchBuyDescription="atbuy-";
extern string  AddCrossBuyDescription="acbuy-";
extern string  AddTouchSellDescription="atsell-";
extern string  AddCrossSellDescription="acsell-";

extern string  RO="----Rectangle Options----";
extern double  RectangleTradeSize=1;
extern bool    RectangleHedgeOn=true;
extern string  TradeMode_Help="0-time delay,1-candle close,2-immediate entry";
extern int     TradeMode=0;
//extern bool    TradeAfterCandleClose=false;
//extern bool    ImmediateEntryOn=false;
extern int     ImmediateEntryBuffer=10;
extern int     TimeWaitSeconds=60;
extern int     NumberOfHedgeTrades=2;
extern string  PermanentBuyDescription="pbuy-";
extern string  PermanentSellDescription="psell-";
extern string  PermanentBuySellDescription="pbs-";

extern bool    UsePipsProfit=false;
extern int     PipsProfit=0;
extern bool    ProfitOnFirstTrade=false;

extern int     TakeProfit=0;
extern int     StopLoss=0;

extern string  BO="----BreakEven Options----";
extern bool    BreakEvenOn=false;
extern bool    BEAfterFirstCandleOn=false;
extern int     MoveSLToBEAfter=10;
extern double  MaxSlippage=3;

extern string  TS="----Text Settings----";
extern bool    DisplayStatistics=true;
extern int     X         = 63;
extern int     Y         = 40;
extern int     Corner    = 1;
extern color   TextColor=White;

int currBars, currBars1, currBars2, currBars3, currBars4, mp, ticket, err;
double price_0, selectedLot;

double lValue_1, lValue_2, closeLot;
string name;
int sellNameLength, buyNameLength, closeNameLength, permanentSellNameLength, permanentBuyNameLength, permanentBuySellNameLength;
int pcloseNameLength, addTouchBuyNameLength, addCrossBuyNameLength, addTouchSellNameLength, addCrossSellNameLength;
int ticCloseNameLength, ticTouchNameLength;

int trades, bstrades, candleCount, btrades, strades;
bool bTopLong, bTopShort, bBottomShort, bBottomLong;
bool buyTopTradeOpen, sellTopTradeOpen, sellBottomTradeOpen, buyBottomTradeOpen;
bool buyTopOpenAllow, sellTopOpenAllow, sellBottomOpenAllow, buyBottomOpenAllow;
datetime timeTopLong, timeTopShort, timeBottomShort, timeBottomLong;

bool pbuyBuySellLineAllow, psellBuySellLineAllow;//, pSellLineAllow;
bool buyBuySellLineTradeOpen, sellBuySellLineTradeOpen;
bool bBuySellLineLong, bBuySellLineShort;
bool pbuyBuySellMode, psellBuySellMode;
datetime timeBuySellLineLong, timeBuySellLineShort;

bool Buy_Condition_2, Sell_Condition_2, BESet;
double pBuySellLevel, pBuySellLevel_1, pBuySellLevel_2, ptradeSize;
string pbsLineName, pbsLineDesc;

double pbuyLineLevel, pbuyLineLevel_1, pbuyLineLevel_2, pbuyTradeLineSize;
string pbLineName, pbLineDesc;
bool buyBuyLineTradeOpen, bBuyLineLong, bBuyLineShort;
double pBuyLevel, pBuyLevel_1, pBuyLevel_2;
datetime timeBuyLineLong, timeBuyLineShort;

double psellLineLevel, psellLineLevel_1, psellLineLevel_2, psellTradeLineSize;
string psLineName, psLineDesc;
double pSellLevel, pSellLevel_1, pSellLevel_2;
bool sellSellLineTradeOpen, bSellLineLong, bSellLineShort;
datetime timeSellLineShort, timeSellLineLong;

bool buysellLineAllow, buyLineAllow, sellLineAllow;

datetime EAStartTime;

int OrdersHistoryTotal_0;
double totalProfit, totalLoss;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
   if (Digits==5 || Digits==3) mp=10;
   else mp=1;
   
   pbuyBuySellLineAllow=true;
   psellBuySellLineAllow=true;
   
   if (UsePipsProfit) EAStartTime=TimeCurrent();
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
   ObjectDelete("pSL_txt");
   ObjectDelete("nSL_txt");
   
   ObjectDelete("totp_lab");
   ObjectDelete("totl_lab");
   ObjectDelete("BEd_lab");
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   bool closeAll=false;
   
   //open and close orders after cross
   if (currBars!=Bars)
   {
      double BuyCrossPrice, SellCrossPrice;
   
      for(int i=0;i<ObjectsTotal();i++)
      {
         name=ObjectName(i);
         sellNameLength=StringLen(SellCrossDescription);
         buyNameLength=StringLen(BuyCrossDescription);
         closeNameLength=StringLen(CloseCrossDescription);
         pcloseNameLength=StringLen(PermanentCloseCrossDescription);
         ticCloseNameLength = StringLen(TicketCloseCrossDescription);
         addCrossBuyNameLength=StringLen(AddCrossBuyDescription);
         addCrossSellNameLength=StringLen(AddCrossSellDescription);
         
         bool ticket_closing = false;
         int tic;
         //closing trades
         if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && tradeCount()>0 && 
               (StringSubstr(ObjectDescription(name),0,closeNameLength)==CloseCrossDescription || StringSubstr(ObjectDescription(name),0,pcloseNameLength)==PermanentCloseCrossDescription ||
                  StringSubstr(ObjectDescription(name),0,ticCloseNameLength)==TicketCloseCrossDescription))
         {
            if (StringSubstr(ObjectDescription(name),0,ticCloseNameLength)==TicketCloseCrossDescription){
               ticket_closing = true;
               tic = StrToInteger(StringSubstr(ObjectDescription(name),ticCloseNameLength,0));
            }
            double closeCrossPrice;
            if (ObjectType(name)==OBJ_HLINE) closeCrossPrice=ObjectGet(name,OBJPROP_PRICE1);
            if (ObjectType(name)==OBJ_TREND) closeCrossPrice=ObjectGetValueByShift(name,1);
            
            double closeSize=StrToDouble(StringSubstr(ObjectDescription(name),closeNameLength,0));
            
            if (closeSize==0) closeAll=true;
            else closeAll=false;
            
            if ((Close[2]<closeCrossPrice && Close[1]>=closeCrossPrice) || (Close[2]>closeCrossPrice && Close[1]<=closeCrossPrice))
            {
               if (!ticket_closing)
               {
                  if (!closeAll)
                  {
                     while(closeSize>0)
                     {
                        for(int cnt=0;cnt<=OrdersTotal();cnt++)
                        {
                           OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                           ticket=OrderTicket();
                           selectedLot=OrderLots();
      
                           if (OrderSymbol()==Symbol())
                           {
                              if (closeSize<=selectedLot) {closeLot=closeSize; closeSize=0;}
                        
                              if (closeSize>selectedLot && tradeCount()==1) {closeLot=selectedLot; closeSize=0;}
                              if (closeSize>selectedLot && tradeCount()>1) {closeLot=selectedLot; closeSize=closeSize-selectedLot;}
                        
                              if (OrderType()==OP_BUY) closePartTrade(OP_BUY,closeLot); //OrderClose(ticket,closeLot,Bid,MaxSlippage*Point*mp,Red);
                              if (OrderType()==OP_SELL) closePartTrade(OP_SELL,closeLot); //OrderClose(ticket,closeLot,Ask,MaxSlippage*Point*mp,Green);
                              //Print("Closed ",closeLot," lot after crossing line, err:",GetLastError());

                              break;
                           }
                        }
                     }
                  }
                  else
                  {
                     for(cnt=OrdersTotal();cnt>=0;cnt--)
                     {
                        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      
                        if (OrderSymbol()==Symbol() && OrderType()==OP_BUY) 
                        {
                           //RefreshRates();
                           closeTrade(OP_BUY); //OrderClose(OrderTicket(),OrderLots(),Bid,MaxSlippage*Point*mp,Red);
                           //Print(cnt,":BUY order closed, err:",GetLastError());
                        }
                        if (OrderSymbol()==Symbol() && OrderType()==OP_SELL) 
                        {
                           closeTrade(OP_SELL);
                           /*RefreshRates();
                           OrderClose(OrderTicket(),OrderLots(),Ask,MaxSlippage*Point*mp,Green);
                           Print(cnt,":SELL order closed, err:",GetLastError());*/
                        }
                     }
                  }
               }
               else
               {
                  for(cnt=0;cnt<=OrdersTotal();cnt++)
                  {
                     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                     ticket=OrderTicket();
                     
                     if (OrderSymbol() == Symbol() && ticket_closing && OrderTicket() == tic && OrderType() == OP_BUY) closeTradebyTicket(OP_BUY, tic);
                     if (OrderSymbol() == Symbol() && ticket_closing && OrderTicket() == tic && OrderType() == OP_SELL) closeTradebyTicket(OP_SELL, tic);
                  }
               }
               
               if (StringSubstr(ObjectDescription(name),0,closeNameLength)==CloseCrossDescription) ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
            
            buysellLineAllow=false;
            buyLineAllow=false;
            sellLineAllow=false;
         }
         
         //opening trades
         if (ObjectType(name)==OBJ_HLINE && StringSubstr(ObjectDescription(name),0,sellNameLength)==SellCrossDescription)
         {
            SellCrossPrice=ObjectGet(name,OBJPROP_PRICE1);
            double sellSize=StrToDouble(StringSubstr(ObjectDescription(name),sellNameLength,0));
            
            if ((Close[2]<SellCrossPrice && Close[1]>=SellCrossPrice) || (Close[2]>SellCrossPrice && Close[1]<=SellCrossPrice))
            {
               //OrderSend(Symbol(), OP_SELL, sellSize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Red);
               OpenTrade(Symbol(),OP_SELL,sellSize);
               Print("Sell order open after horizontal line cross");
               
               ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
         }
         
         if (ObjectType(name)==OBJ_TREND && StringSubstr(ObjectDescription(name),0,sellNameLength)==SellCrossDescription)
         {
            sellSize=StrToDouble(StringSubstr(ObjectDescription(name),sellNameLength,0));
            lValue_1=ObjectGetValueByShift(name,1);
            lValue_2=ObjectGetValueByShift(name,2);
            
            if ((Close[2]>lValue_2 && Close[1]<=lValue_1) || (Close[2]<lValue_2 && Close[1]>=lValue_1))
            {
               //OrderSend(Symbol(), OP_SELL, sellSize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Red);
               OpenTrade(Symbol(),OP_SELL,sellSize);
               Print("Sell order open after trendline line cross");
               
               ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
         }
         
         if (ObjectType(name)==OBJ_HLINE && StringSubstr(ObjectDescription(name),0,buyNameLength)==BuyCrossDescription)
         {
            BuyCrossPrice=ObjectGet(name,OBJPROP_PRICE1);
            double buySize=StrToDouble(StringSubstr(ObjectDescription(name),buyNameLength,0));
            
            if ((Close[2]>BuyCrossPrice && Close[1]<=BuyCrossPrice) || (Close[2]<BuyCrossPrice && Close[1]>=BuyCrossPrice))
            {
               //OrderSend(Symbol(), OP_BUY, buySize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Green);
               OpenTrade(Symbol(),OP_BUY,buySize);
               Print("Buy order open after horizontal line cross");
               
               ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
         }
         
         if (ObjectType(name)==OBJ_TREND && StringSubstr(ObjectDescription(name),0,buyNameLength)==BuyCrossDescription)
         {
            buySize=StrToDouble(StringSubstr(ObjectDescription(name),buyNameLength,0));
            lValue_1=ObjectGetValueByShift(name,1);
            lValue_2=ObjectGetValueByShift(name,2);
            
            if ((Close[2]>lValue_2 && Close[1]<=lValue_1) || (Close[2]<lValue_2 && Close[1]>=lValue_1))
            {
               //OrderSend(Symbol(), OP_BUY, buySize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Green);
               OpenTrade(Symbol(),OP_BUY,buySize);
               Print("Buy order open after trendline line cross");
               
               ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
         }
         
         //add buy trades
         if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,addCrossBuyNameLength)==AddCrossBuyDescription && tradeExist(OP_BUY))
         {
            buySize=StrToDouble(StringSubstr(ObjectDescription(name),addCrossBuyNameLength,0));
            
            if (ObjectType(name)==OBJ_HLINE) {lValue_1=ObjectGet(name,OBJPROP_PRICE1); lValue_2=lValue_1;}
            if (ObjectType(name)==OBJ_TREND) {lValue_1=ObjectGetValueByShift(name,1); lValue_2=ObjectGetValueByShift(name,2);}
            
            if ((Close[2]>lValue_2 && Close[1]<=lValue_1) || (Close[2]<lValue_2 && Close[1]>=lValue_1))
            {
               //OrderSend(Symbol(), OP_BUY, buySize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Green);
               OpenTrade(Symbol(),OP_BUY,buySize);
               Print("Buy order added after trendline line cross");
               
               ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
         }
         
         //add sell trades
         if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,addCrossSellNameLength)==AddCrossSellDescription && tradeExist(OP_SELL))
         {
            sellSize=StrToDouble(StringSubstr(ObjectDescription(name),addCrossSellNameLength,0));
            
            if (ObjectType(name)==OBJ_HLINE) {lValue_1=ObjectGet(name,OBJPROP_PRICE1); lValue_2=lValue_1;}
            if (ObjectType(name)==OBJ_TREND) {lValue_1=ObjectGetValueByShift(name,1); lValue_2=ObjectGetValueByShift(name,2);}
            
            if ((Close[2]>lValue_2 && Close[1]<=lValue_1) || (Close[2]<lValue_2 && Close[1]>=lValue_1))
            {
               //OrderSend(Symbol(), OP_SELL, sellSize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Red);
               OpenTrade(Symbol(),OP_SELL,sellSize);
               Print("Sell order added after trendline line cross");
               
               ObjectSetText(name,"executed-"+ObjectDescription(name));
            }
         }
      }
      
      currBars=Bars;
   }
   
   bool pbuysellLinesExist, pbuyLinesExist, psellLinesExist;
   
   pBuySellLevel=0;
   pBuySellLevel_1=0;
   pBuySellLevel_2=0;
   
   pbuyLineLevel=0;
   pbuyLineLevel_1=0;
   pbuyLineLevel_2=0;
   
   psellLineLevel=0;
   psellLineLevel_1=0;
   psellLineLevel_2=0;
   
   pBuySellLevel=0;
   //open and close touch orders
   double BuyTouchPrice, SellTouchPrice;
   bool recFound;
   
   for(i=0;i<ObjectsTotal();i++)
   {
      name=ObjectName(i);
      sellNameLength=StringLen(SellTouchDescription);
      buyNameLength=StringLen(BuyTouchDescription);
      closeNameLength=StringLen(CloseTouchDescription);
      pcloseNameLength=StringLen(PermanentCloseTouchDescription);
      ticTouchNameLength=StringLen(TicketCloseTouchDescription);
      
      permanentBuyNameLength=StringLen(PermanentBuyDescription);
      permanentSellNameLength=StringLen(PermanentSellDescription);
      permanentBuySellNameLength=StringLen(PermanentBuySellDescription);
      
      addTouchBuyNameLength=StringLen(AddTouchBuyDescription);
      addTouchSellNameLength=StringLen(AddTouchSellDescription);
      
      //permanent buy-sell line
      if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,permanentBuySellNameLength)==PermanentBuySellDescription)
      {
         double lineValue, lineValue_1, lineValue_2, priceDistance;
         if (ObjectType(name)==OBJ_HLINE) {lineValue=ObjectGet(name,OBJPROP_PRICE1); lineValue_1=lineValue; lineValue_2=lineValue;}
         if (ObjectType(name)==OBJ_TREND) {lineValue=ObjectGetValueByShift(name,0); lineValue_1=ObjectGetValueByShift(name,1); lineValue_2=ObjectGetValueByShift(name,2);}
         priceDistance=MathAbs(Close[0]-lineValue);
         
         if (pBuySellLevel==0 || MathAbs(Close[0]-pBuySellLevel)>priceDistance) 
         {
            pBuySellLevel=lineValue;
            pBuySellLevel_1=lineValue_1;
            pBuySellLevel_2=lineValue_2;
            
            pbsLineName=name;
            pbsLineDesc=ObjectDescription(name);
            ptradeSize=StrToDouble(StringSubstr(ObjectDescription(name),permanentBuySellNameLength,0));
         }
         
         pbuysellLinesExist=true;
      }
      
      //permanent buy line
      if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,permanentBuyNameLength)==PermanentBuyDescription)
       {
         double buyLineValue, buyLineValue_1, buyLineValue_2, buyPriceDistance;
         if (ObjectType(name)==OBJ_HLINE) {buyLineValue=ObjectGet(name,OBJPROP_PRICE1); buyLineValue_1=buyLineValue; buyLineValue_2=buyLineValue;}
         if (ObjectType(name)==OBJ_TREND) {buyLineValue=ObjectGetValueByShift(name,0); buyLineValue_1=ObjectGetValueByShift(name,1); buyLineValue_2=ObjectGetValueByShift(name,2);}
         buyPriceDistance=MathAbs(Close[0]-buyLineValue);
         
         if (pbuyLineLevel==0 || MathAbs(Close[0]-pBuyLevel)>buyPriceDistance) 
         {
            pbuyLineLevel=buyLineValue;
            pbuyLineLevel_1=buyLineValue_1;
            pbuyLineLevel_2=buyLineValue_2;
            
            pbLineName=name;
            pbLineDesc=ObjectDescription(name);
            pbuyTradeLineSize=StrToDouble(StringSubstr(ObjectDescription(name),permanentBuyNameLength,0));
         }
         
         pbuyLinesExist=true;
      }
      
      //permanent sell line
      if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,permanentSellNameLength)==PermanentSellDescription)
       {
         double sellLineValue, sellLineValue_1, sellLineValue_2, sellPriceDistance;
         if (ObjectType(name)==OBJ_HLINE) {sellLineValue=ObjectGet(name,OBJPROP_PRICE1); sellLineValue_1=sellLineValue; sellLineValue_2=sellLineValue;}
         if (ObjectType(name)==OBJ_TREND) {sellLineValue=ObjectGetValueByShift(name,0); sellLineValue_1=ObjectGetValueByShift(name,1); sellLineValue_2=ObjectGetValueByShift(name,2);}
         sellPriceDistance=MathAbs(Close[0]-sellLineValue);
         
         if (psellLineLevel==0 || MathAbs(Close[0]-pSellLevel)>sellPriceDistance) 
         {
            psellLineLevel=sellLineValue;
            psellLineLevel_1=sellLineValue_1;
            psellLineLevel_2=sellLineValue_2;
            
            psLineName=name;
            psLineDesc=ObjectDescription(name);
            psellTradeLineSize=StrToDouble(StringSubstr(ObjectDescription(name),permanentSellNameLength,0));
         }
         
         psellLinesExist=true;
      }
      
      //closing trades
      if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && tradeCount()>0 && 
            (StringSubstr(ObjectDescription(name),0,closeNameLength)==CloseTouchDescription || StringSubstr(ObjectDescription(name),0,pcloseNameLength)==PermanentCloseTouchDescription ||
               StringSubstr(ObjectDescription(name),0,ticTouchNameLength)==TicketCloseTouchDescription))
      {
         if (StringSubstr(ObjectDescription(name),0,ticTouchNameLength)==TicketCloseTouchDescription){
               ticket_closing = true;
               tic = StrToInteger(StringSubstr(ObjectDescription(name),ticTouchNameLength,0));
          }
         
         double closeTouchPrice;
         if (ObjectType(name)==OBJ_HLINE) closeTouchPrice=ObjectGet(name,OBJPROP_PRICE1);
         if (ObjectType(name)==OBJ_TREND) closeTouchPrice=ObjectGetValueByShift(name,0);

         closeSize=StrToDouble(StringSubstr(ObjectDescription(name),closeNameLength,0));
         
         if (closeSize==0) closeAll=true;
         else closeAll=false;
         
         if ((price_0<closeTouchPrice && Close[0]>=closeTouchPrice) || (price_0>closeTouchPrice && Close[0]<=closeTouchPrice) && price_0!=0)
         {
            if (!ticket_closing)
            {
               if (!closeAll)
               {
                  while(closeSize>0)
                  {
                     for(cnt=0;cnt<=OrdersTotal();cnt++)
                     {
                        OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                        ticket=OrderTicket();
                        selectedLot=OrderLots();
   
                        if (OrderSymbol()==Symbol())
                        {
                           if (closeSize<=selectedLot) {closeLot=closeSize; closeSize=0;}
                     
                           if (closeSize>selectedLot && tradeCount()==1) {closeLot=selectedLot; closeSize=0;}
                           if (closeSize>selectedLot && tradeCount()>1) {closeLot=selectedLot; closeSize=closeSize-selectedLot;}
                        
                           if (OrderType()==OP_BUY) closePartTrade(OP_BUY,closeLot); //OrderClose(ticket,closeLot,Bid,MaxSlippage*Point*mp,Red);
                           if (OrderType()==OP_SELL) closePartTrade(OP_SELL,closeLot); //OrderClose(ticket,closeLot,Ask,MaxSlippage*Point*mp,Green);

                           break;
                        }
                     }
                  }
               }
               else
               {
                  for(cnt=OrdersTotal();cnt>=0;cnt--)
                  {
                     OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   
                     if (OrderSymbol()==Symbol() && OrderType()==OP_BUY) 
                     {
                        closeTrade(OP_BUY);
                        /*RefreshRates();
                        OrderClose(OrderTicket(),OrderLots(),Bid,MaxSlippage*Point*mp,Red);
                        Print(cnt,":BUY order closed, err:",GetLastError());*/
                     }
                     if (OrderSymbol()==Symbol() && OrderType()==OP_SELL) 
                     {
                        closeTrade(OP_SELL);
                        /*RefreshRates();
                        OrderClose(OrderTicket(),OrderLots(),Ask,MaxSlippage*Point*mp,Green);
                        Print(cnt,":SELL order closed, err:",GetLastError());*/
                     }
                  }
               }
            }
            else
            {
               for(cnt=0;cnt<=OrdersTotal();cnt++)
               {
                  OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
                  ticket=OrderTicket();
                  
                  if (OrderSymbol() == Symbol() && ticket_closing && OrderTicket() == tic && OrderType() == OP_BUY) closeTradebyTicket(OP_BUY, tic);
                  if (OrderSymbol() == Symbol() && ticket_closing && OrderTicket() == tic && OrderType() == OP_SELL) closeTradebyTicket(OP_SELL, tic);
               }
            }
            
            if (StringSubstr(ObjectDescription(name),0,closeNameLength)==CloseTouchDescription) ObjectSetText(name,"executed-"+ObjectDescription(name));
            
            buysellLineAllow=false;
            buyLineAllow=false;
            sellLineAllow=false;
         }
      }
      
      if (ObjectType(name)==OBJ_HLINE && StringSubstr(ObjectDescription(name),0,sellNameLength)==SellTouchDescription)
      {
         SellTouchPrice=ObjectGet(name,OBJPROP_PRICE1);
         sellSize=StrToDouble(StringSubstr(ObjectDescription(name),sellNameLength,0));
         
         if ((price_0<SellTouchPrice && Close[0]>=SellTouchPrice) || (price_0>SellTouchPrice && Close[0]<=SellTouchPrice) && price_0!=0)
         {
            //OrderSend(Symbol(), OP_SELL, sellSize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Red);
            OpenTrade(Symbol(),OP_SELL,sellSize);
            Print("Sell order open after horizontal line touch");
            
            ObjectSetText(name,"executed-"+ObjectDescription(name));
         }
      }
      
      if (ObjectType(name)==OBJ_TREND && StringSubstr(ObjectDescription(name),0,sellNameLength)==SellTouchDescription)
      {
         sellSize=StrToDouble(StringSubstr(ObjectDescription(name),sellNameLength,0));
         lValue_1=ObjectGetValueByShift(name,1);
         
         if ((price_0<lValue_1 && Close[0]>=lValue_1) || (price_0>lValue_1 && Close[0]<=lValue_1) && price_0!=0)
         {
            //OrderSend(Symbol(), OP_SELL, sellSize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Red);
            OpenTrade(Symbol(),OP_SELL,sellSize);
            Print("Sell order open after trendline line touch");
            
            ObjectSetText(name,"executed-"+ObjectDescription(name));
         }
      }
      
      if (ObjectType(name)==OBJ_HLINE && StringSubstr(ObjectDescription(name),0,buyNameLength)==BuyTouchDescription)
      {
         BuyTouchPrice=ObjectGet(name,OBJPROP_PRICE1);
         buySize=StrToDouble(StringSubstr(ObjectDescription(name),buyNameLength,0));
         
         if ((price_0>BuyTouchPrice && Close[0]<=BuyTouchPrice) || (price_0<BuyTouchPrice && Close[0]>=BuyTouchPrice) && price_0!=0)
         {
            //OrderSend(Symbol(), OP_BUY, buySize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Green);
            OpenTrade(Symbol(),OP_BUY,buySize);
            Print("Buy order open after horizontal line touch");
            
            ObjectSetText(name,"executed-"+ObjectDescription(name));
         }
      }
      
      if (ObjectType(name)==OBJ_TREND && StringSubstr(ObjectDescription(name),0,buyNameLength)==BuyTouchDescription)
      {
         buySize=StrToDouble(StringSubstr(ObjectDescription(name),buyNameLength,0));
         lValue_1=ObjectGetValueByShift(name,1);
         
         if ((price_0>lValue_1 && Close[0]<=lValue_1) || (price_0<lValue_1 && Close[0]>=lValue_1) && price_0!=0)
         {
            //OrderSend(Symbol(), OP_BUY, buySize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Green);
            OpenTrade(Symbol(),OP_BUY,buySize);
            Print("Buy order open after trendline line touch");
            
            ObjectSetText(name,"executed-"+ObjectDescription(name));
         }
      }
      
      //add buy trades
      if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,addTouchBuyNameLength)==AddTouchBuyDescription && tradeExist(OP_BUY))
      {
         buySize=StrToDouble(StringSubstr(ObjectDescription(name),addTouchBuyNameLength,0));
         
         if (ObjectType(name)==OBJ_HLINE) {lValue_1=ObjectGet(name,OBJPROP_PRICE1);}
         if (ObjectType(name)==OBJ_TREND) {lValue_1=ObjectGetValueByShift(name,0);}
         
         if ((price_0>lValue_1 && Close[0]<=lValue_1) || (price_0<lValue_1 && Close[0]>=lValue_1) && price_0!=0)
         {
            //OrderSend(Symbol(), OP_BUY, buySize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Green);
            OpenTrade(Symbol(),OP_BUY,buySize);
            Print("Buy order added after trendline line touch");
            
            ObjectSetText(name,"executed-"+ObjectDescription(name));
         }
      }
      
      //add sell trades
      if ((ObjectType(name)==OBJ_HLINE || ObjectType(name)==OBJ_TREND) && StringSubstr(ObjectDescription(name),0,addTouchSellNameLength)==AddTouchSellDescription && tradeExist(OP_SELL))
      {
         sellSize=StrToDouble(StringSubstr(ObjectDescription(name),addTouchSellNameLength,0));
         
         if (ObjectType(name)==OBJ_HLINE) {lValue_1=ObjectGet(name,OBJPROP_PRICE1);}
         if (ObjectType(name)==OBJ_TREND) {lValue_1=ObjectGetValueByShift(name,0);}
         
         if ((price_0>lValue_1 && Close[0]<=lValue_1) || (price_0<lValue_1 && Close[0]>=lValue_1) && price_0!=0)
         {
            //OrderSend(Symbol(), OP_SELL, sellSize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10001, 0, Red);
            OpenTrade(Symbol(),OP_SELL,sellSize);
            Print("Sell order added after trendline line touch");
            
            ObjectSetText(name,"executed-"+ObjectDescription(name));
         }
      }
      
      //-----------------------------------------------------------------------------------------------------------------------------
      if (ObjectType(name)==OBJ_RECTANGLE && ObjectDescription(name)!="executed")
      {
         double p1=ObjectGet(name,OBJPROP_PRICE1);
         double p2=ObjectGet(name,OBJPROP_PRICE2);
         datetime d2=ObjectGet(name,OBJPROP_TIME2);
         color recColor=ObjectGet(name,OBJPROP_COLOR);
         
         double recHigh, recLow;
         if (p1>p2) {recHigh=p1; recLow=p2;}
         else {recHigh=p2; recLow=p1;}
         
         if (ObjectDescription(name)=="1" || ObjectDescription(name)=="3") recHigh=0;
         if (ObjectDescription(name)=="2" || ObjectDescription(name)=="3") recLow=0;
         
         //Comment("recHigh:",recHigh,",recLow:",recLow,",buyTopOpenAllow:",buyTopOpenAllow,",sellTopOpenAllow:",sellTopOpenAllow,",sellBottomOpenAllow:",sellBottomOpenAllow,
         //         ",buyBottomOpenAllow:",buyBottomOpenAllow);
         Comment("");
         bool Buy_Condition_1, Sell_Condition_1;
         
         if (TradeMode==2 && currBars1!=Bars)
         {
            //open buy trade on the top of the rectangle
            if (buyTopOpenAllow && Close[2]<=recHigh && Close[1]>recHigh && trades<NumberOfHedgeTrades && recHigh>0)
            {
               Buy_Condition_1=true;
               buyTopOpenAllow=false;
               buyTopTradeOpen=true;
               trades++;

               if (sellTopTradeOpen)
               {
                  closeTrade(OP_SELL);
                  sellTopOpenAllow=true;
                  sellTopTradeOpen=false;
               }
            }
            
            //open sell trade on the top of the rectangle
            if (sellTopOpenAllow && Close[2]>=recHigh && Close[1]<recHigh && recHigh>0)
            {
               if (trades<NumberOfHedgeTrades && RectangleHedgeOn) Sell_Condition_1=true;
               sellTopOpenAllow=false;

               sellTopTradeOpen=true;
            
               if (buyTopTradeOpen)
               {
                  closeTrade(OP_BUY);
                  buyTopOpenAllow=true;
                  buyTopTradeOpen=false;
               }
            
               if (trades==NumberOfHedgeTrades)
               {
                  if (ObjectDescription(name)=="") ObjectSetText(name,"1");
                  if (ObjectDescription(name)=="2") ObjectSetText(name,"3");
                  sellTopTradeOpen=false;
                  trades=0;
               }
            }
            
            //switch to bottom of the rectangle
            if (sellTopTradeOpen && Close[2]>=recLow && Close[1]<=recLow && RectangleHedgeOn)
            {
               sellTopTradeOpen=false;
               ObjectSetText(name,"");
            
               sellBottomOpenAllow=false;
               buyBottomOpenAllow=true;

               sellBottomTradeOpen=true;
               
               buyTopOpenAllow=false;
               sellTopOpenAllow=false;
               
               trades=0;
            }
            
            //rectangle bottom
            //open sell trade on bottom of the rectangle and close buy trade if it is open
            if (sellBottomOpenAllow  && Close[2]>=recLow && Close[1]<recLow && recLow>=0)
            {
               Sell_Condition_1=true;
               sellBottomOpenAllow=false;

               sellBottomTradeOpen=true;
               trades++;

               if (buyBottomTradeOpen)
               {
                  closeTrade(OP_BUY);
                  buyBottomOpenAllow=true;
                  buyBottomTradeOpen=false;
               }
            }
            
            //open buy trade on bottom of the rectangle and close sell if it is open
            if (buyBottomOpenAllow && Close[2]<=recLow && Close[1]>recLow && recLow>=0)
            {
               if (trades<NumberOfHedgeTrades && RectangleHedgeOn) Buy_Condition_1=true;
               buyBottomOpenAllow=false;

               buyBottomTradeOpen=true;
            
               if (sellBottomTradeOpen)
               {
                  closeTrade(OP_SELL);
                  sellBottomOpenAllow=true;
                  sellBottomTradeOpen=false;
               }
            
               if (trades==NumberOfHedgeTrades)
               {
                  if (ObjectDescription(name)=="") ObjectSetText(name,"2");
                  if (ObjectDescription(name)=="1") ObjectSetText(name,"3");
                  buyBottomTradeOpen=false;
                  trades=0;
               }
            }
            
            //switch to the top of the rectangle
            if (buyBottomTradeOpen && Close[2]<=recHigh && Close[1]>recHigh && RectangleHedgeOn)
            {
               buyBottomTradeOpen=false;
            
               ObjectSetText(name,"");
            
               buyTopOpenAllow=false;
               sellTopOpenAllow=true;

               buyTopTradeOpen=true;
               trades=0;
               
               sellBottomOpenAllow=false;
               buyBottomOpenAllow=false;
            }
            
            currBars1=Bars;
         }
         
         if (TradeMode==0)
         {
            //rectangle top
            //activate time counting before open buy trade on top of the rectangle
            if (buyTopOpenAllow && !bTopLong && price_0<=recHigh && Close[0]>=recHigh && trades<NumberOfHedgeTrades && recHigh>0) 
            {
               timeTopLong=TimeCurrent(); 
               bTopLong=true;
            }
         
            //deactivate time counting before open long trade on top of the rectangle
            if (bTopLong && TimeCurrent()<=timeTopLong+TimeWaitSeconds && Close[0]<recHigh) 
            {
               bTopLong=false;
            }
         
            //comment
            if (bTopLong && buyTopOpenAllow && recHigh>0) Comment("Seconds to open buy trade:",(timeTopLong+TimeWaitSeconds)-TimeCurrent());
         
            //open buy trade on top of the rectangle and close sell trade if it is open
            if (buyTopOpenAllow && bTopLong && TimeCurrent()>timeTopLong+TimeWaitSeconds && Close[0]>recHigh && recHigh>=0)
            {
               Buy_Condition_1=true;
               buyTopOpenAllow=false;
               bTopLong=false;

               buyTopTradeOpen=true;
               trades++;
            
               if (sellTopTradeOpen)
               {
                  closeTrade(OP_SELL);
                  sellTopOpenAllow=true;
                  sellTopTradeOpen=false;
               }
            }
         
            //activate time counting before open sell trade on top of the rectangle
            if (sellTopOpenAllow && !bTopShort && price_0>=recHigh && Close[0]<=recHigh && trades<=NumberOfHedgeTrades && recHigh>0)
            {
               timeTopShort=TimeCurrent(); 
               bTopShort=true;
            }
         
            //deactivate time counting before open sell trade on top of the rectangle
            if (bTopShort && TimeCurrent()<=timeTopShort+TimeWaitSeconds && Close[0]>recHigh) 
            {
               bTopShort=false;
            }
         
            //comment
            if (bTopShort && sellTopOpenAllow && recHigh>0 && RectangleHedgeOn) Comment("Seconds to open sell trade:",(timeTopShort+TimeWaitSeconds)-TimeCurrent());
         
            //open sell trade on top of the rectangle and close buy if it is open
            if (sellTopOpenAllow && bTopShort && TimeCurrent()>timeTopShort+TimeWaitSeconds && Close[0]<recHigh && recHigh>=0)
            {
               if (trades<NumberOfHedgeTrades && RectangleHedgeOn) Sell_Condition_1=true;
               sellTopOpenAllow=false;
               bTopShort=false;

               sellTopTradeOpen=true;
            
               if (buyTopTradeOpen)
               {
                  closeTrade(OP_BUY);
                  buyTopOpenAllow=true;
                  buyTopTradeOpen=false;
               }
            
               if (trades==NumberOfHedgeTrades)
               {
                  if (ObjectDescription(name)=="") ObjectSetText(name,"1");
                  if (ObjectDescription(name)=="2") ObjectSetText(name,"3");
                  sellTopTradeOpen=false;
                  trades=0;
               }
            }
            
            //switch to bottom of the rectangle
            if (sellTopTradeOpen && price_0>=recLow && Close[0]<=recLow && RectangleHedgeOn)
            {
               sellTopTradeOpen=false;
               ObjectSetText(name,"");
            
               sellBottomOpenAllow=false;
               buyBottomOpenAllow=true;
               bBottomShort=false;

               sellBottomTradeOpen=true;
               trades=0;
            }
         
            //rectangle bottom
            //activate time counting before open sell trade on bottom of the rectangle
            if (sellBottomOpenAllow && !bBottomShort && price_0>=recLow && Close[0]<=recLow && trades<NumberOfHedgeTrades && recLow>0) 
            {
               timeBottomShort=TimeCurrent(); 
               bBottomShort=true;
            }
         
            //deactivate time counting before open sell trade on bottom of the rectangle
            if (bBottomShort && TimeCurrent()<=timeBottomShort+TimeWaitSeconds && Close[0]>recLow) 
            {
               bBottomShort=false;
            }
         
            //comment
            if (bBottomShort && sellBottomOpenAllow && recLow>0) Comment("Seconds to open sell trade:",(timeBottomShort+TimeWaitSeconds)-TimeCurrent());
         
            //open sell trade on bottom of the rectangle and close buy trade if it is open
            if (sellBottomOpenAllow && bBottomShort && TimeCurrent()>timeBottomShort+TimeWaitSeconds && Close[0]<recLow && recLow>=0)
            {
               Sell_Condition_1=true;
               sellBottomOpenAllow=false;
               bBottomShort=false;

               sellBottomTradeOpen=true;
               trades++;
            
               if (buyBottomTradeOpen)
               {
                  closeTrade(OP_BUY);
                  buyBottomOpenAllow=true;
                  buyBottomTradeOpen=false;
               }
            }
         
            //activate time counting before open buy trade on bottom of the rectangle
            if (buyBottomOpenAllow && !bBottomLong && price_0<=recLow && Close[0]>=recLow && trades<=NumberOfHedgeTrades && recLow>0)
            {
               timeBottomLong=TimeCurrent(); 
               bBottomLong=true;
            }
         
            //deactivate time counting before open buy trade on bottom of the rectangle
            if (bBottomLong && TimeCurrent()<=timeBottomLong+TimeWaitSeconds && Close[0]<recLow) 
            {
               bBottomLong=false;
            }
         
            //comment
            if (bBottomLong && buyBottomOpenAllow && recLow>0 && RectangleHedgeOn) Comment("Seconds to open buy trade:",(timeBottomLong+TimeWaitSeconds)-TimeCurrent());
         
            //open buy trade on bottom of the rectangle and close sell if it is open
            if (buyBottomOpenAllow && bBottomLong && TimeCurrent()>timeBottomLong+TimeWaitSeconds && Close[0]>recLow && recLow>=0)
            {
               if (trades<NumberOfHedgeTrades && RectangleHedgeOn) Buy_Condition_1=true;
               buyBottomOpenAllow=false;
               bBottomLong=false;

               buyBottomTradeOpen=true;
            
               if (sellBottomTradeOpen)
               {
                  closeTrade(OP_SELL);
                  sellBottomOpenAllow=true;
                  sellBottomTradeOpen=false;
               }
            
               if (trades==NumberOfHedgeTrades)
               {
                  if (ObjectDescription(name)=="") ObjectSetText(name,"2");
                  if (ObjectDescription(name)=="1") ObjectSetText(name,"3");
                  buyBottomTradeOpen=false;
                  trades=0;
               }
            }
            
            //switch to the top of the rectangle
            if (buyBottomTradeOpen && price_0<=recHigh && Close[0]>=recHigh && RectangleHedgeOn)
            {
               buyBottomTradeOpen=false;
            
               ObjectSetText(name,"");
            
               buyTopOpenAllow=false;
               sellTopOpenAllow=true;
               bTopLong=false;

               buyTopTradeOpen=true;
               trades=0;
            }
         }
      }
   }
   
   //permanent trades section
   if (pbuysellLinesExist)
   {
      if (TradeMode==0)
      {
         Comment("");
         
         if (pbuyBuySellLineAllow && price_0<=pBuySellLevel && Close[0]>=pBuySellLevel && bstrades<=NumberOfHedgeTrades && !bBuySellLineLong && price_0!=0 && pBuySellLevel!=0)
         {
            if (!sellBuySellLineTradeOpen && !psellBuySellMode) {pbuyBuySellMode=true; psellBuySellMode=false;}
      
            if (pbuyBuySellMode || (psellBuySellMode && sellBuySellLineTradeOpen)) 
            {
               bBuySellLineLong=true;
               timeBuySellLineLong=TimeCurrent();
            }
         }
   
         if (bBuySellLineLong && TimeCurrent()<=timeBuySellLineLong+TimeWaitSeconds && Close[0]<pBuySellLevel) 
         {
            bBuySellLineLong=false;
         }

         //comment
         if (bBuySellLineLong && pbuyBuySellLineAllow) Comment("Seconds to open buy trade:",(timeBuySellLineLong+TimeWaitSeconds)-TimeCurrent());
   
         if (pbuyBuySellLineAllow && bBuySellLineLong && TimeCurrent()>timeBuySellLineLong+TimeWaitSeconds && Close[0]>pBuySellLevel)
         {
            if ((bstrades<NumberOfHedgeTrades && psellBuySellMode) || pbuyBuySellMode) 
            {
               Buy_Condition_2=true;
               BESet=false;
            }
            
            pbuyBuySellLineAllow=false;
            bBuySellLineLong=false;

            buyBuySellLineTradeOpen=true;
            if (pbuyBuySellMode) bstrades++;
   
            //if (sellBuySellLineTradeOpen)
            //{
               closeTrade(OP_SELL);
               psellBuySellLineAllow=true;
               sellBuySellLineTradeOpen=false;
            //}
      
            if (bstrades==NumberOfHedgeTrades && psellBuySellMode)
            {
               ObjectSetText(pbsLineName,"executed-"+pbsLineDesc);
               buyBuySellLineTradeOpen=false;
         
               pbuyBuySellMode=false;
               psellBuySellMode=false;
               
               pbuyBuySellLineAllow=true;
               psellBuySellLineAllow=true;
      
               bstrades=0;
               
               pBuySellLevel=0;
            }
         }
   
         if (psellBuySellLineAllow && !bBuySellLineShort && price_0>=pBuySellLevel && Close[0]<=pBuySellLevel && bstrades<=NumberOfHedgeTrades && price_0!=0 && pBuySellLevel!=0)
         {
            if (!buyBuySellLineTradeOpen && !pbuyBuySellMode) {pbuyBuySellMode=false; psellBuySellMode=true;}
      
            if (psellBuySellMode || (pbuyBuySellMode && buyBuySellLineTradeOpen))
            {
               timeBuySellLineShort=TimeCurrent();
               bBuySellLineShort=true;
            }
         }

         //deactivate time counting before open sell trade on permanent buysell line
         if (bBuySellLineShort && TimeCurrent()<=timeBuySellLineShort+TimeWaitSeconds && Close[0]>pBuySellLevel) 
         {
            bBuySellLineShort=false;
         }
   
         //comment
         if (bBuySellLineShort && psellBuySellLineAllow) Comment("Seconds to open sell trade:",(timeBuySellLineShort+TimeWaitSeconds)-TimeCurrent());

         //open sell trade on buysell line and close buy if it is open
         if (psellBuySellLineAllow && bBuySellLineShort && TimeCurrent()>timeBuySellLineShort+TimeWaitSeconds && Close[0]<pBuySellLevel)
         {
            if ((bstrades<NumberOfHedgeTrades && pbuyBuySellMode) || (psellBuySellMode)) 
            {
               Sell_Condition_2=true;
               BESet=false;
            }
            
            psellBuySellLineAllow=false;
            bBuySellLineShort=false;

            sellBuySellLineTradeOpen=true;
            if (psellBuySellMode) bstrades++;
   
            //if (buyBuySellLineTradeOpen)
            //{
               closeTrade(OP_BUY);
               pbuyBuySellLineAllow=true;
               buyBuySellLineTradeOpen=false;
            //}
   
            if (bstrades==NumberOfHedgeTrades && pbuyBuySellMode)
            {
               ObjectSetText(pbsLineName,"executed-"+pbsLineDesc);
               sellBuySellLineTradeOpen=false;
         
               pbuyBuySellMode=false;
               psellBuySellMode=false;
               
               pbuyBuySellLineAllow=true;
               psellBuySellLineAllow=true;
      
               bstrades=0;
            
               pBuySellLevel=0;
            }
         }
      }
      
      if (TradeMode==1 && currBars2!=Bars)
      {
         if (!buyBuySellLineTradeOpen && Close[2]<=pBuySellLevel_2 && Close[1]>=pBuySellLevel_1 && bstrades<=NumberOfHedgeTrades && pBuySellLevel_1>0)
         {
            if (!sellBuySellLineTradeOpen) {pbuyBuySellMode=true; psellBuySellMode=false;}
            
            if ((bstrades<NumberOfHedgeTrades && psellBuySellMode) || pbuyBuySellMode) 
            {
               Buy_Condition_2=true;
               BESet=false;
            }
            
            pbuyBuySellLineAllow=false;
            buyBuySellLineTradeOpen=true;
            
            if (pbuyBuySellMode) bstrades++;
            
            if (sellBuySellLineTradeOpen)
            {
               closeTrade(OP_SELL);
               psellBuySellLineAllow=true;
               sellBuySellLineTradeOpen=false;
            }
            
            if (bstrades==NumberOfHedgeTrades && psellBuySellMode)
            {
               ObjectSetText(pbsLineName,"executed-"+pbsLineDesc);
               buyBuySellLineTradeOpen=false;
         
               pbuyBuySellMode=false;
               psellBuySellMode=false;
               
               pbuyBuySellLineAllow=true;
               psellBuySellLineAllow=true;
      
               bstrades=0;
               
               pBuySellLevel=0;
            }
         }
         
         if (!sellBuySellLineTradeOpen && Close[2]>=pBuySellLevel_2 && Close[1]<=pBuySellLevel_1 && bstrades<=NumberOfHedgeTrades && pBuySellLevel_1>0)
         {
            if (!buyBuySellLineTradeOpen) {pbuyBuySellMode=false; psellBuySellMode=true;}
            
            if ((bstrades<NumberOfHedgeTrades && pbuyBuySellMode) || (psellBuySellMode)) 
            {
               Sell_Condition_2=true;
               BESet=false;
            }
            
            psellBuySellLineAllow=false;
            sellBuySellLineTradeOpen=true;
            
            if (psellBuySellMode) bstrades++;
            
            if (buyBuySellLineTradeOpen)
            {
               closeTrade(OP_BUY);
               pbuyBuySellLineAllow=true;
               buyBuySellLineTradeOpen=false;
            }
            
            if (bstrades==NumberOfHedgeTrades && pbuyBuySellMode)
            {
               ObjectSetText(pbsLineName,"executed-"+pbsLineDesc);
               sellBuySellLineTradeOpen=false;
         
               pbuyBuySellMode=false;
               psellBuySellMode=false;
               
               pbuyBuySellLineAllow=true;
               psellBuySellLineAllow=true;
      
               bstrades=0;
               
               pBuySellLevel=0;
               pBuySellLevel_1=0;
               pBuySellLevel_2=0;
            }
         }
         
         currBars2=Bars;  
      }
      
      if (TradeMode==2)
      {
         double immbuyBuySellLevel=pBuySellLevel+ImmediateEntryBuffer*Point*mp;
         double immsellBuySellLevel=pBuySellLevel-ImmediateEntryBuffer*Point*mp;
         //Comment("immBuyLevel:",immBuyLevel,",immSellLevel:",immSellLevel);
         
         if (!buysellLineAllow && price_0!=0 && ((price_0<=pBuySellLevel && Close[0]>=pBuySellLevel) || (price_0>=pBuySellLevel && Close[0]<=pBuySellLevel)) && pBuySellLevel!=0) buysellLineAllow=true;
         
         if (!buyBuySellLineTradeOpen && price_0<immbuyBuySellLevel && Close[0]>=immbuyBuySellLevel && bstrades<=NumberOfHedgeTrades && pBuySellLevel>0 && buysellLineAllow)
         {
            if (!sellBuySellLineTradeOpen && !psellBuySellMode) {pbuyBuySellMode=true; psellBuySellMode=false;}
            
            if ((bstrades<NumberOfHedgeTrades && psellBuySellMode) || pbuyBuySellMode) 
            {
               Buy_Condition_2=true;
               BESet=false;
            }
            
            pbuyBuySellLineAllow=false;
            buyBuySellLineTradeOpen=true;
            
            if (pbuyBuySellMode) bstrades++;
            
            if (sellBuySellLineTradeOpen)
            {
               closeTrade(OP_SELL);
               psellBuySellLineAllow=true;
               sellBuySellLineTradeOpen=false;
            }
            
            if (bstrades==NumberOfHedgeTrades && psellBuySellMode)
            {
               ObjectSetText(pbsLineName,"executed-"+pbsLineDesc);
               buyBuySellLineTradeOpen=false;
         
               pbuyBuySellMode=false;
               psellBuySellMode=false;
               
               pbuyBuySellLineAllow=true;
               psellBuySellLineAllow=true;
      
               bstrades=0;
               
               pBuySellLevel=0;
            }
         }
         
         if (!sellBuySellLineTradeOpen && price_0>immsellBuySellLevel && Close[0]<=immsellBuySellLevel && bstrades<=NumberOfHedgeTrades && pBuySellLevel_1>0 && buysellLineAllow && price_0!=0)
         {
            if (!buyBuySellLineTradeOpen && !pbuyBuySellMode) {pbuyBuySellMode=false; psellBuySellMode=true;}
            
            if ((bstrades<NumberOfHedgeTrades && pbuyBuySellMode) || (psellBuySellMode)) 
            {
               Sell_Condition_2=true;
               BESet=false;
            }
            
            psellBuySellLineAllow=false;
            sellBuySellLineTradeOpen=true;
            
            if (psellBuySellMode) bstrades++;
            
            if (buyBuySellLineTradeOpen)
            {
               closeTrade(OP_BUY);
               pbuyBuySellLineAllow=true;
               buyBuySellLineTradeOpen=false;
            }
            
            if (bstrades==NumberOfHedgeTrades && pbuyBuySellMode)
            {
               ObjectSetText(pbsLineName,"executed-"+pbsLineDesc);
               sellBuySellLineTradeOpen=false;
         
               pbuyBuySellMode=false;
               psellBuySellMode=false;
               
               pbuyBuySellLineAllow=true;
               psellBuySellLineAllow=true;
      
               bstrades=0;
               
               pBuySellLevel=0;
            }
         }
      }
   }
   else buysellLineAllow=false;
   
   //permanent buy line
   if (pbuyLinesExist)
   {
      bool Buy_Condition_3;
      
      if (TradeMode==0)
      {
         Comment("");
         
         //activate time counting before open buy trade
         if (!buyBuyLineTradeOpen && price_0<=pbuyLineLevel && Close[0]>=pbuyLineLevel && btrades<=NumberOfHedgeTrades && !bBuyLineLong && price_0!=0 && pbuyLineLevel!=0)
         {
            bBuyLineLong=true;
            timeBuyLineLong=TimeCurrent();
         }
         
         //deactivate time counting before open buy trade
         if (bBuyLineLong && TimeCurrent()<=timeBuyLineLong+TimeWaitSeconds && Close[0]<pbuyLineLevel) 
         {
            bBuyLineLong=false;
         }

         //comment
         if (bBuyLineLong && !buyBuyLineTradeOpen) Comment("Seconds to open buy trade:",(timeBuyLineLong+TimeWaitSeconds)-TimeCurrent());
         
         //open buy trade
         if (!buyBuyLineTradeOpen && bBuyLineLong && TimeCurrent()>timeBuyLineLong+TimeWaitSeconds && Close[0]>pbuyLineLevel)
         {
            closeTrade(OP_SELL);
            
            if (btrades<NumberOfHedgeTrades) 
            {
               Buy_Condition_3=true;
               BESet=false;
            }

            buyBuyLineTradeOpen=true;
            bBuyLineLong=false;
            btrades++;
         }
         
         //activate time counting before close buy trade
         if (buyBuyLineTradeOpen && !bBuyLineShort && price_0>=pbuyLineLevel && Close[0]<=pbuyLineLevel && btrades<=NumberOfHedgeTrades)
         {
            timeBuyLineShort=TimeCurrent();
            bBuyLineShort=true;
         }

         //deactivate time counting before open sell trade on permanent buysell line
         if (bBuyLineShort && TimeCurrent()<=timeBuyLineShort+TimeWaitSeconds && Close[0]>pbuyLineLevel) 
         {
            bBuyLineShort=false;
         }
   
         //comment
         if (bBuyLineShort && buyBuyLineTradeOpen) Comment("Seconds to close buy trade:",(timeBuyLineShort+TimeWaitSeconds)-TimeCurrent());
         
         //close buy trade
         if (buyBuyLineTradeOpen && bBuyLineShort && TimeCurrent()>timeBuyLineShort+TimeWaitSeconds && Close[0]<pbuyLineLevel)
         {
            closeTrade(OP_BUY);
            buyBuyLineTradeOpen=false;
            bBuyLineShort=false;
   
            if (btrades==NumberOfHedgeTrades)
            {
               ObjectSetText(pbLineName,"executed-"+pbLineDesc);
      
               btrades=0;
            
               pbuyLineLevel=0;
            }
         }
      }
      
      if (TradeMode==1 && currBars3!=Bars)
      {
         Comment("");
         
         //open buy trade after candle cross permanent buy line up
         if (!buyBuyLineTradeOpen && Close[2]<=pbuyLineLevel_2 && Close[1]>=pbuyLineLevel_1 && btrades<=NumberOfHedgeTrades && pbuyLineLevel_1!=0)
         {
            closeTrade(OP_SELL);
            
            if (btrades<NumberOfHedgeTrades) 
            {
               Buy_Condition_3=true;
               BESet=false;
            }

            buyBuyLineTradeOpen=true;
            btrades++;
         }
         
         //close buy trade after candle cross permanent buy line down
         if (buyBuyLineTradeOpen && Close[2]>=pbuyLineLevel_2 && Close[1]<pbuyLineLevel_1 && btrades<=NumberOfHedgeTrades)
         {
            closeTrade(OP_BUY);
            buyBuyLineTradeOpen=false;
   
            if (btrades==NumberOfHedgeTrades)
            {
               ObjectSetText(pbLineName,"executed-"+pbLineDesc);
      
               btrades=0;
            
               pbuyLineLevel=0;
               pbuyLineLevel_1=0;
               pbuyLineLevel_2=0;
            }
         }
         
         currBars3=Bars;
      }
      
      if (TradeMode==2)
      {
         double immbuyBuyLevel=pbuyLineLevel+ImmediateEntryBuffer*Point*mp;
         double immsellBuyLevel=pbuyLineLevel-ImmediateEntryBuffer*Point*mp;
         //Comment("pbuyLineLevel:",pbuyLineLevel,",immbuyBuyLevel:",immbuyBuyLevel,",immsellBuyLevel:",immsellBuyLevel,",buyLineAllow:",buyLineAllow);
         
         if (!buyLineAllow && price_0!=0 && ((price_0<=pbuyLineLevel && Close[0]>=pbuyLineLevel) || (price_0>=pbuyLineLevel && Close[0]<=pbuyLineLevel)) && pbuyLineLevel!=0) buyLineAllow=true;
         
         if (!buyBuyLineTradeOpen && Close[0]>=immbuyBuyLevel && btrades<=NumberOfHedgeTrades && pbuyLineLevel>0 && buyLineAllow)
         {
            closeTrade(OP_SELL);
            
            if (btrades<NumberOfHedgeTrades) 
            {
               Buy_Condition_3=true;
               BESet=false;
            }

            buyBuyLineTradeOpen=true;
            btrades++;
         }
         
         if (buyBuyLineTradeOpen && Close[0]<=immsellBuyLevel && btrades<=NumberOfHedgeTrades && pbuyLineLevel>0 && buyLineAllow)
         {
            closeTrade(OP_BUY);
            buyBuyLineTradeOpen=false;
   
            if (btrades==NumberOfHedgeTrades)
            {
               ObjectSetText(pbLineName,"executed-"+pbLineDesc);
      
               btrades=0;
            
               pbuyLineLevel=0;
            }
         }
      }
   }
   else buyLineAllow=false;
   
   //permanent sell line
   if (psellLinesExist)
   {
      bool Sell_Condition_3;
      
      if (TradeMode==0)
      {
         Comment("");
         
         //activate time counting before open sell trade
         if (!sellSellLineTradeOpen && price_0>=psellLineLevel && Close[0]<=psellLineLevel && strades<=NumberOfHedgeTrades && !bSellLineShort && price_0!=0 && psellLineLevel!=0)
         {
            bSellLineShort=true;
            timeSellLineShort=TimeCurrent();
         }
         
         //deactivate time counting before open buy trade
         if (bSellLineShort && TimeCurrent()<=timeSellLineShort+TimeWaitSeconds && Close[0]>psellLineLevel) 
         {
            bSellLineShort=false;
         }

         //comment
         if (bSellLineShort && !sellSellLineTradeOpen) Comment("Seconds to open sell trade:",(timeSellLineShort+TimeWaitSeconds)-TimeCurrent());
         
         //open sell trade
         if (!sellSellLineTradeOpen && bSellLineShort && TimeCurrent()>timeSellLineShort+TimeWaitSeconds && Close[0]<psellLineLevel)
         {
            closeTrade(OP_BUY);
            
            if (strades<NumberOfHedgeTrades) 
            {
               Sell_Condition_3=true;
               BESet=false;
            }

            sellSellLineTradeOpen=true;
            bSellLineShort=false;
            strades++;
         }
         
         //activate time counting before close sell trade
         if (sellSellLineTradeOpen && !bSellLineLong && price_0<=psellLineLevel && Close[0]>=psellLineLevel && strades<=NumberOfHedgeTrades && price_0!=0 && psellLineLevel!=0)
         {
            timeSellLineLong=TimeCurrent();
            bSellLineLong=true;
         }

         //deactivate time counting before open sell trade on permanent buysell line
         if (bSellLineLong && TimeCurrent()<=timeSellLineLong+TimeWaitSeconds && Close[0]<psellLineLevel) 
         {
            bSellLineLong=false;
         }
   
         //comment
         if (bSellLineLong && sellSellLineTradeOpen) Comment("Seconds to close sell trade:",(timeSellLineLong+TimeWaitSeconds)-TimeCurrent());
         
         //close sell trade
         if (sellSellLineTradeOpen && bSellLineLong && TimeCurrent()>timeSellLineLong+TimeWaitSeconds && Close[0]>psellLineLevel)
         {
            closeTrade(OP_SELL);
            sellSellLineTradeOpen=false;
            bSellLineLong=false;
   
            if (strades==NumberOfHedgeTrades)
            {
               ObjectSetText(psLineName,"executed-"+psLineDesc);
      
               strades=0;
            
               psellLineLevel=0;
            }
         }
      }
      
      if (TradeMode==1 && currBars4!=Bars)
      {
         Comment("");
         Comment("strades:",strades,",psellLineLevel_1:",psellLineLevel_1,",psellLineLevel_2:",psellLineLevel_2);
         
         //open sell trade after permanent sell line cross down
         if (!sellSellLineTradeOpen && Close[2]>=psellLineLevel_2 && Close[1]<=psellLineLevel_1 && strades<=NumberOfHedgeTrades && psellLineLevel_1!=0)
         {
            closeTrade(OP_BUY);
            
            if (strades<NumberOfHedgeTrades) 
            {
               Sell_Condition_3=true;
               BESet=false;
            }

            sellSellLineTradeOpen=true;
            strades++;
         }
         
         //close sell trade after permanent sell line cross up
         if (sellSellLineTradeOpen && Close[2]<=psellLineLevel_2 && Close[1]>=psellLineLevel_1 && strades<=NumberOfHedgeTrades)
         {
            closeTrade(OP_SELL);
            sellSellLineTradeOpen=false;
   
            if (strades==NumberOfHedgeTrades)
            {
               ObjectSetText(psLineName,"executed-"+psLineDesc);
      
               strades=0;
            
               psellLineLevel=0;
               psellLineLevel_1=0;
               psellLineLevel_2=0;
            }
         }
         
         currBars4=Bars;
      }
      
      if (TradeMode==2)
      {
         double immbuySellLevel=psellLineLevel+ImmediateEntryBuffer*Point*mp;
         double immsellSellLevel=psellLineLevel-ImmediateEntryBuffer*Point*mp;
         
         if (!sellLineAllow && price_0!=0 && ((price_0<=psellLineLevel && Close[0]>=psellLineLevel) || (price_0>=psellLineLevel && Close[0]<=psellLineLevel)) && psellLineLevel!=0) sellLineAllow=true;
         
         //open sell trade after cross sell line level down
         if (!sellSellLineTradeOpen && Close[0]<=immsellSellLevel && strades<=NumberOfHedgeTrades && psellLineLevel>0 && sellLineAllow)
         {
            closeTrade(OP_BUY);
            
            if (strades<NumberOfHedgeTrades) 
            {
               Sell_Condition_3=true;
               BESet=false;
            }

            sellSellLineTradeOpen=true;
            strades++;
         }
         
         //close sell trade after cross sell line level up
         if (sellSellLineTradeOpen && Close[0]>=immbuySellLevel && strades<=NumberOfHedgeTrades && sellLineAllow)
         {
            closeTrade(OP_SELL);
            sellSellLineTradeOpen=false;
   
            if (strades==NumberOfHedgeTrades)
            {
               ObjectSetText(psLineName,"executed-"+psLineDesc);
      
               strades=0;
            
               psellLineLevel=0;
               psellLineLevel_1=0;
               psellLineLevel_2=0;
            }
         }
      }
   }
   else sellLineAllow=false;
   
   if (UsePipsProfit)
   {
      double pipsLoss=calculatePipsLoss(EAStartTime);
      Comment("Profit of closed trades:",pipsLoss/Point/mp);
      
      for(cnt=0;cnt<OrdersTotal();cnt++)
      {
         OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
         
         if(OrderSymbol()==Symbol() && OrderType()==OP_BUY && Bid-OrderOpenPrice()>=-pipsLoss+PipsProfit*Point*mp && 
            ((pipsLoss<0 && !ProfitOnFirstTrade) || (pipsLoss+(Bid-OrderOpenPrice())>=PipsProfit*Point*mp)))
         {
            Print("Bid-OrderOpenPrice():",Bid-OrderOpenPrice(),",-pipsLoss+PipsProfit*Point*mp:",-pipsLoss+PipsProfit*Point*mp);
            closeTrade(OP_BUY);
            EAStartTime=TimeCurrent();
         }
         
         if(OrderSymbol()==Symbol() && OrderType()==OP_SELL && OrderOpenPrice()-Ask>=-pipsLoss+PipsProfit*Point*mp && 
            ((pipsLoss<0 && !ProfitOnFirstTrade) || (pipsLoss+(OrderOpenPrice()-Ask)>=PipsProfit*Point*mp)))
         {
            Print("OrderOpenPrice()-Ask:",OrderOpenPrice()-Ask,",-pipsLoss+PipsProfit*Point*mp:",-pipsLoss+PipsProfit*Point*mp);
            closeTrade(OP_SELL);
            EAStartTime=TimeCurrent();
         }
      }
   }
   
   //move to BE
   if (BreakEvenOn && !BESet)
   {
      for(cnt=0;cnt<OrdersTotal();cnt++)
      {
         OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==10002 && OrderType()==OP_BUY && 
            ((Close[0]-OrderOpenPrice()>=MoveSLToBEAfter*Point*mp && !BEAfterFirstCandleOn) || (BEAfterFirstCandleOn && candleCount+1==Bars)))
         {
            OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,CLR_NONE);
            BESet=true;
         }
      
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==10002 && OrderType()==OP_SELL && 
            ((OrderOpenPrice()-Close[0]>=MoveSLToBEAfter*Point*mp && !BEAfterFirstCandleOn) || (BEAfterFirstCandleOn && candleCount+1==Bars)))
         {
            OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,CLR_NONE);
            BESet=true;
         }
      }
   }
   
   double tsize;
   double TP, SL;
   if (Buy_Condition_1 || Buy_Condition_2 || Buy_Condition_3)
   {
      if (Buy_Condition_1) tsize=RectangleTradeSize;
      if (Buy_Condition_2) tsize=ptradeSize;
      if (Buy_Condition_3) tsize=pbuyTradeLineSize;
      
      err=1;
      while(err>0)
      {
         RefreshRates();
         
         if (TakeProfit>0) TP=Ask+TakeProfit*Point*mp;
         else TP=0;

         if (StopLoss>0) SL=Ask-StopLoss*Point*mp;
         else SL=0;
         
         ticket=OrderSend(Symbol(), OP_BUY, tsize, Ask, MaxSlippage*Point*mp, 0, 0, "", 10002, 0, Green);
         err=GetLastError();
         Print("Buy open, err:",err);
         
         if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
         else err=0;
         
         if (err!=0) Sleep(1000);
      }
      
      if (ticket>0 && (TP>0 || SL>0))
      {            
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
            OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, CLR_NONE);
      }
      
      Buy_Condition_1=false;
      Buy_Condition_2=false;
      candleCount=Bars;
   }
   
   if (Sell_Condition_1 || Sell_Condition_2 || Sell_Condition_3)
   {
      if (Sell_Condition_1) tsize=RectangleTradeSize;
      if (Sell_Condition_2) tsize=ptradeSize;
      if (Sell_Condition_3) tsize=psellTradeLineSize;
      
      err=1;
      while(err>0)
      {
         RefreshRates();
         
         if (TakeProfit>0) TP=Bid-TakeProfit*Point*mp;
         else TP=0;

         if (StopLoss>0) SL=Bid+StopLoss*Point*mp;
         else SL=0;
         
         ticket=OrderSend(Symbol(), OP_SELL, tsize, Bid, MaxSlippage*Point*mp, 0, 0, "", 10002, 0, Green);
         err=GetLastError();
         Print("Sell open, err:",err);
         
         if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
         else err=0;
         
         if (err!=0) Sleep(1000);
      }
      
      if (ticket>0 && (TP>0 || SL>0))
      {            
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
            OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, CLR_NONE);
      }
      
      Sell_Condition_1=false;
      Sell_Condition_2=false;
      candleCount=Bars;
   }
   
   if (recTradeCount()==0)
   {
      buyTopOpenAllow=true;
      sellTopOpenAllow=true;
      sellBottomOpenAllow=true;
      buyBottomOpenAllow=true;
      
      psellBuySellLineAllow=true;
      pbuyBuySellLineAllow=true;
      buyBuySellLineTradeOpen=false;
      sellBuySellLineTradeOpen=false;
      
      sellBuySellLineTradeOpen=false;
      buyBuySellLineTradeOpen=false;
      
      //trades=0;
   }
   
   //display winning/losing statistics
   if (DisplayStatistics && OrdersHistoryTotal()!=OrdersHistoryTotal_0)
   {
      int wcount, lcount;
      double profitPips, lossPips;
      string text;
      
      for(cnt=OrdersHistoryTotal();cnt>=0;cnt--)
      {
         OrderSelect(cnt,SELECT_BY_POS, MODE_HISTORY);
         
         if (OrderMagicNumber()==10002 && OrderSymbol()==Symbol() && OrderProfit()>=0) 
         {
            wcount++;
            
            if (OrderType()==OP_BUY) profitPips=profitPips+(OrderClosePrice()-OrderOpenPrice());
            if (OrderType()==OP_SELL) profitPips=profitPips+(OrderOpenPrice()-OrderClosePrice());
         }
         
         if (OrderMagicNumber()==10002 && OrderSymbol()==Symbol() && OrderProfit()<0) 
         {
            lcount++;
            
            if (OrderType()==OP_BUY) lossPips=lossPips+(OrderClosePrice()-OrderOpenPrice());
            if (OrderType()==OP_SELL) lossPips=lossPips+(OrderOpenPrice()-OrderClosePrice());
         }
      }
      
      //text=wcount+" winning trades,"+lcount+" losing trades";
      //SetLabel("tot_lab", X, Y+20, text, TextColor, "Calibri",10);
      
      if (wcount>0)
      {
         double avgprofit=(profitPips/Point/mp)/wcount;
         totalProfit=profitPips/Point/mp;
         text=wcount+" winning trades, average profit;"+DoubleToStr(avgprofit,0)+",total:"+DoubleToStr(totalProfit,0);
         SetLabel("totp_lab", X, Y, text, TextColor, "Calibri",10);
      }
      
      if (lcount>0)
      {
         double avgloss=(lossPips/Point/mp)/lcount;
         totalLoss=lossPips/Point/mp;
         text=lcount+" losing trades, average loss;"+DoubleToStr(avgloss,0)+",total:"+DoubleToStr(totalLoss,0);
         SetLabel("totl_lab", X, Y+10, text, TextColor, "Calibri",10);
      }
   }
   
   if (DisplayStatistics)
   {
      double BEd=totalProfit+totalLoss+currentProfit();
      text="BE distance:"+DoubleToStr(BEd,0);
      //text="totalProfit:"+totalProfit,;
      SetLabel("BEd_lab", X, Y+20, text, TextColor, "Calibri",10);
   }
   
   price_0=Close[0];
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
void OpenTrade(string sym, int tmode, double tsize)
{
   int MagicNumber=10001;
   int err, ticket;
   double TP, SL;
   
   if(!IsTradeAllowed())
   {
      while(true)
      {
         if(IsTradeAllowed()) break;
         Sleep(100);
      } 
   }
   RefreshRates();
   
   if (tmode==OP_BUY)
   {
      err=1;
      while(err>0)
      {
         RefreshRates();
         
         if (TakeProfit>0) TP=Ask+TakeProfit*Point*mp;
         else TP=0;

         if (StopLoss>0) SL=Ask-StopLoss*Point*mp;
         else SL=0;
         
         ticket=OrderSend(sym, OP_BUY, tsize, Ask, MaxSlippage*Point*mp, 0, 0, "", MagicNumber, 0, Green);
         err=GetLastError();
         Print(sym+" Buy open, err:",err);
         
         if (err==3 || err==64 || err==65 || err==130 || err==131 || err==133 || err==134 || err==148) err=0;
         
         if (err!=0) Sleep(1000);
      }
      
      if (ticket>0 && (TP>0 || SL>0))
      {            
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
            OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, CLR_NONE);
      }
   }
   
   if (tmode==OP_SELL)
   {
      err=1;
      while(err>0)
      {
         RefreshRates();
         
         if (TakeProfit>0) TP=Bid-TakeProfit*Point*mp;
         else TP=0;

         if (StopLoss>0) SL=Bid+StopLoss*Point*mp;
         else SL=0;
         
         ticket=OrderSend(sym, OP_SELL, tsize, Bid, MaxSlippage*Point*mp, SL, TP, "", MagicNumber, 0, Green);
         err=GetLastError();
         Print(sym+" Sell open, err:",err);
         
         if (err==3 || err==64 || err==65 || err==130 || err==131 || err==133 || err==134 || err==148) err=0;
         
         if (err!=0) Sleep(1000);
      }
      
      if (ticket>0 && (TP>0 || SL>0))
      {            
         if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) 
            OrderModify(ticket, OrderOpenPrice(), SL, TP, 0, CLR_NONE);
      }
   }
}

void closePartTrade(int ttype,double cSize)
{
   
   int err;
   for(int cnt=0;cnt<OrdersTotal();cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      
      if(OrderSymbol()==Symbol() && OrderType()==ttype && ttype==OP_SELL)
      {
         err=1;
         while(err>0)
         {
            RefreshRates();
            OrderClose(OrderTicket(),cSize,Ask,MaxSlippage*Point*mp,Green);
            err=GetLastError();
            Print("SELL order closed, err:",ErrorDescription(err));
            Alert("SELL order closed, err:",ErrorDescription(err));
            
            if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
            else err=0;
         
            if (err!=0) Sleep(1000);
         }
      }
      
      if(OrderSymbol()==Symbol() && OrderType()==ttype && ttype==OP_BUY)
      {
         err=1;
         while(err>0)
         {
            RefreshRates();
            OrderClose(OrderTicket(),cSize,Bid,MaxSlippage*Point*mp,Red);
            err=GetLastError();
            Print("Buy order closed, err:",ErrorDescription(err));
            Alert("Buy order closed, err:",ErrorDescription(err));
            
            if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
            else err=0;
         
            if (err!=0) Sleep(1000);
         }
      }
   }
}

int tradeCount()
{
   int total = OrdersTotal();
   
   int tc=0;
   for(int cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol()) 
      {
         tc++;
      }
   }
   
   return(tc); 
}

int recTradeCount()
{
   int total = OrdersTotal();
   
   int tc=0;
   for(int cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==10002) 
      {
         tc++;
      }
   }
   
   return(tc); 
}

void closeTrade(int ttype)
{
   
   int err;
   for(int cnt=0;cnt<OrdersTotal();cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      
      if(OrderSymbol()==Symbol() && OrderType()==ttype && ttype==OP_SELL)
      {
         err=1;
         while(err>0)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Ask,MaxSlippage*Point*mp,Green);
            err=GetLastError();
            Print("SELL order closed, err:",err);
            
            if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
            else err=0;
         
            if (err!=0) Sleep(1000);
         }
      }
      
      if(OrderSymbol()==Symbol() && OrderType()==ttype && ttype==OP_BUY)
      {
         err=1;
         while(err>0)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Bid,MaxSlippage*Point*mp,Red);
            err=GetLastError();
            Print("BUY order closed, err:",err);
            
            if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
            else err=0;
         
            if (err!=0) Sleep(1000);
         }
      }
   }
}

void closeTradebyTicket(int ttype, int tic)
{
   
   int err;
   for(int cnt=0;cnt<OrdersTotal();cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      
      if(OrderSymbol()==Symbol() && OrderType()==ttype && ttype==OP_SELL && OrderTicket() == tic)
      {
         err=1;
         while(err>0)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Ask,MaxSlippage*Point*mp,Green);
            err=GetLastError();
            Print("SELL order closed, err:",err);
            
            if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
            else err=0;
         
            if (err!=0) Sleep(1000);
         }
      }
      
      if(OrderSymbol()==Symbol() && OrderType()==ttype && ttype==OP_BUY && OrderTicket() == tic)
      {
         err=1;
         while(err>0)
         {
            RefreshRates();
            OrderClose(OrderTicket(),OrderLots(),Bid,MaxSlippage*Point*mp,Red);
            err=GetLastError();
            Print("BUY order closed, err:",err);
            
            if (err==4 || err==6 || err==8 || err==128 || err==129 || err==135 || err==136 || err==138 || err==139 || err==146) err=1;
            else err=0;
         
            if (err!=0) Sleep(1000);
         }
      }
   }
}

bool tradeExist(int ttype)
{
   int total = OrdersTotal();
   
   int OrdNumber=-1;
       
   for(int cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol()==Symbol() && OrderType()==ttype)
      {
         OrdNumber=cnt;
      }
   }
   
   if(OrdNumber==-1)
   {
      return(false);
   }
   else
   {
      return(true);  
   }
}

double calculatePipsLoss(datetime stime)
{
   double ploss;
   
   for(int cnt=0;cnt<OrdersHistoryTotal();cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_HISTORY);
      
      if(OrderSymbol()==Symbol() && OrderOpenTime()>=stime)
      {
         if (OrderType()==OP_BUY) ploss=ploss+(OrderClosePrice()-OrderOpenPrice());
         if (OrderType()==OP_SELL) ploss=ploss+(OrderOpenPrice()-OrderClosePrice());
      }
   }
   
   return(ploss);
}

double currentProfit()
{
   double p;
   
   for(int cnt=0;cnt<OrdersTotal();cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS, MODE_TRADES);
      
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==10002 && OrderType()==OP_BUY)
      {
         p=Bid-OrderOpenPrice();
      }
      
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==10002 && OrderType()==OP_SELL)
      {
         p=OrderOpenPrice()-Ask;
      }
   }
   
   return(p/Point/mp);
}

void SetLabel(string name, int x, int y, string text, color col, string font, int fontsize)
{
   ObjectDelete(name);
   
   ObjectCreate(name,OBJ_LABEL, 0, 0, 0);
   ObjectSet(name,OBJPROP_COLOR,col);
   ObjectSet(name, OBJPROP_CORNER,Corner);
   ObjectSet(name, OBJPROP_XDISTANCE, x);
   ObjectSet(name, OBJPROP_YDISTANCE, y);
   ObjectSetText(name,text, fontsize, font, col);
}

 


@bernard.boshoff