trade_protector-1.0_v1

trade_protector-1.0_v1
Orders Execution
Checks for the total of open ordersIt can change open orders parameters, due to possible stepping strategy
Miscellaneous
Uses files from the file systemIt writes information to file
0 Views
0 Downloads
0 Favorites
trade_protector-1.0_v1
// trade assistant - to watch after SL's for your trades
// some ideas and code fragments: "S.Projects" - "cortex.snowcron.com"


/*
Ïîäðîáíî:
http://codebase.mql4.com/6043
http://codebase.mql4.com/ru/6052
Ïåðåâîä:
Äåíèñ Îðëîâ
http://denis-or-love.narod.ru
http://codebase.mql4.com/ru/author/denis_orlov
*/




extern int logging=1;
//logging=1  - åñëè Âû õîòèòå âåñòè ëîã â êàòàëîãå Experts\Files
extern int nTrailingStop=35;
//nTrailingStop [pips] - íà÷àëüíûé òðåéëèíã ñòîï. Îí áóäåò èñïîëüçîâàòüñÿ, ïîêà âàøà òîðãîâëÿ íå äîñòèãíåò ïðèáûëè = nPropSLThreshold 
extern int nPropSLThreshold=12;
//nPropSLThreshold [pips] -  ïîñëå äîñòèæåíèÿ ýòîé ïðèáûëè áóäåò èñïîëüçîâàòüñÿ ïðîïîðöèîíàëüíûé òðåéëèíã ñòîï 
extern double dPropSLRatio=0.35;
//dPropSLRatio [decimal] - Êîýôôèöèåíò  ( dPropSLRatio [äåñÿòè÷íîå ÷èñëî] - Êîýôôèöèåíò (PropSL = Ïðèáûëü * Êîýôôèöèåíò - Ñïðýä))
extern int nUseEscape=0;
//nUseEscape [ 1 or 0 ] - ïîêèíóòü íåóäà÷íûå ïîçèöèè, êàê òîëüêî îíè äîñòèãàþò íåêîòîðîé ìèíèìàëüíîé ïðèáûëè
extern int nEscapeLevel=0;
//nEscapeLevel [pips] - ðàçìåð óáûòêà (ïðîñàäêè) ïîñëå êîòîðîãî ìû áû ðåøèëè ïîêèíóòü ïîçèöèþ ñðàçó ïîñëå 
//ïîëó÷åíèÿ ïðèáûëè nEscapeTP
extern int nEscapeTP=35;
//nEscapeTP [pips] - óðîâåíü ïðèáûëè â ïóíêòàõ 
//(Âû ìîæåòå óñòàíîâèòü â îòðèöàòåëüíîå çíà÷åíèå - òîãäà ýòî áóäåò óðîâåíü óáûòêà, 
//äî êîòîðîãî Âû áûëè áû ñ÷àñòëèâû äîáðàòüñÿ è çàêðûòüñÿ, â ñëó÷àå, 
//åñëè âàøà òîðãîâëÿ äîñòèãëà âíóøèòåëüíîé ïðîñàäêè).

double dEscapeLevel;
double dStopLoss;
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;
extern int nSlip = 2;
int nBarsSinceTrade=0;

string strExpert = "tp-1.0.0";

// ------

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;

   return(0);
}

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

// ------

int start()
{ 
 
   // ------
   // to let MT rest a bit after new bar:
   // Sleep(2500);
   // 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;
  
   for(int nCnt = 0; nCnt < OrdersTotal(); nCnt++)
   {
      OrderSelect(nCnt, SELECT_BY_POS, MODE_TRADES);
      if(true) //(OrderMagicNumber() == nMagic)
      {
         if(OrderType() == OP_BUY)
         { 
            dSl=OrderStopLoss();
            if( dSl == 0 )
            dSl = dnBid - dTrailingStop;
   
            arrSL[0]=dSl; 
            arrSL[1]=dSl; 
            arrSL[2]=dSl;
            arrSL[3]=dSl;
 
            LogSL("OP_BUY-check",dSl,arrSL[0],arrSL[1],arrSL[2],arrSL[3]);
   
            // if( Bid > OrderOpenPrice() + dMaSLDelta )
            // arrSL[3]=OrderOpenPrice() + dMaSLDelta;
 
 
            if( dPropSLRatio > 0 ) 
            {
               if( Bid > (OrderOpenPrice() + dPropSLThreshold) )
               {
                  dSl = NormalizeDouble( OrderOpenPrice() + dPropSLRatio*(Bid - OrderOpenPrice()) - dSpread,4 ); 
                  if(OrderStopLoss() < dSl)
                  arrSL[1]=dSl;
               } 
            }
 
            if(Bid < OrderOpenPrice() + 4*dSpread )
            {
               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", 8888, 8888, 0, nBarsSameTrend, OrderOpenPrice(), dSl);
               }
 
            // 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", 8888, 8888, 0, nBarsSameTrend, OrderOpenPrice(), dSl);
            }
 
         } // end OP_BUY

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

         if(OrderType() == OP_SELL)
         {
            dSl=OrderStopLoss();
            if( dSl == 0 )
            dSl = dnAsk + dTrailingStop;
            arrSL[0]=dSl; 
            arrSL[1]=dSl; 
            arrSL[2]=dSl;
            arrSL[3]=dSl;
 
            nBarsSinceTrade=GlobalVariableGet("tp-100-BarsSinceTrade") + 1;
            GlobalVariableSet("tp-100-BarsSinceTrade",nBarsSinceTrade);
 
 
            //if( nBarsSinceTrade >= 1 && nBarsSinceTrade < 3 )
            // if( Ask < OrderOpenPrice() - dMaSLDelta )
            // arrSL[3]=OrderOpenPrice() - dMaSLDelta;
 
            if( dPropSLRatio > 0 ) 
            {
               if( Ask < (OrderOpenPrice() - dPropSLThreshold) )
               {
                  dSl = NormalizeDouble( OrderOpenPrice() - dPropSLRatio*(OrderOpenPrice() - Ask) + dSpread,4 ); 
                  if( dSl < OrderStopLoss() )
                  arrSL[1]=dSl;
               } 
            }

            if( Ask > OrderOpenPrice() - 4*dSpread )
               arrSL[2]=dnAsk + dTrailingStop + dSpread;

            dSl=arrSL[ArrayMinimum(arrSL)];
            //if( dSl == 0 )
           // dSl = arrSL[0];
 
            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", 8888, 8888, 0, nBarsSameTrend, OrderOpenPrice(), dSl);
            }
 
            // 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", 8888, 8888, 0, nBarsSameTrend, OrderOpenPrice(), dSl);
            }
 
         } // 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, double val4, double val5, double val6)
{
   if(logging > 0 )
   { 
      int handle;
      handle=FileOpen("tp-100-log.txt",FILE_CSV|FILE_READ|FILE_WRITE,';');
      if(handle<1)
      {
         Print("File tp-100-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, 8888, "___", val1, val2, "___", val3, val4, "___", val5, val6);
      FileClose(handle);
   }
}


void LogSL(string msg, double val1, double val2, double val3, double val4, double val5)
{
   if(logging > 0 )
   { 
      int handle;
      handle=FileOpen("tp-100-log-sl.txt",FILE_CSV|FILE_READ|FILE_WRITE,';');
      if(handle<1)
      {
         Print("File tp-100-log-sl.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);
   }
}



Comments