Problem with Trailing Stop

 

Hi,

I was implementing a trailing stop on an expert. I did it based on an indicator called " BBands_Stop_v2 " (I will post the code below). When a backtest the expert in a visual mode I can see the trailing stop line, but it never works, never closes my positions.

I would love if someone could tell me where I'm doing a mistake in the code.

Indicator code -

//+------------------------------------------------------------------+
//|                                               BBands_Stop_v2.mq4 |
//|                           Copyright © 2006, TrendLaboratory Ltd. |
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |
//|                                       E-mail: igorad2004@list.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, TrendLaboratory Ltd."
#property link      "http://finance.groups.yahoo.com/group/TrendLaboratory"

#property indicator_chart_window
#property indicator_buffers 6
#property indicator_color1 Chartreuse
#property indicator_color2 Orange
#property indicator_color3 Chartreuse
#property indicator_color4 Orange
#property indicator_color5 Chartreuse
#property indicator_color6 Orange
//---- input parameters
extern int    Length=20;      // Bollinger Bands Period
extern double    Deviation=2;    // Deviation
extern double MoneyRisk=1.00; // Offset Factor
int    Signal=1;       // Display signals mode: 1-Signals & Stops; 0-only Stops; 2-only Signals;
int    Line=1;         // Display line mode: 0-no,1-yes  
int    Nbars=1000;
//---- indicator buffers
double UpTrendBuffer[];
double DownTrendBuffer[];
double UpTrendSignal[];
double DownTrendSignal[];
double UpTrendLine[];
double DownTrendLine[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
  int init()
  {
   string short_name;
//---- indicator line
   
   SetIndexBuffer(0,UpTrendBuffer);
   SetIndexBuffer(1,DownTrendBuffer);
   SetIndexBuffer(2,UpTrendSignal);
   SetIndexBuffer(3,DownTrendSignal);
   SetIndexBuffer(4,UpTrendLine);
   SetIndexBuffer(5,DownTrendLine);
   SetIndexStyle(0,DRAW_NONE);
   SetIndexStyle(1,DRAW_NONE);
   SetIndexStyle(2,DRAW_NONE);
   SetIndexStyle(3,DRAW_NONE);
   SetIndexStyle(4,DRAW_LINE);
   SetIndexStyle(5,DRAW_LINE);
  // SetIndexArrow(0,159);
  // SetIndexArrow(1,159);
  // SetIndexArrow(2,108);
  // SetIndexArrow(3,108);
  // IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
  
//---- name for DataWindow and indicator subwindow label
   short_name="BBands Stop("+Length+","+Deviation+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"UpTrend Stop");
   SetIndexLabel(1,"DownTrend Stop");
   SetIndexLabel(2,"UpTrend Signal");
   SetIndexLabel(3,"DownTrend Signal");
   SetIndexLabel(4,"UpTrend Line");
   SetIndexLabel(5,"DownTrend Line");
//----
   SetIndexDrawBegin(0,Length);
   SetIndexDrawBegin(1,Length);
   SetIndexDrawBegin(2,Length);
   SetIndexDrawBegin(3,Length);
   SetIndexDrawBegin(4,Length);
   SetIndexDrawBegin(5,Length);
//----
   return(0);
  }

//+------------------------------------------------------------------+
//| Bollinger Bands_Stop_v1                                             |
//+------------------------------------------------------------------+
int start()
  {
   int    limit;
   int    counted_bars=IndicatorCounted();
   //---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   
   int    i,shift,trend;
   double smax[25000],smin[25000],bsmax[25000],bsmin[25000];
   limit=Bars-counted_bars;
   if (limit < Nbars) limit = Nbars;
      
   for (shift=limit;shift>=0;shift--)
   {
   UpTrendBuffer[shift]=0;
   DownTrendBuffer[shift]=0;
   UpTrendSignal[shift]=0;
   DownTrendSignal[shift]=0;
   UpTrendLine[shift]=EMPTY_VALUE;
   DownTrendLine[shift]=EMPTY_VALUE;
   }
   
   for (shift=limit-Length-1;shift>=0;shift--)
   {    
     smax[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_UPPER,shift);
          smin[shift]=iBands(NULL,0,Length,Deviation,0,PRICE_CLOSE,MODE_LOWER,shift);
        
          if (Close[shift]>smax[shift+1]) trend=1; 
          if (Close[shift]<smin[shift+1]) trend=-1;
                        
          if(trend>0 && smin[shift]<smin[shift+1]) smin[shift]=smin[shift+1];
          if(trend<0 && smax[shift]>smax[shift+1]) smax[shift]=smax[shift+1];
                  
          bsmax[shift]=smax[shift]+0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
          bsmin[shift]=smin[shift]-0.5*(MoneyRisk-1)*(smax[shift]-smin[shift]);
                
          if(trend>0 && bsmin[shift]<bsmin[shift+1]) bsmin[shift]=bsmin[shift+1];
          if(trend<0 && bsmax[shift]>bsmax[shift+1]) bsmax[shift]=bsmax[shift+1];
          
          if (trend>0) 
          {
             if (Signal>0 && UpTrendBuffer[shift+1]==-1.0)
             {
             UpTrendSignal[shift]=bsmin[shift];
             UpTrendBuffer[shift]=bsmin[shift];
             if(Line>0) UpTrendLine[shift]=bsmin[shift];
             }
             else
             {
             UpTrendBuffer[shift]=bsmin[shift];
             if(Line>0) UpTrendLine[shift]=bsmin[shift];
             UpTrendSignal[shift]=-1;
             }
          if (Signal==2) UpTrendBuffer[shift]=0;   
          DownTrendSignal[shift]=-1;
          DownTrendBuffer[shift]=-1.0;
          DownTrendLine[shift]=EMPTY_VALUE;
          }
          if (trend<0) 
          {
          if (Signal>0 && DownTrendBuffer[shift+1]==-1.0)
             {
             DownTrendSignal[shift]=bsmax[shift];
             DownTrendBuffer[shift]=bsmax[shift];
             if(Line>0) DownTrendLine[shift]=bsmax[shift];
             }
             else
             {
             DownTrendBuffer[shift]=bsmax[shift];
             if(Line>0)DownTrendLine[shift]=bsmax[shift];
             DownTrendSignal[shift]=-1;
             }
          if (Signal==2) DownTrendBuffer[shift]=0;    
          UpTrendSignal[shift]=-1;
          UpTrendBuffer[shift]=-1.0;
          UpTrendLine[shift]=EMPTY_VALUE;
          }
          
         }
        return(0);      
}

my Expert Code:

void CheckForClose()
   {
    double  BuyTrailingStop= iCustom(Symbol(),0,"BBands_Stop_v2",Length,Deviation,MoneyRisk,4,0);
    double  SellTrailingStop= iCustom(Symbol(),0,"BBands_Stop_v2",Length,Deviation,MoneyRisk,5,0);
      
   //-----
   for(int cnt=0; cnt < OrdersTotal(); cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()==OP_SELL &&   // check for opened SELL position 
      OrderSymbol()==Symbol())  // check for symbol
         {
         OrderModify(OrderTicket(),
                     OrderOpenPrice(),
                     Bid + (SellTrailingStop*Point),
                     OrderTakeProfit(),
                     0,
                     Red); 
         }
         
         else
         {
         Print("Error closing order : ",(GetLastError()));
         }
         
         
      if(OrderType()==OP_BUY &&   // check for opened BUY position 
      OrderSymbol()==Symbol())  // check for symbol
         {
         OrderModify(OrderTicket(),
                     OrderOpenPrice(),
                     Ask - (BuyTrailingStop*Point),
                     OrderTakeProfit(),
                     0,
                     Green); 
         }   
         
         else
         {
         Print("Error closing order : ",(GetLastError()));
         }
         
      }

   } 
 
OrderModify(OrderTicket(),
                     OrderOpenPrice(),
                     Bid + (SellTrailingStop*Point),
                     OrderTakeProfit(),
                     0,
                     Red); 

//i think

OrderModify(OrderTicket(),
                     OrderOpenPrice(),
                     SellTrailingStop,
                     OrderTakeProfit(),
                     0,
                     Red); 
//didn't even checked
 

on second thought

i dont c Where you define this 3 var. (Length,Deviation,MoneyRisk)

what error u get?

Can you compile it?

 

R

You are confusing a Points gap with a price level - something like this might work

void CheckForClose()
   {
    double  BuyTrailingStop= iCustom(Symbol(),0,"BBands_Stop_v2",Length,Deviation,MoneyRisk,4,0);
    double  SellTrailingStop= iCustom(Symbol(),0,"BBands_Stop_v2",Length,Deviation,MoneyRisk,5,0);
      
   //-----
   for(int cnt=0; cnt < OrdersTotal(); cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()==OP_SELL &&   // check for opened SELL position 
      OrderSymbol()==Symbol())  // check for symbol
         {
           if (OrderStopLoss()==0)
             {
                if (SellTrailingStop < OrderOpenPrice())
                  OrderModify(OrderTicket(), OrderOpenPrice(),  SellTrailingStop,  OrderTakeProfit(), 0,  Red); 
             }
           else
             {
               if (SellTrailingStop < OrderStopLoss())
                  OrderModify(OrderTicket(), OrderOpenPrice(),  SellTrailingStop,  OrderTakeProfit(), 0,  Red); 
             }
         }
         
         else
         {
         Print("Error closing order : ",(GetLastError()));
         }
         
         
      if(OrderType()==OP_BUY &&   // check for opened BUY position 
      OrderSymbol()==Symbol())  // check for symbol
         {
          if (OrderStopLoss()==0)
             {
               if (BuyTrailingStop > OrderOpenPrice())
                 OrderModify(OrderTicket(), OrderOpenPrice(), BuyTrailingStop, OrderTakeProfit(), 0, Green); 
             }
         else
             {
              if (BuyTrailingStop > OrderStopLoss())
                 OrderModify(OrderTicket(), OrderOpenPrice(), BuyTrailingStop, OrderTakeProfit(), 0, Green); 
      
             }
         }   
         
         else
         {
         Print("Error closing order : ",(GetLastError()));
         }
         
      }

   } 

Good Luck

-BB-

 
qjol:

on second thought

i dont c Where you define this 3 var. (Length,Deviation,MoneyRisk)

what error u get?

Can you compile it?


I can compile it. It is on the top of the expert (external).

Thanks for your help. Always trying to help me out with my mistakes.

The BarrowBoy is correct, and his formula worked well. I will study it to understand better. Thanks a lot BarrowBoy for your help.

 
rodrigosm:


I can compile it. It is on the top of the expert (external).

Thanks for your help. Always trying to help me out with my mistakes.

The BarrowBoy is correct, and his formula worked well. I will study it to understand better. Thanks a lot BarrowBoy for your help.


Look at my first suggestion
 
qjol:

Look at my first suggestion

Yeah, I saw it. But I already tried it before and it did not work. For this reason I insert the “Point” on the formula (which was a mistake).

Reason: