//+------------------------------------------------------------------+
//|                                          Basic_Trailing_Stop.mq4 |
//|                                                         Inovance |
//|                                     https://www.inovancetech.com |
//+------------------------------------------------------------------+
#property copyright "Biplob Das"
#property description "Bip's Harpoon"
#property version   "1.00"
#property strict
//--- EA Inputs
extern int      slippage           = 3;           // Maximum Slippage (pips)
extern  int      magicNumber        = 12312;  // Magic Number
extern double Lot=0.03;
extern bool Auto_Bar_Range=False;
extern datetime Trend_Start_Time=D'2017.09.20 21:00';
extern bool Buy_Mode=False;
extern bool Sell_Mode=True;
double   stopLossPips;
int BarRange;
double HighestPoint;
double LowestPoint;
double buyTrailingStop;
double sellTrailingStop;
bool   ordm;
double HighestPrice;
double LowestPrice;
double Fibo_23, Fibo_38, Fibo_50, Fibo_62, Fibo_78;
int Ticket_1, Ticket_2;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//| Main Loop                                                        |
void OnTick()
  {
   LongRule();
   ShortRule();
   setTrailingStop();
  }

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//--- Input of trading logic 
void LongRule()
  {
 int TrendStratBarCount=iBarShift(NULL,0,Trend_Start_Time);
 //Comment(TrendStratBarCount);
 BarRange=TrendStratBarCount+1;

 //Highest lowest finding  
 if (Auto_Bar_Range==True) BarRange=WindowFirstVisibleBar(); 
 int HighestPointCandleCount=iHighest(NULL,0,MODE_HIGH,BarRange,0);
 int LowestPointCandleCount=iLowest(NULL,0,MODE_LOW,BarRange,0);

//HigherHigh & LowerLow finding
 HighestPrice=iHigh(NULL,0,HighestPointCandleCount);
 LowestPrice=iLow(NULL,0,LowestPointCandleCount);
 
 if(Buy_Mode==True && Sell_Mode==False) {
 //Comment("LowestPrice : " +LowestPrice);
 Fibo_23=HighestPrice-(HighestPrice-LowestPrice)*0.236;                                      
 Fibo_38=HighestPrice-(HighestPrice-LowestPrice)*0.382; 
 Fibo_50=HighestPrice-(HighestPrice-LowestPrice)*0.500;
 Fibo_62=HighestPrice-(HighestPrice-LowestPrice)*0.618;
 Fibo_78=HighestPrice-(HighestPrice-LowestPrice)*0.786;
 //First Time Touch ensuring
 int HigherLowCandleCount=iLowest(NULL,0,MODE_LOW,HighestPointCandleCount,0);
 
 //Order Open
 int total=OrdersTotal();
 if(total<1){
 //For Buy Entry
 if(Ask<Fibo_23 && Ask>Fibo_23-0.0004 && HigherLowCandleCount==0 && iOpen(NULL,0,0)>Ask)   {
 Ticket_1=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_38,Fibo_23+(Fibo_23-Fibo_38)*0.618,"Harpoon",magicNumber,0,Green);
 Ticket_2=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_38,Fibo_23+(Fibo_23-Fibo_38),"Harpoon",magicNumber,0,Green);
 stopLossPips=(Fibo_23-Fibo_38)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_23-Fibo_38)*100000;
                                                                                           }
 //Comment(Fibo_23+Fibo_23-Fibo_38);
 if(Ask<Fibo_38 && Ask>Fibo_38-0.0004 && HigherLowCandleCount==0 && iOpen(NULL,0,0)>Ask)   {
 Ticket_1=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_50,Fibo_38+(Fibo_23-Fibo_38)*0.50,"Harpoon",magicNumber,0,Green);
 Ticket_2=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_50,Fibo_23,"Harpoon",magicNumber,0,Green);
 stopLossPips=(Fibo_38-Fibo_50)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_38-Fibo_50)*100000;
                                                                                           }    

 if(Ask<Fibo_50 && Ask>Fibo_50-0.0004 && HigherLowCandleCount==0 && iOpen(NULL,0,0)>Ask)   {
 Ticket_1=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_62,Fibo_50+(Fibo_38-Fibo_50)*0.50,"Harpoon",magicNumber,0,Green);
 Ticket_2=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_62,Fibo_38,"Harpoon",magicNumber,0,Green);
 stopLossPips=(Fibo_50-Fibo_62)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_50-Fibo_62)*100000;
                                                                                           }
  
 if(Ask<Fibo_62 && Ask>Fibo_62-0.0004 && HigherLowCandleCount==0 && iOpen(NULL,0,0)>Ask)   {
 Ticket_1=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_78,Fibo_62+(Fibo_50-Fibo_62)*0.50,"Harpoon",magicNumber,0,Green);
 Ticket_2=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,Fibo_78,Fibo_50,"Harpoon",magicNumber,0,Green);
 stopLossPips=(Fibo_62-Fibo_78)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_62-Fibo_78)*100000;
                                                                                          }

 if(Ask<Fibo_78 && Ask>Fibo_78-0.0004 && HigherLowCandleCount==0 && iOpen(NULL,0,0)>Ask)   {
 Ticket_1=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,HighestPrice,Fibo_62,"Harpoon",magicNumber,0,Green);
 Ticket_2=OrderSend(Symbol(),OP_BUY,Lot,Ask,slippage,HighestPrice,Fibo_78+(Fibo_78-LowestPrice)*0.90,"Harpoon",magicNumber,0,Green);
 stopLossPips=(Fibo_78-LowestPrice)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_78-LowestPrice)*100000;
                                                                                          }                   
                     
            }   
                                        }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ShortRule()
  {
 int TrendStratBarCount=iBarShift(NULL,0,Trend_Start_Time);
 //Comment(TrendStratBarCount);
 BarRange=TrendStratBarCount+1;

 //Highest lowest finding  
 if (Auto_Bar_Range==True) BarRange=WindowFirstVisibleBar(); 
 int HighestPointCandleCount=iHighest(NULL,0,MODE_HIGH,BarRange,0);
 int LowestPointCandleCount=iLowest(NULL,0,MODE_LOW,BarRange,0);

//HigherHigh & LowerLow finding
 HighestPrice=iHigh(NULL,0,HighestPointCandleCount);
 LowestPrice=iLow(NULL,0,LowestPointCandleCount);
 
 Fibo_23=LowestPrice+(HighestPrice-LowestPrice)*0.236;                                      
 Fibo_38=LowestPrice+(HighestPrice-LowestPrice)*0.382; 
 Fibo_50=LowestPrice+(HighestPrice-LowestPrice)*0.500;
 Fibo_62=LowestPrice+(HighestPrice-LowestPrice)*0.618;
 Fibo_78=LowestPrice+(HighestPrice-LowestPrice)*0.786;

 
 //First Time Touch ensuring
 int LowerHighCandleCount=iHighest(NULL,0,MODE_HIGH,LowestPointCandleCount,0);
 //Comment(LowerHighCandleCount);
 //Order Open
 int total=OrdersTotal();
 if(total<1){
 //Comment((Fibo_23-Fibo_38)/2);
 if(Bid>Fibo_23 && Bid<Fibo_23+0.0004 && LowerHighCandleCount==0 && iOpen(NULL,0,0)<Bid)   {
 Ticket_1=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_38,Fibo_23-(Fibo_38-Fibo_23)*0.618,"Harpoon",magicNumber,0,Red);
 Ticket_2=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_38,Fibo_23-(Fibo_38-Fibo_23),"Harpoon",magicNumber,0,Red);
 stopLossPips=(Fibo_38-Fibo_23)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_38-Fibo_23)*100000;
                                                                                           }
 //Comment(Fibo_23+Fibo_23-Fibo_38);
 if(Bid>Fibo_38 && Bid<Fibo_38+0.0004 && LowerHighCandleCount==0 && iOpen(NULL,0,0)<Bid)   {
 Ticket_1=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_50,Fibo_38-(Fibo_50-Fibo_38)*0.50,"Harpoon",magicNumber,0,Red);
 Ticket_2=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_50,Fibo_23,"Harpoon",magicNumber,0,Red);
 stopLossPips=(Fibo_50-Fibo_38)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_50-Fibo_38)*100000;
                                                                                           }    

 if(Bid>Fibo_50&& Bid<Fibo_50+0.0004 && LowerHighCandleCount==0 && iOpen(NULL,0,0)<Bid)   {
 Ticket_1=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_62,Fibo_50-(Fibo_62-Fibo_50)*0.50,"Harpoon",magicNumber,0,Red);
 Ticket_2=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_62,Fibo_38,"Harpoon",magicNumber,0,Red);
 stopLossPips=(Fibo_62-Fibo_50)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_62-Fibo_50)*100000;
                                                                                          }
  
 if(Bid>Fibo_62&& Bid<Fibo_62+0.0004 && LowerHighCandleCount==0 && iOpen(NULL,0,0)<Bid)   {
 Ticket_1=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_78,Fibo_62-(Fibo_78-Fibo_62)*0.50,"Harpoon",magicNumber,0,Red);
 Ticket_2=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,Fibo_78,Fibo_50,"Harpoon",magicNumber,0,Red);
 stopLossPips=(Fibo_78-Fibo_62)*10000; if(Digits==5 || Digits==3) stopLossPips=(Fibo_78-Fibo_62)*100000;
                                                                                          }

 if(Bid>Fibo_78&& Bid<Fibo_78+0.0004 && LowerHighCandleCount==0 && iOpen(NULL,0,0)<Bid)   {
 Ticket_1=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,HighestPrice,Fibo_62,"Harpoon",magicNumber,0,Red);
 Ticket_2=OrderSend(Symbol(),OP_SELL,Lot,Bid,slippage,HighestPrice,Fibo_78-(HighestPrice-Fibo_78)*0.90,"Harpoon",magicNumber,0,Red);
 stopLossPips=(HighestPrice-Fibo_78)*10000; if(Digits==5 || Digits==3) stopLossPips=(HighestPrice-Fibo_78)*100000;
                                                                                          }                                    
            }
     }
     
     
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//| Set Trailing Stop                                                |
void setTrailingStop()
  {
   for(int i=0; i<=OrdersTotal(); i++)
     {
      if(isPositionOpen())
        {
         switch(OrderType())
           {
            case OP_BUY:
               buyTrailingStop=NormalizeDouble(Ask-stopLossPips*Point,Digits);
               if(buyTrailingStop>OrderStopLoss())
                 {
                  ordm=OrderModify(OrderTicket(),OrderOpenPrice(),buyTrailingStop,OrderTakeProfit(),0,CLR_NONE);
                 }
               break;
               //---
            case OP_SELL:
               sellTrailingStop=NormalizeDouble(Bid+stopLossPips*Point,Digits);
               if(sellTrailingStop<OrderStopLoss())
                 {
                  ordm=OrderModify(OrderTicket(),OrderOpenPrice(),sellTrailingStop,OrderTakeProfit(),0,CLR_NONE);
                 }
               break;
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
//| Check for Open Positions                                         |
bool isPositionOpen()
  {
   for(int i=0; i<=OrdersTotal(); i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==magicNumber && OrderSymbol()==Symbol())
        {
         return true;
        }
     }
   return false;
  }


