Navigation:Home > Content >

RSI_R2_EA_v2.1.mq4

Time: 2012-10-12 | Download file:RSI_R2_EA_v2.1.mq4

//+------------------------------------------------------------------+
//|                                                                  |
//|             RSI-R2.mq4 - Ver 1.0 @ 03/22/2007 by Bluto           |
//|                                                                  |
//|  Changes by Robert Hill                                          |
//|  4/3/2007 added input for RSI_Period                             |
//|           Modified code for MagicNumber calculation              |
//|           Added function to set value for RSI_Period             |
//|           Set value of AssignRSI to false during optimization    |
//|           Use optimized value in function AssignRSI_Period       |
//|           Set value of AssignRSI to true when running live       |
//|  4/5/2007 Fixed bug that caused no more trades after a stoploss  |
//|           added 2 variable to hold pSar values to reduce calls   |
//|           Added GetLots as a function using MM code from start   |
//|  4/6/2007 Combined with RSI_R2_AnyTimeFrame_Optimzable.mq4       |
//|           Made more modular                                      |
//|           Added code for possible MA Angle filter                |
//|           Added 7 Trailing stop functions for testing            |
//|           Combined Bluots open trade code with mine              |
//| 4/15/2007 Added optimized values for RSI period from bluto       |
//|           Added change to moneymanagement from bluto             |
//| 4/16/2007 Added code to check RSI 4 bars back for confirmation   |
//|           Added new exit ideas from Gideon                       |
//|           Both are selectable by input switches.                 | 
//+------------------------------------------------------------------+


#property copyright "Bluto"
#property link      "None"
#include 

// This makes code easier to read
#define AUDCAD 1
#define AUDJPY 2
#define AUDNZD 3
#define AUDUSD 4
#define CHFJPY 5
#define EURAUD 6
#define EURCAD 7
#define EURCHF 8
#define EURGBP 9
#define EURJPY 10
#define EURUSD 11
#define GBPCHF 12
#define GBPJPY 13
#define GBPUSD 14
#define NZDJPY 15
#define NZDUSD 16
#define USDCAD 17
#define USDCHF 18
#define USDJPY 19
#define UNEXPECTED 999

extern string  Expert_Name    = "---- RSI_R2_EA_v2.0 ----";
//+---------------------------------------------------+
//|Money Management                                   |
//+---------------------------------------------------+
extern double  LotSize=1.0;
extern double  RiskPercent=2.0;
extern bool    UseMoneyMgmt=false;
extern bool    BrokerPermitsFractionalLots = true;

//+---------------------------------------------------+
//|Indicator Variables                                |
//| Change these to try your own system               |
//| or add more if you like                           |
//+---------------------------------------------------+
extern string  mi="--Moving Average settings--";
extern int     MaTrend_Period = 200;

extern string  ri="--RSI settings--";
extern int     RSI_Period = 4;       // input value to be optimized
extern bool    UseDefaultRSI_Period = false;
extern int     BuyWhenRsiBelow = 65;
extern int     SellWhenRsiAbove = 35;
extern double  RSI_Overbought_Value = 75.0; 
extern double  RSI_Oversold_Value = 25.0;
// Added to test confirmation of trend
extern int     useRSI4BarsBack = 0;
extern int     BuyWhenAbove = 55;
extern int     SellWhenBelow = 45;
// Added to test new exit strategy
extern int     useNewExitStrategy = 0;
extern int     RSI_High_OverBought_Exit = 98;
extern int     RSI_Low_OverSold_Exit = 2;
// Added Blutos newest exit using Price close vs SMA 200
extern int     use200SMA_Exit = 1;

extern string  st1="--Signal_TimeFrame--";
extern int     Signal_TimeFrame = 0;

// Added this for possible filter for flat markets
extern string  ai="--Moving Average Angle filter settings--";
extern string  a2=" Set switch to 1 to use filter";
extern int     useMaAngleFilter = 0;
extern int     TrendTimeFrame = 0;
extern double  Threshold=20;
extern int     PrevShift=3;
extern int     CurShift=1;
//+---------------------------------------------------+
//|Profit controls                                    |
//+---------------------------------------------------+
extern string  st6 = "--Profit Controls--";
extern double  StopLoss=0;
extern double  TakeProfit=700;
extern int     useBlutoStopTakeFunctions = 0;
extern int     Slippage=3;

extern string  tsp0 = "--Trailing Stop Types--";
extern string  tsp1 = " 1 = Trail immediately";
extern string  tsp2 = " 2 = Wait to trail";
extern string  tsp3 = " 3 = Uses 3 levels before trail";
extern string  tsp4 = " 4 = Breakeven + Lockin";
extern string  tsp5 = " 5 = Step trail";
extern string  tsp6 = " 6 = EMA trail";
extern string  tsp7 = " 7 = pSAR trail";
extern string  tsp8 = " 8 = Blutos pSar trail";
extern bool    UseTrailingStop = true;
extern int     TrailingStopType = 8;

extern string  ts2 = "Settings for Type 2";
extern double  TrailingStop = 15;      // Change to whatever number of pips you wish to trail your position with.

extern string  ts3 = "Settings for Type 3";
extern double  FirstMove = 20;        // Type 3  first level pip gain
extern double  FirstStopLoss = 50;    // Move Stop to Breakeven
extern double  SecondMove = 30;       // Type 3 second level pip gain
extern double  SecondStopLoss = 30;   // Move stop to lock is profit
extern double  ThirdMove = 40;        // type 3 third level pip gain
extern double  TrailingStop3 = 20;    // Move stop and trail from there

extern string  ts4 = "Settings for Type 4";
extern double  BreakEven = 30;
extern int     LockInPips = 1;        // Profit Lock in pips

extern string  ts5 = "Settings for Type 5";
extern int     eTrailingStop   = 10;
extern int     eTrailingStep   = 2;

extern string  ts6 = "Settings for Type 6";
extern int     EMATimeFrame    =  30;
extern int     Price           =  0;
extern int     EMAPeriod       = 13;
extern int     EMAShift        =  2;    
extern int     InitialStop     =  0;
 
extern string  ts7 = "Settings for Type 7";
extern string  pi="--pSAR settings--";
extern double  StepParabolic = 0.02;
extern double  MaxParabolic  = 0.2;
extern int     Interval      = 5;

extern string  ts8 = "Settings for Type 8";
extern string  pi2="--pSAR settings--";
extern double  SarStep = 0.02;
extern double  SarMax = 0.20;

//+---------------------------------------------------+
//|General controls                                   |
//+---------------------------------------------------+
int            MagicNumber=0;
string         setup;
int            SignalCandle = 1;
int            TradesInThisSymbol = 0;
double         MM_OrderLotSize=0;
//+---------------------------------------------------+
//|  Indicator values for signals and filters         |
//|  Add or Change to test your system                |
//+---------------------------------------------------+
int            myRSI_Period = 2;     // Used by RSI indicator call
double         RSI_Day_0 = 0, RSI_Day_1=0, RSI_Day_2=0, RSI_Day_3=0, SMA_Day3=0;



int init()
{
/*
   if (Symbol()=="AUDCADm" || Symbol()=="AUDCAD") {MagicNumber=200001;}
   if (Symbol()=="AUDJPYm" || Symbol()=="AUDJPY") {MagicNumber=200002;}
   if (Symbol()=="AUDNZDm" || Symbol()=="AUDNZD") {MagicNumber=200003;}
   if (Symbol()=="AUDUSDm" || Symbol()=="AUDUSD") {MagicNumber=200004;}
   if (Symbol()=="CHFJPYm" || Symbol()=="CHFJPY") {MagicNumber=200005;}
   if (Symbol()=="EURAUDm" || Symbol()=="EURAUD") {MagicNumber=200006;}
   if (Symbol()=="EURCADm" || Symbol()=="EURCAD") {MagicNumber=200007;}
   if (Symbol()=="EURCHFm" || Symbol()=="EURCHF") {MagicNumber=200008;}
   if (Symbol()=="EURGBPm" || Symbol()=="EURGBP") {MagicNumber=200009;}
   if (Symbol()=="EURJPYm" || Symbol()=="EURJPY") {MagicNumber=200010;}
   if (Symbol()=="EURUSDm" || Symbol()=="EURUSD") {MagicNumber=200011;}
   if (Symbol()=="GBPCHFm" || Symbol()=="GBPCHF") {MagicNumber=200012;}   
   if (Symbol()=="GBPJPYm" || Symbol()=="GBPJPY") {MagicNumber=200013;}
   if (Symbol()=="GBPUSDm" || Symbol()=="GBPUSD") {MagicNumber=200014;}
   if (Symbol()=="NZDJPYm" || Symbol()=="NZDJPY") {MagicNumber=200015;}
   if (Symbol()=="NZDUSDm" || Symbol()=="NZDUSD") {MagicNumber=200016;}
   if (Symbol()=="USDCHFm" || Symbol()=="USDCHF") {MagicNumber=200017;}
   if (Symbol()=="USDJPYm" || Symbol()=="USDJPY") {MagicNumber=200018;}
   if (Symbol()=="USDCADm" || Symbol()=="USDCAD") {MagicNumber=200019;}
   if (MagicNumber==0) {MagicNumber = 200999;}  
*/

//   MagicNumber = func_Symbol2Val(Symbol()) + 200000;
	MagicNumber = 200000 + func_Symbol2Val(Symbol())*100 + func_TimeFrame_Const2Val(Period()); 
   setup=Expert_Name + Symbol() + "_" + func_TimeFrame_Val2String(func_TimeFrame_Const2Val(Period()));
   if (UseDefaultRSI_Period)   myRSI_Period = RSI_Period; else myRSI_Period = AssignRSI_Period(Symbol());
    
 return(0);
}

int deinit()
{
 return(0);
}



int AssignRSI_Period(string symbol)
{

   int RSI = 0;
   int which = func_Symbol2Val(symbol);
   
   switch (which)
   {
        case AUDCAD : RSI = 5;
                      break;
        case AUDJPY : RSI = 7;
                      break;
        case AUDNZD : RSI = 6;
                      break;
        case AUDUSD : RSI = 4;
                      break;
        case CHFJPY : RSI = 4;
                      break;
        case EURAUD : RSI = 2;
                      break;
        case EURCAD : RSI = 3;
                      break;
        case EURCHF : RSI = 3;
                      break;
        case EURGBP : RSI = 2;
                      break;
        case EURJPY : RSI = 4;  // Optimized value
                      break;
        case EURUSD : RSI = 4;
                      break;
        case GBPCHF : RSI = 6;
                      break;
        case GBPJPY : RSI = 4;
                      break;
        case GBPUSD : RSI = 3;
                      break;
        case NZDJPY : RSI = 6;
                      break;
        case NZDUSD : RSI = 7;
                      break;
        case USDCAD : RSI = 2;
                      break;
        case USDCHF : RSI = 4;
                      break;
        case USDJPY : RSI = 4;
                      break;
        case UNEXPECTED : RSI = 4;
   }
   if (RSI == 0) RSI = 4;
   return (RSI);
}

//===================================================================
//                                                    EMA_Angle.mq4 
//                                                          jpkfox
//
// You can use this indicator to measure when the EMA angle is
// "near zero". AngleTreshold determines when the angle for the
// EMA is "about zero": This is when the value is between
// [-AngleTreshold, AngleTreshold] (or when the histogram is red).
//   EMAPeriod: EMA period 
//   AngleTreshold: The angle value is "about zero" when it is
//     between the values [-AngleTreshold, AngleTreshold].
//   StartEMAShift: The starting point to calculate the 
//     angle. This is a shift value to the left from the
//     observation point. Should be StartEMAShift > EndEMAShift.
//   StartEMAShift: The ending point to calculate the
//     angle. This is a shift value to the left from the
//     observation point. Should be StartEMAShift > EndEMAShift.
//
//  Return 1 for up OK
//  Return -1 for down OK
//  Return 0 for too flat
//===================================================================
double MA_Angle( int iPrevShift, int iCurShift, double fPrevMA, double fCurMA)
{
   double fAngle, mFactor;
   string Sym;
   int ShiftDif;
   
   mFactor = 100000.0;
   Sym = StringSubstr(Symbol(),3,3);
   if (Sym == "JPY") mFactor = 1000.0;
   ShiftDif = iPrevShift-iCurShift;
   mFactor /= ShiftDif; 

    fAngle = mFactor * (fCurMA - fPrevMA)/2.0;

    return(fAngle);
}

bool CheckTrend(int cmd)
{
	double maAngle;
	
   double MACurrent=iMA(Symbol(),TrendTimeFrame,MaTrend_Period, 0, MODE_SMA, PRICE_CLOSE,CurShift);
   double MAPrevious=iMA(Symbol(),TrendTimeFrame,MaTrend_Period, 0, MODE_SMA, PRICE_CLOSE,PrevShift);
	maAngle = MA_Angle(PrevShift, CurShift, MAPrevious, MACurrent);
   switch (cmd)
   {
      case OP_BUY : if (maAngle > Threshold) return(true);
                    break;
      case OP_SELL : if (maAngle < -Threshold) return(true);
   }
   return(false);
}

//+------------------------------------------------------------------+
//| CheckExitCondition                                               |
//| Uses OP_BUY as cmd to check exit sell                            |
//| Uses OP_SELL as cmd to check exit buy                            |
//| New exit strategy checks current RSI value for high or low       |
//| threshold and for current still less than overbought value       |
//| or greater than oversold value.                                  |
//+------------------------------------------------------------------+
bool CheckExitCondition(int cmd)
{
   double RSI, RSI_Cur;
  
   RSI = iRSI(Symbol(), Signal_TimeFrame, myRSI_Period, PRICE_CLOSE, 1);
   RSI_Cur = iRSI(Symbol(), Signal_TimeFrame, myRSI_Period, PRICE_CLOSE, 0);
   
   switch (cmd)
   {
   case OP_BUY : if ( RSI > RSI_Overbought_Value)
                 {
                    if (useNewExitStrategy == 1)
                    {
                       if (RSI_Cur < RSI_Overbought_Value || RSI_Cur >= RSI_High_OverBought_Exit ) return(true); else return(false);
                    }
                    else
                      return(true);
                 }
                 else if (use200SMA_Exit == 1)
                 {
                     if (CheckMA(OP_SELL)) return(true);
                 }
                 break;
   case OP_SELL : if (RSI < RSI_Oversold_Value)
                  {
                    if (useNewExitStrategy == 1)
                    {
                       if (RSI_Cur > RSI_Oversold_Value || RSI_Cur <= RSI_Low_OverSold_Exit ) return(true); else return(false);
                    }
                    else
                      return(true);
                  }
                  else if (use200SMA_Exit == 1)
                    {
                       if (CheckMA(OP_BUY)) return(true);
                    }
   }
   
   return (false);
}

bool CheckMA(int cmd)
{
  SMA_Day3 = iMA(Symbol(),Signal_TimeFrame,MaTrend_Period, 0, MODE_SMA, PRICE_CLOSE, 1);
  switch (cmd)
  {
  case OP_BUY : if (iClose(Symbol(),Signal_TimeFrame,1) > SMA_Day3) return(true);
                break;
  case OP_SELL : if (iClose(Symbol(),Signal_TimeFrame,1) < SMA_Day3) return (true);
  }
  return(false);
}

// Optional check of 4th bar back above 55 for buy
//  or below 45 for sell to confirm trend
bool CheckRSI(int cmd)
{

  RSI_Day_0 = iRSI(Symbol(), Signal_TimeFrame, myRSI_Period, PRICE_CLOSE, 4);
  RSI_Day_1 = iRSI(Symbol(), Signal_TimeFrame, myRSI_Period, PRICE_CLOSE, 3);
  RSI_Day_2 = iRSI(Symbol(), Signal_TimeFrame, myRSI_Period, PRICE_CLOSE, 2);
  RSI_Day_3 = iRSI(Symbol(), Signal_TimeFrame, myRSI_Period, PRICE_CLOSE, 1);
  
  switch (cmd)
  {
  case OP_BUY : if (RSI_Day_1 < BuyWhenRsiBelow && RSI_Day_2 < RSI_Day_1 && RSI_Day_3 < RSI_Day_2)
                {
                   if (useRSI4BarsBack == 1)
                   {
                      if (RSI_Day_0 > BuyWhenAbove) return(true); else return(false);
                   }
                   else
                     return(true);
                }
                break;
                
   
  case OP_SELL : if (RSI_Day_1 > SellWhenRsiAbove && RSI_Day_2 > RSI_Day_1 && RSI_Day_3 > RSI_Day_2)
                 {
                   if (useRSI4BarsBack == 1)
                   {
                      if (RSI_Day_0 < SellWhenBelow) return(true); else return(false);
                   }
                   else
                     return(true);
                 }
  }
  
  return(false);
}


//+------------------------------------------------------------------+
//| CheckEntryCondition                                              |
//+------------------------------------------------------------------+
bool CheckEntryCondition(int cmd)
{
   bool rule1, rule2, rule3;
   

   rule1 = true;
   rule2 = true;
   rule3 = true;
   
   rule1 = CheckMA(cmd);
   if (rule1)
   {
      rule2 = CheckRSI(cmd);
      if(rule2)
      {
        if (useMaAngleFilter == 1) rule3 = CheckTrend(cmd);
        if (rule3) return(true);
      }
      
   }
   return (false);
}
  
int start()
{ 

//+------------------------------------------------------------------+
//| Check for Open Position                                          |
//+------------------------------------------------------------------+

     HandleOpenPositions();
     
// Check if any open positions were not closed

     TradesInThisSymbol = CheckOpenPositions();
  
// Only allow 1 trade per Symbol

     if(TradesInThisSymbol > 0) {
       return(0);}
   
   MM_OrderLotSize = GetLots();        

	if(CheckEntryCondition(OP_BUY))
	{
		   OpenBuyOrder(MM_OrderLotSize, StopLoss,TakeProfit, Slippage, setup, MagicNumber, Green);
		   return(0);
	}

   
	if(CheckEntryCondition(OP_SELL))
	{
         OpenSellOrder(MM_OrderLotSize, StopLoss,TakeProfit, Slippage, setup, MagicNumber, Red);
	}

  return(0);
}

double GetLots()
{
// variables used for money management
double         MM_MinLotSize=0;
double         MM_MaxLotSize=0;
double         MM_LotStep=0;
double         MM_Decimals=0;
int            MM_AcctLeverage=0;
int            MM_CurrencyLotSize=0;

 double OrderLotSize;
 
//----- Money Management & Lot Sizing Stuff.

  MM_AcctLeverage = AccountLeverage();
  MM_MinLotSize = MarketInfo(Symbol(),MODE_MINLOT);
  MM_MaxLotSize = MarketInfo(Symbol(),MODE_MAXLOT);
  MM_LotStep = MarketInfo(Symbol(),MODE_LOTSTEP);
  MM_CurrencyLotSize = MarketInfo(Symbol(),MODE_LOTSIZE);

  if(MM_LotStep == 0.01) {MM_Decimals = 2;}
  if(MM_LotStep == 0.1) {MM_Decimals = 1;}

  if (UseMoneyMgmt == true)
   {
    OrderLotSize = AccountEquity() * (RiskPercent * 0.01) / (MM_CurrencyLotSize / MM_AcctLeverage);
    if(BrokerPermitsFractionalLots == true)
      OrderLotSize = StrToDouble(DoubleToStr(OrderLotSize,MM_Decimals));
    else
      OrderLotSize = MathRound(MM_OrderLotSize);
   }
   else
   {
    OrderLotSize = LotSize;
   }

  if (OrderLotSize < MM_MinLotSize) {OrderLotSize = MM_MinLotSize;}
  if (OrderLotSize > MM_MaxLotSize) {OrderLotSize = MM_MaxLotSize;}
  return(OrderLotSize);
  
}

//+------------------------------------------------------------------+
//| OpenBuyOrder                                                     |
//| If Stop Loss or TakeProfit are used the values are calculated    |
//| for each trade                                                   |
//+------------------------------------------------------------------+
int OpenBuyOrder(double mLots, double mStopLoss, double mTakeProfit, int mSlippage, string mComment, int mMagic, color mColor)
{
   int err,ticket, digits;
   double myPrice, myStopLoss = 0, myTakeProfit = 0;
   
   myPrice = MarketInfo(Symbol(), MODE_ASK);
   if (useBlutoStopTakeFunctions == 1)
   {
      myStopLoss = StopLong(Bid,mStopLoss);
      myTakeProfit = TakeLong(Bid,mTakeProfit);
   }
   else
   {
      myStopLoss = 0;
      if ( mStopLoss > 0 ) myStopLoss = myPrice - mStopLoss * Point ;
      myTakeProfit = 0;
      if (mTakeProfit>0) myTakeProfit = myPrice + mTakeProfit * Point;
   }
 // Normalize all price / stoploss / takeprofit to the proper # of digits.
   digits = MarketInfo(Symbol( ), MODE_DIGITS) ;
   if (digits > 0) 
   {
     myPrice = NormalizeDouble( myPrice, digits);
     myStopLoss = NormalizeDouble( myStopLoss, digits);
     myTakeProfit = NormalizeDouble( myTakeProfit, digits); 
   }
   ticket=OrderSend(Symbol(),OP_BUY,mLots,myPrice,mSlippage,myStopLoss,myTakeProfit,mComment,mMagic,0,mColor); 
   if (ticket > 0)
   {
    if (OrderSelect( ticket,SELECT_BY_TICKET, MODE_TRADES) ) 
     {
      Print("BUY order opened : ", OrderOpenPrice( ));
//      ModifyOrder(ticket,OrderOpenPrice( ), OrderStopLoss(), myTakeProfit);
     }
   }
   else
   {
      err = GetLastError();
      if(err==0)
      { 
         return(ticket);
      }
      else
      {
         if(err==4 || err==137 ||err==146 || err==136) //Busy errors
         {
            Sleep(5000);
         }
         else //normal error
         {
           Print("Error opening BUY order [" + setup + "]: (" + err + ") " + ErrorDescription(err)); 
         }  
      }
   }
   
   return(ticket);
}

//+------------------------------------------------------------------+
//| OpenSellOrder                                                    |
//| If Stop Loss or TakeProfit are used the values are calculated    |
//| for each trade                                                   |
//+------------------------------------------------------------------+
void OpenSellOrder(double mLots, double mStopLoss, double mTakeProfit, int mSlippage, string mComment, int mMagic, color mColor)
{
   int err, ticket, digits;
   double myPrice, myStopLoss = 0, myTakeProfit = 0;
   
   myPrice = MarketInfo(Symbol( ), MODE_BID);
   if (useBlutoStopTakeFunctions == 1)
   {
      myStopLoss = StopShort(Ask,mStopLoss);
      myTakeProfit = TakeShort(Ask,mTakeProfit);
   }
   else
   {
     myStopLoss = 0;
     if ( mStopLoss > 0 ) myStopLoss = myPrice + mStopLoss * Point;
     myTakeProfit = 0;
     if (mTakeProfit > 0) myTakeProfit = myPrice - mTakeProfit * Point;
   }
   
 // Normalize all price / stoploss / takeprofit to the proper # of digits.
   digits = MarketInfo(Symbol( ), MODE_DIGITS) ;
   if (digits > 0) 
   {
     myPrice = NormalizeDouble( myPrice, digits);
     myStopLoss = NormalizeDouble( myStopLoss, digits);
     myTakeProfit = NormalizeDouble( myTakeProfit, digits); 
   }
   ticket=OrderSend(Symbol(),OP_SELL,mLots,myPrice,mSlippage,myStopLoss,myTakeProfit,mComment,mMagic,0,mColor); 
   if (ticket > 0)
   {
     if (OrderSelect( ticket,SELECT_BY_TICKET, MODE_TRADES) ) 
     {
      Print("Sell order opened : ", OrderOpenPrice());
//      ModifyOrder(ticket,OrderOpenPrice( ), OrderStopLoss(), myTakeProfit);
     }
   }
   else
   {
      err = GetLastError();
      if(err==0)
      { 
         return(ticket);
      }
      else
      {
        if(err==4 || err==137 ||err==146 || err==136) //Busy errors
        {
           Sleep(5000);
        }
        else //normal error
        {
           Print("Error opening Sell order [" + mComment + "]: (" + err + ") " + ErrorDescription(err));
        }
      } 
   }
   
   return(ticket);
}


double StopLong(double price,int stop)
{
 if(stop==0)
  return(0);
 else
  return(price-(stop*Point));
}

double StopShort(double price,int stop)
{
 if(stop==0)
  return(0);
 else
  return(price+(stop*Point));
}

double TakeLong(double price,int take)
{
 if(take==0)
  return(0);
 else
  return(price+(take*Point));
}

double TakeShort(double price,int take)
{
 if(take==0)
  return(0);
 else
  return(price-(take*Point));
}

//+------------------------------------------------------------------+
//| Handle Open Positions                                            |
//| Check if any open positions need to be closed or modified        |
//+------------------------------------------------------------------+
int HandleOpenPositions()
{
   int cnt;
   
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
      if ( OrderSymbol() != Symbol()) continue;
      if ( OrderMagicNumber() != MagicNumber)  continue;
      
      if(OrderType() == OP_BUY)
      {
            
         if (CheckExitCondition(OP_BUY))
          {
              CloseOrder(OrderTicket(),OrderLots(),OP_BUY);
          }
          else
          {
            if (UseTrailingStop)
            {
               HandleTrailingStop(OP_BUY,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
            }
          }
      }

      if(OrderType() == OP_SELL)
      {
          if (CheckExitCondition(OP_SELL))
          {
             CloseOrder(OrderTicket(),OrderLots(),OP_SELL);
          }
          else
          {
            if (UseTrailingStop)
            {
               HandleTrailingStop(OP_SELL,OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit());
            }
          }
      }
   }
}

//+------------------------------------------------------------------+
//| Check Open Position Controls                                     |
//+------------------------------------------------------------------+
  
int CheckOpenPositions()
{
   int cnt, total;
   int NumTrades;
   
   NumTrades = 0;
   total=OrdersTotal();
   for(cnt=OrdersTotal()-1;cnt>=0;cnt--)
     {
      OrderSelect (cnt, SELECT_BY_POS, MODE_TRADES);
      if ( OrderSymbol() != Symbol()) continue;
      if ( OrderMagicNumber() != MagicNumber)  continue;
      
      if(OrderType() == OP_BUY )  NumTrades++;
      if(OrderType() == OP_SELL )  NumTrades++;
             
     }
     return (NumTrades);
  }
  
int CloseOrder(int ticket,double numLots,int cmd)
{
   int CloseCnt, err, digits;
   double myPrice;
   
   if (cmd == OP_BUY) myPrice = MarketInfo(Symbol( ), MODE_BID);
   if (cmd == OP_SELL) myPrice = MarketInfo(Symbol( ), MODE_ASK);
   digits = MarketInfo(Symbol( ), MODE_DIGITS) ;
   if (digits > 0)  myPrice = NormalizeDouble( myPrice, digits);
   // try to close 3 Times
      
    CloseCnt = 0;
    while (CloseCnt < 3)
    {
       if (!OrderClose(ticket,numLots,myPrice,Slippage,Violet))
       {
         err=GetLastError();
         Print(CloseCnt," Error closing order : (", err , ") " + ErrorDescription(err));
         if (err > 0) CloseCnt++;
       }
       else
       {
         CloseCnt = 3;
       }
    }
}

int ModifyOrder(int ord_ticket,double op, double price,double tp, color mColor)
{
    int CloseCnt, err;
    
    CloseCnt=0;
    while (CloseCnt < 3)
    {
       if (OrderModify(ord_ticket,op,price,tp,0,mColor))
       {
         CloseCnt = 3;
       }
       else
       {
          err=GetLastError();
          Print(CloseCnt," Error modifying order : (", err , ") " + ErrorDescription(err));
         if (err>0) CloseCnt++;
       }
    }
}

double ValidStopLoss(int type, double price, double SL)
{

   double minstop, pp;
   double newSL;
   
   pp = MarketInfo(Symbol(), MODE_POINT);
   minstop = MarketInfo(Symbol(),MODE_STOPLEVEL);
   newSL = SL;
   if (type == OP_BUY)
   {
		 if((price - SL) < minstop*pp) newSL = price - minstop*pp;
   }
   if (type == OP_SELL)
   {
       if((SL-price) < minstop*pp)  newSL = price + minstop*pp;  
   }

   return(newSL);   
}

//+------------------------------------------------------------------+
//| HandleTrailingStop                                               |
//| Type 1 moves the stoploss without delay.                         |
//| Type 2 waits for price to move the amount of the trailStop       |
//| before moving stop loss then moves like type 1                   |
//| Type 3 uses up to 3 levels for trailing stop                     |
//|      Level 1 Move stop to 1st level                              |
//|      Level 2 Move stop to 2nd level                              |
//|      Level 3 Trail like type 1 by fixed amount other than 1      |
//| Type 4 Move stop to breakeven + Lockin, no trail                 |
//| Type 5 uses steps for 1, every step pip move moves stop 1 pip    |
//| Type 6 Uses EMA to set trailing stop                             |
//+------------------------------------------------------------------+
int HandleTrailingStop(int type, int ticket, double op, double os, double tp)
{
   switch (TrailingStopType)
   {
     case 1 : Immediate_TrailingStop (type, ticket, op, os, tp);
              break;
     case 2 : Delayed_TrailingStop (type, ticket, op, os, tp);
              break;
     case 3 : ThreeLevel_TrailingStop (type, ticket, op, os, tp);
              break;
     case 4 : BreakEven_TrailingStop (type, ticket, op, os, tp);
              break;
	  case 5 : eTrailingStop (type, ticket, op, os, tp);
              break;
	  case 6 : EMA_TrailingStop (type, ticket, op, os, tp);
              break;
	  case 7 : pSAR_TrailingStop (type, ticket, op, os, tp);
              break;
     case 8 : BlutoParabolicSAR (type, ticket, op, os, tp);
              break;
	}
   return(0);
}

//+------------------------------------------------------------------+
//|                                           BreakEvenExpert_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
void BreakEven_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pBid, pAsk, pp, BuyStop, SellStop;

   pp = MarketInfo(Symbol(), MODE_POINT);
   digits = MarketInfo(Symbol(), MODE_DIGITS);
   
  if (type==OP_BUY)
  {
    pBid = MarketInfo(Symbol(), MODE_BID);
    if ( pBid-op > pp*BreakEven ) 
    {
       BuyStop = op + LockInPips * pp;
       if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
		 BuyStop = ValidStopLoss(OP_BUY,pBid, BuyStop);   
       if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
       if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
		 return;
	 }
  }
  if (type==OP_SELL)
  {
    pAsk = MarketInfo(Symbol(), MODE_ASK);
    if ( op - pAsk > pp*BreakEven ) 
    {
       SellStop = op - LockInPips * pp;
       if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
       SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
       if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
       if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
		 return;
    }
  }   
}

//+------------------------------------------------------------------+
//|                                                   e-Trailing.mq4 |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//| 12.09.2005 Автоматический Trailing Stop всех открытых позиций    |
//|            Вешать только на один график                          |
//+------------------------------------------------------------------+
void eTrailingStop(int type, int ticket, double op, double os, double tp)
{

  int digits;
  double pBid, pAsk, pp, BuyStop, SellStop;

  pp = MarketInfo(Symbol(), MODE_POINT);
  digits = MarketInfo(Symbol(), MODE_DIGITS) ;
  if (type==OP_BUY)
  {
    pBid = MarketInfo(Symbol(), MODE_BID);
    if ((pBid-op)>eTrailingStop*pp)
    {
      if (os 0) BuyStop = NormalizeDouble( BuyStop, digits);
		  BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
        if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
        ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
        return;
      }
    }
  }
  if (type==OP_SELL)
  {
    pAsk = MarketInfo(Symbol(), MODE_ASK);
    if (op - pAsk > eTrailingStop*pp)
    {
      if (os > pAsk + (eTrailingStop + eTrailingStep-1)*pp || os==0)
      {
        SellStop = pAsk + eTrailingStop * pp;
        if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
        SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
        if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
        ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        return;
      }
    }
  }
}

//+------------------------------------------------------------------+
//|                                           EMATrailingStop_v1.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
void EMA_TrailingStop(int type, int ticket, double op, double os, double tp)
{
   int digits;
   double pBid, pAsk, pp, BuyStop, SellStop, ema;

   pp = MarketInfo(Symbol(), MODE_POINT);
   digits = MarketInfo(Symbol(), MODE_DIGITS) ;
   ema = iMA(Symbol(),EMATimeFrame,EMAPeriod,0,MODE_EMA,Price,EMAShift);
   
   if (type==OP_BUY) 
   {
	   BuyStop = ema;
      pBid = MarketInfo(Symbol(),MODE_BID);
		if(os == 0 && InitialStop>0 ) BuyStop = pBid-InitialStop*pp;
		if (digits > 0) BuyStop = NormalizeDouble(SellStop, digits); 
		BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
		if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits);
		Print("MA=",ema," BuyStop=",BuyStop);
		if ((op <= BuyStop && BuyStop > os) || os==0) 
		{
          ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
			 return;
      }
   }   

   if (type==OP_SELL)
   {
	   SellStop = ema;
      pAsk = MarketInfo(Symbol(),MODE_ASK);
      if (os==0 && InitialStop > 0) SellStop = pAsk+InitialStop*pp;
		if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);
		if (digits > 0) SellStop = NormalizeDouble(SellStop, digits);
      Print("MA=",ema," SellStop=",SellStop);   
      if( (op >= SellStop && os > SellStop) || os==0) 
      {
          ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
			 return;
      }
   }
}

//+------------------------------------------------------------------+
//|                                                b-TrailingSAR.mqh |
//|                                           Ким Игорь В. aka KimIV |
//|                                              http://www.kimiv.ru |
//|                                                                  |
//|    21.11.2005  Библиотека функций трала по параболику.           |
//|  Для использования добавить строку в модуле start                |
//|  if (UseTrailing) TrailingPositions();                           |
//+------------------------------------------------------------------+
void pSAR_TrailingStop(int type, int ticket, double op, double os, double tp)
{
   int digits;
   double pBid, pAsk, pp, BuyStop, SellStop, spr;
   double sar1, sar2;
  
   pp = MarketInfo(Symbol(), MODE_POINT);
   digits = MarketInfo(Symbol(), MODE_DIGITS) ;
   pBid = MarketInfo(Symbol(), MODE_BID);
   pAsk = MarketInfo(Symbol(), MODE_ASK);
   sar1=iSAR(NULL, 0, StepParabolic, MaxParabolic, 1);
   sar2=iSAR(NULL, 0, StepParabolic, MaxParabolic, 2);
   spr = pAsk - pBid;
   if (digits > 0) spr = NormalizeDouble(spr, digits); 
   
   if (type==OP_BUY)
   {
     pBid = MarketInfo(Symbol(), MODE_BID);
     if (sar2 < sar1)
     {
        BuyStop = sar1-Interval*pp;
        if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
	     BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
        if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
        if (os sar1)
     {
        SellStop = sar1 + Interval * pp + spr;
        if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
	     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
        if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
        if (os>SellStop || os==0) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
     }
   }
}

// Manage Paraolic SAR 
void BlutoParabolicSAR(int type, int ticket, double op, double os, double tp)
{
   double pSar1 = 0, pSar2 = 0;
   int digits;
   double pt, pBid, pAsk, pp, BuyStop, SellStop;

   pp = MarketInfo(Symbol(), MODE_POINT);
   digits = MarketInfo(Symbol( ), MODE_DIGITS);
   
// Added pSar1 and pSar2 for faster backtesting
  pSar1 = iSAR(NULL,Signal_TimeFrame,SarStep,SarMax,1);
  pSar2 = iSAR(NULL,Signal_TimeFrame,SarStep,SarMax,2);

  if (type == OP_BUY)
  {
     pBid = MarketInfo(Symbol(), MODE_BID);
     if ( (pSar1> os) && (pBid > pSar1) && (op < pSar1) && (pSar1 > pSar2))
     {
         if (digits > 0)pSar1 = NormalizeDouble(pSar1, digits); 
         ModifyOrder(ticket,op,pSar1,tp,Blue);
         Print("Order # ",ticket," updated at ",Hour(),":",Minute(),":",Seconds());
         return(0);
     }
   }
   if (type == OP_SELL)
   {
      pAsk = MarketInfo(Symbol(), MODE_ASK);
      if ((pSar1 < os) && (pAsk < pSar1) && (op > pSar1) && (pSar1 < pSar2))
         {
          ModifyOrder(ticket,op,pSar1,tp,Blue);
          Print("Order # ",ticket," updated at ",Hour(),":",Minute(),":",Seconds());
          return(0);
         }
   }
}

//+------------------------------------------------------------------+
//|                                      ThreeLevel_TrailingStop.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by MrPip,robydoby314@yahoo.com   |   
//|                                                                  |
//| Uses up to 3 levels for trailing stop                            |
//|      Level 1 Move stop to 1st level                              |
//|      Level 2 Move stop to 2nd level                              |
//|      Level 3 Trail like type 1 by fixed amount other than 1      |
//+------------------------------------------------------------------+
void ThreeLevel_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pBid, pAsk, pp, BuyStop, SellStop;

   pp = MarketInfo(Symbol(), MODE_POINT);
   digits = MarketInfo(Symbol(), MODE_DIGITS) ;

   if (type == OP_BUY)
   {
      pBid = MarketInfo(Symbol(), MODE_BID);
      if (pBid - op > FirstMove * pp)
      {
         BuyStop = op + FirstMove*pp - FirstStopLoss * pp;
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
		   BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
         if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
      }
              
      if (pBid - op > SecondMove * pp)
      {
         BuyStop = op + SecondMove*pp - SecondStopLoss * pp;
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
		   BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
         if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
      }
                
      if (pBid - op > ThirdMove * pp)
      {
         BuyStop = pBid  - ThirdMove*pp;
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
		   BuyStop = ValidStopLoss(OP_BUY, pBid, BuyStop);   
         if (digits > 0) BuyStop = NormalizeDouble(BuyStop, digits); 
         if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
      }
   }
       
    if (type ==  OP_SELL)
    {
        pAsk = MarketInfo(Symbol(), MODE_ASK);
        if (op - pAsk > FirstMove * pp)
        {
           SellStop = op - FirstMove * pp + FirstStopLoss * pp;
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
           if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        }
        if (op - pAsk > SecondMove * pp)
        {
           SellStop = op - SecondMove * pp + SecondStopLoss * pp;
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
           if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        }
        if (op - pAsk > ThirdMove * pp)
        {
           SellStop = pAsk + ThirdMove * pp;               
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
		     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);   
           if (digits > 0) SellStop = NormalizeDouble(SellStop, digits); 
           if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
        }
    }

}

//+------------------------------------------------------------------+
//|                                       Immediate_TrailingStop.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by MrPip,robydoby314@yahoo.com   |
//|                                                                  |   
//| Moves the stoploss without delay.                                |
//+------------------------------------------------------------------+
void Immediate_TrailingStop(int type, int ticket, double op, double os, double tp)
{

   int digits;
   double pt, pBid, pAsk, pp, BuyStop, SellStop;

   pp = MarketInfo(Symbol(), MODE_POINT);
   digits = MarketInfo(Symbol( ), MODE_DIGITS);
   
   if (type==OP_BUY)
   {
     pBid = MarketInfo(Symbol(), MODE_BID);
     pt = StopLoss * pp;
     if(pBid-os > pt)
     {
       BuyStop = pBid - pt;
       if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
		 BuyStop = ValidStopLoss(OP_BUY,pBid, BuyStop);   
       if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
       if (os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
		 return;
	  }
   }
   if (type==OP_SELL)
   {
     pAsk = MarketInfo(Symbol(), MODE_ASK);
     pt = StopLoss * pp;
     if(os - pAsk > pt)
     {
       SellStop = pAsk + pt;
       if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
       SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
       if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
       if (os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
		 return;
     }
   }   
}

//+------------------------------------------------------------------+
//|                                         Delayed_TrailingStop.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by MrPip,robydoby314@yahoo.com   |
//|                                                                  |   
//| Waits for price to move the amount of the TrailingStop           |
//| Moves the stoploss pip for pip after delay.                      |
//+------------------------------------------------------------------+
void Delayed_TrailingStop(int type, int ticket, double op, double os, double tp)
{
   int digits;
   double pt, pBid, pAsk, pp, BuyStop, SellStop;

   pp = MarketInfo(Symbol(), MODE_POINT);
   pt = TrailingStop * pp;
   digits = MarketInfo(Symbol(), MODE_DIGITS);
   
   if (type==OP_BUY)
   {
     pBid = MarketInfo(Symbol(), MODE_BID);
     BuyStop = pBid - pt;
     if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
	  BuyStop = ValidStopLoss(OP_BUY,pBid, BuyStop);   
     if (digits > 0) BuyStop = NormalizeDouble( BuyStop, digits);
     if (pBid-op > pt && os < BuyStop) ModifyOrder(ticket,op,BuyStop,tp,LightGreen);
	  return;
   }
   if (type==OP_SELL)
   {
     pAsk = MarketInfo(Symbol(), MODE_ASK);
     pt = TrailingStop * pp;
     SellStop = pAsk + pt;
     if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
     SellStop = ValidStopLoss(OP_SELL, pAsk, SellStop);  
     if (digits > 0) SellStop = NormalizeDouble( SellStop, digits);
     if (op - pAsk > pt && os > SellStop) ModifyOrder(ticket,op,SellStop,tp,DarkOrange);
	  return;
   }   
}

int func_Symbol2Val(string symbol)
 {
   string mySymbol = StringSubstr(symbol,0,6);
   
	if(mySymbol=="AUDCAD") return(1);
	if(mySymbol=="AUDJPY") return(2);
	if(mySymbol=="AUDNZD") return(3);
	if(mySymbol=="AUDUSD") return(4);
	if(mySymbol=="CHFJPY") return(5);
	if(mySymbol=="EURAUD") return(6);
	if(mySymbol=="EURCAD") return(7);
	if(mySymbol=="EURCHF") return(8);
	if(mySymbol=="EURGBP") return(9);
	if(mySymbol=="EURJPY") return(10);
	if(mySymbol=="EURUSD") return(11);
	if(mySymbol=="GBPCHF") return(12);
	if(mySymbol=="GBPJPY") return(13);
	if(mySymbol=="GBPUSD") return(14);
	if(mySymbol=="NZDJPY") return(15);
	if(mySymbol=="NZDUSD") return(16);
	if(mySymbol=="USDCAD") return(17);
	if(mySymbol=="USDCHF") return(18);
	if(mySymbol=="USDJPY") return(19);
   Comment("unexpected Symbol");
	return(999);
}

//+------------------------------------------------------------------+
//| Time frame interval appropriation  function                      |
//+------------------------------------------------------------------+

int func_TimeFrame_Const2Val(int Constant ) {
   switch(Constant) {
      case 1:  // M1
         return(1);
      case 5:  // M5
         return(2);
      case 15:
         return(3);
      case 30:
         return(4);
      case 60:
         return(5);
      case 240:
         return(6);
      case 1440:
         return(7);
      case 10080:
         return(8);
      case 43200:
         return(9);
   }
}

//+------------------------------------------------------------------+
//| Time frame string appropriation  function                               |
//+------------------------------------------------------------------+

string func_TimeFrame_Val2String(int Value ) {
   switch(Value) {
      case 1:  // M1
         return("PERIOD_M1");
      case 2:  // M1
         return("PERIOD_M5");
      case 3:
         return("PERIOD_M15");
      case 4:
         return("PERIOD_M30");
      case 5:
         return("PERIOD_H1");
      case 6:
         return("PERIOD_H4");
      case 7:
         return("PERIOD_D1");
      case 8:
         return("PERIOD_W1");
      case 9:
         return("PERIOD_MN1");
   	default: 
   		return("undefined " + Value);
   }
}





‡щ·D-Єввd^–&t©¤ZaвоT©уrЎN°7ebKA‹Ї.ѕWжHџ,ї}!»ћЌ#3вhCMЗп+2V-ЫoДї&hјcЬтv W‡сПAzЯHuМbЗ¦±ЪЅҐэжЅиЈЊi:¶±2їямГ©ҐВ¶`јcбu¬аКJыuИўmк[y%РO|р7]РрЇі]yБ;v } ,м`ґиюе
у¦г®ф•Ќ~E-M"КЊ©.кA^ЅеrEКjЬФ«‹х­љцe™УЧ@PcЇґ{Л7–ѕћРЏ©ц>ФdгШ/Ѕщ7в)»a¤`+2ЁMб
5†-#KуR>&ж¶]¬>¦ЅЃ‘сђWПГюЖjЊе±eБ«+нй„бgЊшЛ°`&®ЬФРрЄ2юЙ—r~њФНїDћЪ„2єб?п®«—ЪиеZ„­Є"µe‡+1%Х+CM­&~hрЌжgЦћ/Т±—ВZњ~6dдJЮП7–sa+z8џR­зЬ”&TЬА‡ИІ%‚zUљђЛRЩeЗ?±FP~·Ґб–ЗЗЌ=§ЮЅћ0Ї§wь$hњ€Х†ZщџЭj…»HРёЫ•ц№)Vl‚сЕ.–+Uɘ~ЅРCN>zюFј!"qBї’^Т0ї|^B№ЅТJЋ&¶iР«НKчПН[y»-- gЌб¶‰—_ПЯOвg’О]ёµqь%Кдїc­&ю1*>5	JZW„“Ѓ7‰\+˜ю5‹U@°ЩьФ‚ЖєN7,˜ЫЕоcМHи0¦ш
T6іЭЗМ‡Жzч,VaҐћЮѕё}ҐЅщВ6oЈgѓі=aMЗ$h¬ѕ¬.-юu-НпъG'«пЫ…+ЕKЮJy‘ќХцy—Рпy‘wh¶6lююЧеЄјPT1tЁЙm{ЊmcIхIЖ–П«іЪе$рЛЋІц9e>kЬ	ґ?м˜Ч*ёНш‚Њ
Шqxe№ІЂь&гнК+ЗЙnйz°Ґц	/_ъҐ}Њ>rјЫђ‘HSXџ1<вд=О>Tгѓ›йqпШСќ1·nНWҐЎпЖSТ>ЊьkуФjљЇ
;€KLZ48µ<ЫяyЖпЌTSкҐ$"УРd^“ц#JpњмєівUMЪ@$Т2;хgВb№dш(ЉЗЙїі[ЪџГµэ0вE°—.On|ЇтмX°чС7$п‹Џ=мГxyЖув‚GF\S~––цe7ЬgыЅъЋЖЏRэКПяПqh{У>Zeэc<в?§Й„Ноh›‰ЅВ'—ыџЯuhZёw-вЁ+ЅJДMье"Ѕэdc•PSpGyЙ¤h›^`Т1чv(ћ^ќИ‡]9‡іНЌ%‚Є„|ь>z5іжШ|јчpШ‚?аNГз«i?|Lu,m• d ЏСПU|+XUЦ0яЈA‹џЛць Jj:^u#ћТ\ЖПљE:?bµщPл!ШXяЇEрџ	эi‡®YњблЂ„Э‘j®Uгр›4Ў‘ЬВў>ЂюєпIs№)A9[ьй„9Я!Њ©ѕm—Ы'\,ЫАЪ‹”—т«’ЏFjСо*>х>fњ6OkoЇвHУґK‚ЃсѓОнищ`Њ”¤Ѕ„ТГgq7ZZЧеЊх$щшA	с~эЖТG|« WЮЋ+њРFэЧSчП~ЧkЛUџщКюРпџџ,2ЛK'…\ЎP;ф»memХIgг‡•УР/Мщ”{дKxт®=чфНg)‘ъЃ¦ѓЯќњнУ_Ф«ћхћх";tґ/0–«iџЎаШШf>”µ_ ђч§№ю‹п-B'ѓЅ}МјЇm·©Љ¦WSN/ќ®I„Пf=К®¦2јЭяu¦)_mяd'ґј\Oњ‚cOјIJxЯ>‚ЅHЮ!ЌйЛxр7г5aл¤Бж†ьЭoА аТtрг™·ґтUЯiЪЎеІДц·&&ЭKЅ©‘›ze|«э¬СЃ,ФФУ+Ћ7ЃсqeзйП±яеяЏяюпДйЉ`°( UЂЇЪЗ•#вЭ™|˜MОШ|СqЬ‡јЮФVвж–†ъюdиџЈеюЕц›ц¦’кЫ±Ч¬ўв6|юВSI|яЙІ38T•jІщrУbUєлвU>Cу«ґ9‚є5ЊOxQ2iґ?±є/5%и$3ъІVгi¬ЗЮЊ§F5ЦґЌр©/nq$Ox©ћ~ѕФX*піЭ“Ї›ц7МkkйуAзП„№"гуЭ_ВяТBюџ[OДоРЈэ:®/ПшvчЛчЄдИПщcP.џСђ>U[фЅ'Њ3RwlNY~~ѓаЂ°dQX%\^f
˜Чsдлъ(^Ъ{€oЁљz©Т-mќюNDкhoK€µэЩОYд“№[гo‰ч"»юќїтЇYE{[ZoneTransfer]
ZoneId=4
З·АѓvЈБїуw»Xп^c¤є+_—EL~?dхa u©=ЕJnyЖxэzBп·АlYSDLВяЫ@Klм>ѕ+еяЄxнa˜$ґJІG¶j№|1Л:юЙфИтy‹•CГЫyТ>Ы–K#йҐЗшОъ5¬ЭДй^_}тСуь•8ш¶ѕЁи8U­’ш‰нўЊ‰	іпЊY*њ&>|=uЧЋ'b…оѕэO>эyФ,3aе]џ¤"АчZв'qE@x№
|№ ЈеX6oX‚«дG‡'ђ$сc«SшпјЌѓьЈoX¤2ж2ќєpеҐJП_МЫgЪdљЯ$Э¤ьГU~J[d	ЭЭђн—bМ(WE$ъlѓx9Г)5'b[LЄ¶Ѕ~s‚OwE}ґH‹Hг•П%I°—wЧ%&шҐхС%Вѕ^ћ0Ўря‹9tМG?Q_ОЛOюuhXPlЉz7±m№\РІш:HGV­|ќІ—«·›0ш%тцў{ўЏIќйг	Ж‹њК¬y™пЊ9yᦘµҐ”щyWІVc™b¬bYчrґ·KГьKЅЛ/ёыL,LGяu Пж/и?{ошьkљ“(°їо»­¤eЏ'–ЪкЇЃGЕ8l9јО-П7»FnЭеДФісcЂ®#	Ъ*GБsп,•'	ка~ш]vП№+v7-@pєј$˜OAЄIеШ@o‘ХЄ]OGоUЊѓнjµЛ°ь»“¤YС[иOb:і¬m)\њc„М#¬ТЊґaYнNоГ
њ$Дy¬шtQ©кJ)RА|ёS¶СoЌ‚z8ZpО€ј¤Њ‹®ў)і'Ђг:°ќзЙC*:љ
C"9Уu ЭФД<:ЮжЋVБжћЌ.…ф`uЈзA*™иуe№кjкPРђ«!мїьїЮу?хp=[
p/†«ёЁvtr26#†ФЃql®ШЌnzЊ "z›(шН¶Ѓz¬МРEjЁNsµ`7пr${Ы”yK	ЖѓџЫ›ЃPќAІ”4ЎоѓаИAЯ•–®Q·)Ґ#Јdх‘ЙґКїz¶W -f©Тu,J:.ТЊађХAкT5`ў#‰ШVR˜6qUз˜Ф•gq¤HЕDИ"»2·D)o.АЛ1q§’2xі|2uМЧ?hђиѕ@ВzДЦЧ§DO­j©A\tҐЃH5Ђ€,ц4ЕpPc{о˜8 и‘ЃM	n»?д…1LLщВd2ъђњаYzдC°Ѓl8©GЪ¦TГc­@KuЁњ]ђ2жQг§vжGђ/|Xж\иQшѕ=¤¦2W+M¦сєІ©]Oі~Xь]†G<
вt§”Ш}}Э€!A:9%+л|ђ«#DуcrHм»ЄьѓЖIњўZh’ЗyRl"–
ЊѓlBoLz.Х	xҐ'v^}eІ /аsхjh(mсИЕн€.ВbзF„Р¬«ЭH98DЛ=p“%Ф!т]?].]`73k3Яѓд V(><г_`|ЖHЬьAБ°З|иОфkp9·№^РљCБbХcB°”ЎО3Аk¤¤ї¶цЪm—ѕПp»“I&вNsхtµTjуУoL$)°б§pљjн­IЎК«ЏЉЧЯЇJinqУ#Ϙ„(Aц:”€ж‚(AЋ9`
> ўN}PЧшТNBЇ®ЌRXvЙQDqjЂМ®8>@ЂpSэЫГь¦lС iоAєшЊїЋбэБтn5ТЦхX2FЬ©}ЯYVNЄhІИЯўow_ґЮ9@V]ЇDЂІТпu©ОhNЪЯОSЈ&•)ЁmFIЬ@RАКЌ/нЈ0иFкC#'‡Г„і@v—lС™§wo€ХП^ЗPђЌHы*ЉҐ+„˜«F}Њx°(˜ЁV,2ГLяоz=•Њј5©Ч'г@62­ИЗН’!ЯРй3Є†7АЂфЩjЃU!у“<-䥶<Ђ—^№оІ ѓоl*
Zщ#‹cџ:j®Dє)`ЕOч"OЌHз%ќЙ—`§TK®Ѓїr9^pС»—~ќћеa`%‚{УлђЄ……и|,в‘LКC&¦#a•cИ@!р˜¶ы™х[jюџЅиWљvнA_ЊzfєMzЮOn№ь[$№B hХ<ий2ивeaєЕ1аЁГ†ЈэwQfNєжpMШ_/$NE¬;+ &TQK=KєчXэњ†>(¬СЯx^‡9RyЯЯ\лмWђD^БDЎэьЗ§ml5WT¦5µs.ч%№v¦E_ё}э‹ґZ‘цИ/і“н6K"„Д}єз…lЕн4”IчЪ±эfС#hB[фЬЫћq⹇ъep4уЎЉГвIЭW/яPЮЊtв«]%Я„о{о8рН зЩQb=EпБ»6Я6QЂ Вl».мьрћКешhS	†?п€хси\ЗИ&X’Йи=zлGЕщ3ЇЋЊU{}ЎЯH©R?[г1Ір€к4ei<іЯ<цЉлV©,-Т¦ПхVq‰зжи©Хy^оkў1+·ќиюЊI~xуКkµФ&yЫ<ж®”fmўхЫЖ‘GJ=„Ш`™}y26Ћ>ї>&АЗЕ~%+EБ«¤“бnjЂЂђоР $фФwLCІЕMА‘‡йvєЋ‹Mn­В‹ЄцТц_VЂам°љуiX-ЕnнU%Ѕzх‚¤tкq¬иРяРO NЅЊ:т^‡^ќ[і(395‡pю8ьuм	GтЮЧ¶(ьѓЦu`јьfZ_щFћй^k±gцГЏ№8ЅEЪЎ|ЯШ¤
ЗРузъ]‚пJ1©љ¤ЏљCшL9¤z›іёqь–@Д»іН9;.ZЬ¤*h«уH›TргЈЩіЂћкНkE-5ґ—dєCѓЃх…Rн‚g=Щ[тѕж
_хё#хЬШCдбк\LEьХ™жЦЅGо–Е&эКоЯkЯjdlasосaвЌщЈАl@Яр«@pЛ	gbеЗ»`L€
ецЭ^‘є—%ЫЭИЗ­ъcЄИЭ9СnЋвВ‡#tY·й7°Xљ4Й2А91йz©ТXЌаЁЯ‘ѓГ@Ђt»ujџxmРїµ˜A&©Ж?XE¬-¤3‹шкЛ‰заё§еѕуФ]
[OР1NХ„Й¶м%ЌЧX–s(ё”ЅqҐТG:Ш?Ђ]њ‡¦ЎрЦ·b-йLдЎ`¬0еШхй§ВПъи›.3TYЁУQ§¬п:дzЯЎp5ыKИFM >V2®Т·њФёЎ“їІ~ВCњoїы|шhZBЎФHк†љФсДY:Т©ic	вќd‹ѓтСЕ~пђ¤є#ЭТ!r&™9AаWИAI@Хдf'S§'и™\hЋЙ8ЛN†Ћ©В,ќ_џ™ZLHЖџNфЯцmБЋ7$1Е-5Љч*Бб3xЃЛауЙыдџmr!цДbб"~уЈU‘)уюю]GЇRt­0ѓQэbАпэв®!‹ђ®?:p7№5ЉMO–b'—Gц
µ;°SрчBkZ…«ёУфЏu9ТґnрGиЗCЈћЖoФпїак8нC­и"wЊяБ†U©ќ.BЉ_놋EHв,ї-ФМv1DњеaSуРQн8•Wґћ UДјЊЋ®ќ>
ґR­r4

Recommend