Programm Trailing stop in this EA?!

 

hi @ all,


i tried a several times to programm trailing stop for the following EA.


But all tries went wrong an no TS was created by the EA.


Can u please help me to do this?


Thank u very much!!


the EA so far is:





extern string Lots_Desc = "if 0 dynamic lot is applied";
extern double Lots = 0;

extern string RiskPercentage_Desc = "actual only of Lots == 0, percentage of the risk for opening order";
extern int RiskPercentage = 0;

extern int Slippage = 2;

extern string Target_Desc = "Take Profit -- none if 0";
extern int Target = 152;

extern string Loss_Desc = "Stop Loss -- none if 0";
extern int Loss = 48;

extern int MA = 1;

extern int CCI = 10;

extern int StochasticK = 5;

extern int StochasticD = 3;

extern int StochasticS = 3;

extern string CCIDiffer_Desc = "CCIDiffer and -CCIDiffer are signal levels";
extern int CCIDiffer = 120;

extern string StochDiffer_Desc = "50 + StochDiffer and 50 - StochDiffer are signal levels";
extern int StochDiffer = 20;

extern string MaxOrders_Desc = "no limit if 0";
extern int MaxOrders = 1;
extern bool UseTrailingStop = false;
extern int TrailingStopLong = 20;
extern int TrailingStopShort = 20;
extern int TrailingStopact = 0;

double LotsToBid;
string symbol;

void CloseBuys(int MagicNumber, int Slippage)
{
for(int i = 0; i < OrdersTotal(); i++)
{
// already closed
if(OrderSelect(i, SELECT_BY_POS) == false) continue;
// not current symbol
if(OrderSymbol() != Symbol()) continue;
// order was opened in another way
if(OrderMagicNumber() != MagicNumber) continue;


if(OrderType() == OP_BUY)
{
if(OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Blue))
{
i--;
}
RefreshRates();
}
}
}

void CloseSells(int MagicNumber, int Slippage)
{
for(int i = 0; i < OrdersTotal(); i++)
{
// already closed
if(OrderSelect(i, SELECT_BY_POS) == false) continue;
// not current symbol
if(OrderSymbol() != Symbol()) continue;
// order was opened in another way
if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == OP_SELL)
{
if (OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red))
{
i--;
}
RefreshRates();
}
}
}

int GetOrdersCount(int MagicNumber, int Type)
{
int count = 0;

for(int i = 0; i < OrdersTotal(); i++)
{
// already closed
if(OrderSelect(i, SELECT_BY_POS) == false) continue;
// not current symbol
if(OrderSymbol() != Symbol()) continue;
// order was opened in another way
if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == Type)
{
count++;
}
}

return (count);
}

double GetLotsToBid(int RiskPercentage)
{
double margin = MarketInfo(Symbol(), MODE_MARGINREQUIRED);
double minLot = 0.01;
double maxLot = 1.0;
double account = AccountFreeMargin();

double percentage = account*RiskPercentage/100;

double lots = MathRound(10*percentage/margin)/10;

if(lots < minLot)
{
lots = minLot;
}

if(lots > maxLot)
{
lots = maxLot;
}

return (lots);
}

void OpenBuy()
{
double TP = 0;
if (Target > 0)
{
TP = Bid + Target*Point;
}

double SL = 0;
if (Loss > 0)
{
SL = Bid - Loss*Point;
}

if (Lots == 0) LotsToBid = GetLotsToBid(RiskPercentage);

OrderSend(Symbol(), OP_BUY, LotsToBid, Ask, Slippage, SL, TP, NULL, STUPID, 0, Blue);
}

void OpenSell()
{
double TP = 0;
if (Target > 0)
{
TP = Ask - Target*Point;
}

double SL = 0;
if (Loss > 0)
{
SL = Ask + Loss*Point;
}

if (Lots == 0) LotsToBid = GetLotsToBid(RiskPercentage);

OrderSend(Symbol(), OP_SELL, LotsToBid, Bid, Slippage, SL, TP, NULL, STUPID, 0, Red);
}



void Check()
{
double ma = iMA(symbol, 0, MA, 0, MODE_LWMA, PRICE_TYPICAL, 5);
double cci = iCCI(symbol, 0, CCI, PRICE_WEIGHTED, 0);
double stoch = iStochastic(symbol, 0, StochasticK, StochasticD, StochasticS, MODE_SMA, 0, MODE_MAIN, 0);

if (cci < -CCIDiffer && stoch < 50 - StochDiffer && Open[1] > ma)
{
if (GetOrdersCount(STUPID, OP_SELL) > 0)
{
CloseSells(STUPID, Slippage);
return;
}
if (GetOrdersCount(STUPID, OP_BUY) < MaxOrders || MaxOrders == 0)
{
OpenBuy();
}
}

if (cci > CCIDiffer && stoch > 50 + StochDiffer && Close[1] < ma)
{
if (GetOrdersCount(STUPID, OP_BUY) > 0)
{
CloseBuys(STUPID, Slippage);
return;
}
if (GetOrdersCount(STUPID, OP_SELL) < MaxOrders || MaxOrders == 0)
{
OpenSell();
}
}
}

int init()
{
LotsToBid = Lots;
symbol = Symbol();
}

datetime LastTime = 0;

int start()
{
if (LastTime == 0)
{
LastTime = TimeCurrent();
return (0);
}

// Trading only when tick is opening
//if (TimeCurrent() - LastTime > 20)
{
// Check for open new orders and close current ones
Check();
LastTime = TimeCurrent();
}

return(0);
}

 

BZ

Add this function at the bottom of your EA

void MoveTrailingStopsPerMN(int iMN)
{
int icnt, itotal;

itotal=OrdersTotal();

   for(icnt=0;icnt<itotal;icnt++) 
     {                               // order loop boundary
      OrderSelect(icnt, SELECT_BY_POS, MODE_TRADES);
       // check for opened position, symbol & MagicNumber
      if(OrderType()==OP_SELL && OrderSymbol()==strSymbol  && OrderMagicNumber()==iMN)  
        {         
         if (OrderStopLoss()==0)
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
             }    
        
         if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
              {
               if(OrderStopLoss()>(Ask+Point*TrailingStop))
                  {
                   OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red);
                  }
              }
         

        }
        
        
       if(OrderType()==OP_BUY && OrderSymbol()==strSymbol  && OrderMagicNumber()==iMN)  
        { 
            if (OrderStopLoss()==0)
             {
              OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
             }
             
             if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green);
                    }
                 }
              
        }

     }  // order loop boundary

return(0);
     
}

then in your EA, somewhere it can be called fairly frequently call it with

MoveTrailingStopsPerMN(YourMagicNumber);

Then at the top of the EA add something like

extern int TrailingStop = 60;

Good luck

-BB-

Reason: