Thursday 15 October 2009

TradeProtector 1.2

An updated version of the EA (expert advisor) for MT4 platform, meant as an assistant - to put SL if you wouldn't, and to make sure the winning trade will not turn into loosing when you fall asleep ;-)

Here is the code:

// trade assistant - to watch after SL's for your trades
// some ideas and code fragments: "S.Projects" - "cortex.snowcron.com"


extern int logging=1;
//logging=1  - if you want logs in Experts\Files directory
extern int nInitialSL=15;
// inital SL
extern int nTrailingStop=35;
//nTrailingStop [pips] - initial trailing stop. It will be used until your trade will reach profit = nPropSLThreshold
extern int nPropSLThreshold=12;
//nPropSLThreshold [pips] - after reaching this profit proportional trailing stop will be used
extern double dPropSLRatio=0.35;
//dPropSLRatio [decimal] - multiplying factor ( PropSL = Profit * dPropSLRatio  - Spred )
extern int nUseEscape=0;
//nUseEscape [ 1 or 0 ] - escape misplaced trades as soon as they reach some minimal profit
extern int nEscapeLevel=0;
//nEscapeLevel [pips] - lose size after which we want our trade to terminate
//as soon as it will reach next high
extern int nEscapeTP=35;
//nEscapeTP [pips] - take profit level in pips (you can set to negative value
//- then it will be a lose that you would be happy to get,
//in the case your trade reached some impressive negative pips value)
extern int nSleep=0;
//delay after new bar
extern int nSlip = 2;
//maximum price slip allowed

double dEscapeLevel;
double dInitialSL;
double dTrailingStop;
double dEscapeTP;
double dPropSLThreshold;
double dTakeProfit;
double dTakeProfitMin;
double dTakeProfitMax;
double dTakeProfitT;
int nBars, nSpread, nDigits, nBarsSameTrend, nCloseErr, nOpenErr, i;

double dDeltaPrice, dnBid, dnAsk, dSpread, dStopLevel, dMax, dMin, dMacdDelta, dMacd1, dMacd2;

// double dOldBalance, dNewBalance;

int nTakeProfitMax=100;

int nBarsSinceTrade=0;

string strExpert;


// ------

int init ()
{
   nBars = Bars;
   nSpread = MarketInfo(Symbol(), MODE_SPREAD);
   dSpread = NormalizeDouble(nSpread * Point,4);
   nDigits = MarketInfo(Symbol(), MODE_DIGITS);
   dEscapeTP = NormalizeDouble(nEscapeTP * Point,4); 

   dEscapeLevel = nEscapeLevel * Point;
  
   strExpert = "tp-1.2.0-"+Symbol()+"-"+Period();

   return(0);
}

// ------
int deinit()
{
   return(0);
}

// ------

int start()
{

   // ------
   // to let MT rest a bit after new bar:
   Sleep(nSleep*1000);
   if(nSleep > 0)
      RefreshRates();
  
  
   dnBid=NormalizeDouble(Bid,nDigits);
   dnAsk=NormalizeDouble(Ask,nDigits);

   ModifyOrders();

   // ------

   return(0);
}


// ------

void ModifyOrders()
{
   double dSl;
   double arrSL[4];
   double arrTP[4];

   dTrailingStop = NormalizeDouble(nTrailingStop * Point,4);
   dEscapeTP = NormalizeDouble(nEscapeTP * Point,4);
   dPropSLThreshold = nPropSLThreshold * Point;
   dSpread = MarketInfo(Symbol(),MODE_SPREAD) * Point;
   dStopLevel = MarketInfo(Symbol(),MODE_STOPLEVEL) * Point;
   dInitialSL = NormalizeDouble(nInitialSL * Point,4);
 
   for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
   {
      OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderSymbol() == Symbol() ) //(OrderMagicNumber() == nMagic)
      {
         if(OrderType() == OP_BUY)
         {
            dSl=OrderStopLoss();
            if( dSl == 0 )
               if( dInitialSL != 0)
                  dSl = dnAsk - dInitialSL;
           
            ArrayResize(arrSL,5);
            ArrayInitialize(arrSL,dSl);

            LogSL("OP_BUY-check",dSl,arrSL[0],arrSL[1],arrSL[2],arrSL[3]);


            if( dPropSLRatio > 0 )
            {
               if( Bid >= (OrderOpenPrice() + dPropSLThreshold) )
               {
                  dSl = NormalizeDouble( OrderOpenPrice() + dPropSLRatio*(Bid - OrderOpenPrice()) - dSpread,4 );
                  if(OrderStopLoss() < dSl)
                  arrSL[1]=dSl;
               }
               else
               {
                  if(dTrailingStop != 0)
                     arrSL[2]=dnBid - dTrailingStop;
               }
            }              
           

            dSl=arrSL[ArrayMaximum(arrSL)];

            LogSL("OP_BUY - max",dSl,arrSL[0],arrSL[1],arrSL[2],arrSL[3]);

            if( dSl > OrderStopLoss() || OrderStopLoss() == 0 )
               {
                  OrderModify(OrderTicket(), OrderOpenPrice(),
                     dSl, OrderTakeProfit(), 0, Yellow);
                  Log("Buy - modify", OrderOpenPrice(), dSl, OrderTakeProfit());
               }

            // Escape buy
            //if( dEscape != 0 && dnBid < OrderOpenPrice() - dEscape - 5 * Point )
            if( nUseEscape == 1 && dnBid < OrderOpenPrice() - dEscapeLevel - 5 * Point )
            {
               OrderModify(OrderTicket(), OrderOpenPrice(),
               OrderStopLoss(), OrderOpenPrice() + dEscapeTP, 0, Aqua);
               Log("Buy - EscapeLevel", OrderOpenPrice(), dSl, OrderTakeProfit());
            }

         } // end OP_BUY

//////////////////////////////////////////////////////////////////////////////////////////////////

         if(OrderType() == OP_SELL)
         {
            dSl=OrderStopLoss();
            if( dSl == 0 )
               if( dInitialSL != 0)
                  dSl = dnBid + dInitialSL;
           
            ArrayResize(arrSL,5);
            ArrayInitialize(arrSL,dSl);
 
            LogSL("OP_SELL-check",dSl,arrSL[0],arrSL[1],arrSL[2],arrSL[3]);

            if( dPropSLRatio > 0 )
            {
               if( Ask <= (OrderOpenPrice() - dPropSLThreshold) )
               {
                  dSl = NormalizeDouble(OrderOpenPrice() - dPropSLRatio*(OrderOpenPrice() - Ask) + dSpread,4);
                  if(OrderStopLoss() > dSl)
                  arrSL[1]=dSl;
               }
               else
               {
                  if(dTrailingStop != 0)
                     arrSL[2]=dnBid + dTrailingStop;
               }
            }

            dSl=arrSL[ArrayMinimum(arrSL)];

            LogSL("OP_SELL - min",dSl,arrSL[0],arrSL[1],arrSL[2],arrSL[3]);

            if( dSl < OrderStopLoss() || OrderStopLoss() == 0 )
            {
               OrderModify(OrderTicket(), OrderOpenPrice(),
                  dSl, OrderTakeProfit(), 0, Yellow);
               Log("Sell - modify", OrderOpenPrice(), dSl, OrderTakeProfit());
            }

            // Escape sell
            //if( dEscape != 0 && dnAsk > OrderOpenPrice() + dEscape + 5 * Point )
            if( nUseEscape == 1 && dnAsk > OrderOpenPrice() + dEscapeLevel + 5 * Point )
            {
               OrderModify(OrderTicket(), OrderOpenPrice(),
               OrderStopLoss(), OrderOpenPrice() - dEscapeTP, 0, Aqua);
              
               Log("Buy - EscapeLevel", OrderOpenPrice(), dSl, OrderTakeProfit());
            }

         } // End OP_SELL
      } //end if(OrderMagicNumber() == nMagic)

   } //end for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
} // end ModifyOrders()


//////////////////////////////////////////////////////////////////////////////////////////////////


void Log(string msg, double val1, double val2, double val3)
{
   if(logging > 0 )
   {
      int handle;
      handle=FileOpen(strExpert+".log",FILE_CSV|FILE_READ|FILE_WRITE,';');
      if(handle<1)
      {
         //Print("File "+strExpert+"-log.txt not found, the last error is ", GetLastError());
         Print("File "+strExpert+"-log.txt not found, the last error is ", GetLastError());
         return(false);
      }

      FileSeek(handle, 0, SEEK_END);
      //---- add data to the end of file
      //FileWrite(handle, Year(), Month(), Day(), Hour(), Minute(), "Bid, Ask ", msg, Bid, Ask, "___", val1, val2, val3, val4, val5, val6);
      FileWrite(handle, Year(), Month(), Day(), Hour(), Minute(), msg, Bid, Ask, "___", val1, "___", val2, val3);
      FileClose(handle);
   }
}


void LogSL(string msg, double val1, double val2, double val3, double val4, double val5)
{
   if(logging > 1 )
   {
      int handle;
      handle=FileOpen(strExpert+"-sl_log.txt",FILE_CSV|FILE_READ|FILE_WRITE,';');
      if(handle<1)
      {
         Print("File "+strExpert+"-sl_log.txt not found, the last error is ", GetLastError());
         return(false);
      }
      FileSeek(handle, 0, SEEK_END);
      //---- add data to the end of file
      FileWrite(handle, Year(), Month(), Day(), Hour(), Minute(), msg, Bid, Ask, val1, val2, val3, val4, val5);
      FileClose(handle);
   }
}





3 comments:

  1. dear sir, i hope you can help me on my code..
    please advice me on which is the problem..my ea freeze with out some order neither buy or sell...

    re:One order per signal, multiple pairs

    start(){
    int flag=0;
    for(int cnt=OrdersHistoryTotal()-1;cnt<=0;cnt--)
    {
    OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY);
    if (OrderSymbol() != Symbol())continue;
    if (OrderType() == OP_BUY && MathAbs(OrderClosePrice()-OrderTakeProfit())<=Point)
    {
    Print("Previous order is Buy");
    flag=1;
    break;
    }
    if(OrderType() == OP_SELL&& MathAbs(OrderClosePrice()-OrderTakeProfit())<=Point)
    {
    Print("Previous order is Sell");
    flag=-1;
    break;
    }
    }
    //Buy conditions
    if('your conditions'&&flag!=1) OrderSend(//OP_BUY..)

    ReplyDelete
  2. So far I'cant see anything wrong. Weather your EA will place any orders depends on 'your conditions'. But is it giving an output "Previous order is..." (assuming there is any open order)?
    THe best way to see what is going on is to put logging procedure, to check how your condition is behaving. Unfortunately there is no debugging environment in MQL4, so you could watch the values of the variables. You can also use GlobalVariables to watch variables during execution.

    ReplyDelete
  3. This is my first time i visit here. I found so many entertaining stuff in your blog, especially its discussion. From the tons of comments on your posts, I guess I am not the only one having all the enjoyment here! Keep up the excellent work.
    forex brokers in uk

    ReplyDelete