Phoenix_EA_v5_6_03





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                             Phoenix_5_6_03.mq4   |
//|                                       Copyright © 2006, Hendrick |
//|                                                                  |
//+------------------------------------------------------------------+

#property copyright "Copyright © 2006, Hendrick."

#define MAGICMA_A  20050610
#define MAGICMA_B  20060611

#define MAGICMA01  20050612
#define MAGICMA02  20060613
#define MAGICMA03  20060614

extern string     GeneralSettings         = "===== General Settings ============================";
extern int        PhoenixMode             = 3;
extern double     Lots                    = 1;
extern double     MaximumRisk             = 0.05;
extern int        DecreaseFactor          = 0;
extern bool       MM                      = true;
extern bool       AccountIsMicro          = false;

extern bool       PrefSettings            = true;

extern int        CloseAfterHours         = 0;
extern int        BreakEvenAfterPips      = 0;

extern string     Mode1                   = "====== Phoenix Mode 1 (Classic) ==================";
extern int        TakeProfit              = 0;
extern int        StopLoss                = 0;
extern int        TrailingStop            = 0;

extern string     Mode2                   = "====== Phoenix Mode 2 (Second trade)==============";
extern int        Mode2_OpenTrade_2       = 0;
extern int        Mode2_TakeProfit        = 0;
extern int        Mode2_StopLoss          = 0;
extern bool       Mode2_CloseFirstTrade   = false;
     
extern string     Mode3                   = "====== Phoenix Mode 3 (Three trades at once) =====";
extern int        Mode3_CloseTrade2_3     = 0;
extern int        Mode3_TakeProfit        = 0;
extern int        Mode3_StopLoss          = 0;

extern string     Signal1                 = "====== Signal 1 ===================================";
extern bool       UseSignal1              = true;
extern double     Percent                 = 0;
extern int        EnvelopePeriod          = 0;

extern string     Signal2                 = "====== Signal 2 ==================================";
extern bool       UseSignal2              = true;
extern int        SMAPeriod               = 0;
extern int        SMA2Bars                = 0;

extern string     Signal3                 = "====== Signal 3 ==================================";
extern bool       UseSignal3              = true;
extern int        OSMAFast                = 0;
extern int        OSMASlow                = 0;
extern double     OSMASignal              = 0;

extern string     Signal4                 = "====== Signal 4 ==================================";
extern bool       UseSignal4              = true;
extern int        Fast_Period             = 0;
extern int        Fast_Price              = PRICE_OPEN;
extern int        Slow_Period             = 0;
extern int        Slow_Price              = PRICE_OPEN;
extern double     DVBuySell               = 0;
extern double     DVStayOut               = 0;

extern string     Signal5                 = "====== Signal 5 =================================";
extern bool       UseSignal5              = true;
extern int        TradeFrom1              = 0;
extern int        TradeUntil1             = 24;
extern int        TradeFrom2              = 0;
extern int        TradeUntil2             = 0;
extern int        TradeFrom3              = 0;
extern int        TradeUntil3             = 0;
extern int        TradeFrom4              = 0;
extern int        TradeUntil4             = 0;



int init()
{

//+------------------------------------------------------------------+
//| START Preffered Settings                                         |
//+------------------------------------------------------------------+

if(PrefSettings == true)
{
   if((Symbol() == "USDJPY") || (Symbol() == "USDJPYm"))
      {     
  
      Mode2_OpenTrade_2    = 0;
      Mode2_TakeProfit     = 50;
      Mode2_StopLoss       = 60;
      

      Mode3_CloseTrade2_3  = 30;
      Mode3_TakeProfit     = 100;
      Mode3_StopLoss       = 55;
      
      Percent              = 0.0032;
      EnvelopePeriod       = 2;
      
      TakeProfit           = 42;
      StopLoss             = 84;
      TrailingStop         = 0;
      SMAPeriod            = 2;
      SMA2Bars             = 18;
      OSMAFast             = 5;
      OSMASlow             = 22;
      OSMASignal           = 2;
      
      Fast_Period          = 25;
      Slow_Period          = 15;
      DVBuySell            = 0.0029;
      DVStayOut            = 0.024;
      }

   if((Symbol() == "EURJPY") || (Symbol() == "EURJPYm"))
      {
      
      Mode2_OpenTrade_2    = 18;
      Mode2_TakeProfit     = 70;
      Mode2_StopLoss       = 30;
      

      Mode3_CloseTrade2_3  = 55;
      Mode3_TakeProfit     = 70;
      Mode3_StopLoss       = 80;      

      Percent              = 0.007;
      EnvelopePeriod       = 2;
      
      TakeProfit           = 42;
      StopLoss             = 84;
      TrailingStop         = 0;
      SMAPeriod            = 4;
      SMA2Bars             = 16;
      OSMAFast             = 11;
      OSMASlow             = 20;
      OSMASignal           = 14;
      
      Fast_Period          = 20;
      Slow_Period          = 10;
      DVBuySell            = 0.0078;
      DVStayOut            = 0.026;
      }

   if((Symbol() == "GBPJPY") || (Symbol() == "GBPJPYm"))
      {
      
      Mode2_OpenTrade_2    = 2;
      Mode2_TakeProfit     = 130;
      Mode2_StopLoss       = 80;
      

      Mode3_CloseTrade2_3  = 40;
      Mode3_TakeProfit     = 90;
      Mode3_StopLoss       = 80;      

      
      Percent              = 0.0072;
      EnvelopePeriod       = 2;
      
      TakeProfit           = 42;
      StopLoss             = 84;
      TrailingStop         = 0;
      SMAPeriod            = 8;
      SMA2Bars             = 12;
      OSMAFast             = 5;
      OSMASlow             = 36;
      OSMASignal           = 10;
      
      Fast_Period          = 17;
      Slow_Period          = 28;
      DVBuySell            = 0.0034;
      DVStayOut            = 0.063;
      }
      
   if((Symbol() == "USDCHF") || (Symbol() == "USDCHFm"))
      {
      
      Mode2_OpenTrade_2    = 10;
      Mode2_TakeProfit     = 90;
      Mode2_StopLoss       = 65;
      

      Mode3_CloseTrade2_3  = 85;
      Mode3_TakeProfit     = 130;
      Mode3_StopLoss       = 80;      

      
      Percent              = 0.0056;
      EnvelopePeriod       = 10;
      
      TakeProfit           = 42;
      StopLoss             = 84;
      TrailingStop         = 0;
      SMAPeriod            = 5;
      SMA2Bars             = 9;
      OSMAFast             = 5;
      OSMASlow             = 12;
      OSMASignal           = 11;
      
      Fast_Period          = 5;
      Slow_Period          = 20;
      DVBuySell            = 0.00022;
      DVStayOut            = 0.0015;
      }
      
   if((Symbol() == "GBPUSD") || (Symbol() == "GBPUSDm"))
      {
      
      Mode2_OpenTrade_2    = 5;
      Mode2_TakeProfit     = 95;
      Mode2_StopLoss       = 90;
      

      Mode3_CloseTrade2_3  = 90;
      Mode3_TakeProfit     = 110;
      Mode3_StopLoss       = 80;      

      
      Percent              = 0.0023;
      EnvelopePeriod       = 6;
      
      TakeProfit           = 42;
      StopLoss             = 84;
      TrailingStop         = 0;
      SMAPeriod            = 3;
      SMA2Bars             = 14;
      OSMAFast             = 23;
      OSMASlow             = 17;
      OSMASignal           = 15;
      
      Fast_Period          = 25;
      Slow_Period          = 37;
      DVBuySell            = 0.00042;
      DVStayOut            = 0.05;
      }      
}
return(0);
}

//+------------------------------------------------------------------+
//| END Preffered Settings                                           |
//+------------------------------------------------------------------+



//+------------------------------------------------------------------+
//| START EA                                                         |
//+------------------------------------------------------------------+

void start()
   {
   if(Bars<100)
      {
      Print("bars less than 100");
      return(0);  
      }

   if(PhoenixMode==1)//Phoenix Classic
      {
      CheckOpenTrade();     
      if(CloseAfterHours != 0)  CheckCloseAfterHours();
      if(!StopLoss==0)              CheckTrailingStop();
      if(BreakEvenAfterPips != 0)        CheckBreakEven();
      }
      
         
   if(PhoenixMode==2)//Phoenix Second Trade
      {
      CheckOpenTrade();     
      if(CloseAfterHours != 0)  CheckCloseAfterHours();
      CheckSecondTrade();
      }

   if(PhoenixMode==3)//Phoenix 123
      {
      CheckOpenTradeMode123();     
      Mode3_MoveSL_Trade_2_3();
      Mode3_MoveSL_Trade_3();
      if(Mode3_CloseTrade2_3 != 0) CheckCloseTrade23();
      }
      
   } 
     
//+------------------------------------------------------------------+
//| END EA                                                           |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Calculate open positions                          |
//+------------------------------------------------------------------+
int CalculateCurrentOrders(string symbol)
  {
   int count=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(OrderSymbol()==Symbol() && (OrderMagicNumber()==MAGICMA_A || OrderMagicNumber()==MAGICMA_B))
        {
         count++;
        }
     }
     return(count);
  }
//+------------------------------------------------------------------+
//| STOP Function Calculate open positions                           |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Check Open Trade                                  |
//+------------------------------------------------------------------+
int CheckOpenTrade()
{      
int Signal=0, err = 0, total = OrdersTotal();

if(CalculateCurrentOrders(Symbol()) < 1)
   {  
   if(CheckSignal(Signal)==1)
      {
      if(OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"FirstTrade",MAGICMA_A,0,Red) < 0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
       return(0);
      }
      
   if(CheckSignal(Signal)==2)
      {
      if(OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"FirstTrade",MAGICMA_A,0,Blue) < 0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      return(0);
      }
   }
}
//+------------------------------------------------------------------+
//| END Function Check Open Trade                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START MODE 3 Function Check Open Trade                           |
//+------------------------------------------------------------------+
int CheckOpenTradeMode123()
{
     
int Signal = 0, err = 0, total = OrdersTotal(), decimalPlaces=1;
if(AccountIsMicro==true) decimalPlaces=2;
double lots123 = NormalizeDouble(LotsOptimized()/3,decimalPlaces);

if(lots123 < 0.1 && AccountIsMicro==false) {lots123=0.1;}
if(lots123 < 0.01 && AccountIsMicro==true) {lots123=0.01;}

if(Mode3CalculateCurrentOrders(Symbol()) < 1)      
   {
   if(CheckSignal(Signal)==1)
      {
      if(OrderSend(Symbol(),OP_SELL,lots123,Bid,3,Bid+Mode3_StopLoss*Point,Bid-NormalizeDouble(Mode3_TakeProfit/2,0)*Point,"Mode3_FirstTrade",MAGICMA01,0,Red)<0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
           
      if(OrderSend(Symbol(),OP_SELL,lots123,Bid,3,Bid+Mode3_StopLoss*Point,Bid-Mode3_TakeProfit*Point,"Mode3_SecondTrade",MAGICMA02,0,Red)<0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      
      if(OrderSend(Symbol(),OP_SELL,lots123,Bid,3,Bid+Mode3_StopLoss*Point,Bid-NormalizeDouble(Mode3_TakeProfit*1.5,0)*Point,"Mode3_ThirdTrade",MAGICMA03,0,Red)<0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      return(0);
      }
      
   if(CheckSignal(Signal)==2)
      {
      if(OrderSend(Symbol(),OP_BUY,lots123,Ask,3,Ask-Mode3_StopLoss*Point,Ask+NormalizeDouble(Mode3_TakeProfit/2,0)*Point,"Mode3_FirstTrade",MAGICMA01,0,Blue)<0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }      
      if(OrderSend(Symbol(),OP_BUY,lots123,Ask,3,Ask-Mode3_StopLoss*Point,Ask+Mode3_TakeProfit*Point,"Mode3_SecondTrade",MAGICMA02,0,Blue)<0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      if(OrderSend(Symbol(),OP_BUY,lots123,Ask,3,Ask-Mode3_StopLoss*Point,Ask+NormalizeDouble(Mode3_TakeProfit*1.5,0)*Point,"Mode3_ThirdTrade",MAGICMA03,0,Blue)<0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      return(0);
      }
   } 
}

//+------------------------------------------------------------------+
//| END Function Check Open Trade                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Check Second Trade                                |
//+------------------------------------------------------------------+

void CheckSecondTrade()
{
int err = 0, total = OrdersTotal();

for(int z = total - 1; z >= 0; z --)
   {
   if(!OrderSelect( z, SELECT_BY_POS))
      {
      err = GetLastError();
      Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err );
      continue;
      }

   if(OrderSymbol() != Symbol()) continue;

   if(OrderMagicNumber() == MAGICMA_B) break;
 
   if(OrderMagicNumber() != MAGICMA_A) continue;

   if(OrderType() == OP_BUY && (Bid-OrderOpenPrice() > Point*Mode2_OpenTrade_2))
      {   
      if(OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask - Mode2_StopLoss * Point,Ask + Mode2_TakeProfit * Point,"Mode2_SecondTrade",MAGICMA_B,0,Blue) < 0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      if(Mode2_CloseFirstTrade==true) {CloseFirstTrade();}
      return(0);  
      }

   if(OrderType() == OP_SELL && (OrderOpenPrice()-Ask > Point*Mode2_OpenTrade_2))
      {
      if(OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid + Mode2_StopLoss * Point,Bid - Mode2_TakeProfit*Point,"Mode2_SecondTrade",MAGICMA_B,0,Red) < 0)
         {
         err = GetLastError();
         Print("Error Ordersend(",err,"): ");
         return(-1);
         }
      if(Mode2_CloseFirstTrade==true) {CloseFirstTrade();}
      return(0);
      }
   }            

}

//+------------------------------------------------------------------+
//| END Function Check Second Trade                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Check Close Trade 2 And 3                         |
//+------------------------------------------------------------------+
void CheckCloseTrade23()
{

int err = 0, total = OrdersTotal();
bool CloseTrade=false;

for(int z = total - 1; z >= 0; z --)
   {
   if(!OrderSelect( z, SELECT_BY_POS))
      {
      err = GetLastError();
      Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err );
      continue;
      }

   if(OrderSymbol() != Symbol()) continue;

   if(OrderMagicNumber() != MAGICMA01) continue;
   
   if(OrderType() == OP_BUY && (OrderOpenPrice()-Bid > Point * Mode3_CloseTrade2_3)) {CloseTrade=true;}
   if(OrderType() == OP_SELL && (Ask-OrderOpenPrice() > Point * Mode3_CloseTrade2_3)) {CloseTrade=true;}

   if(CloseTrade)
      {
      for(int y = total - 1; y >= 0; y --)
         {
         if(!OrderSelect( y, SELECT_BY_POS))
            {
            err = GetLastError();
            Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
            continue;
            }
         if(OrderSymbol() != Symbol()) continue;

         if(OrderMagicNumber() == MAGICMA02 || OrderMagicNumber() == MAGICMA03)
            {
            if(OrderType() == OP_BUY)
               {
               if(OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet)<0)
                  {
                  err = GetLastError();
                  Print("Error Ordersend(",err,"): ");
                  return(-1);
                  }
               return(0); 
               }
            if(OrderType() == OP_SELL)
               {
               if(OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet)<0)
                  {      
                  err = GetLastError();
                  Print("Error Ordersend(",err,"): ");
                  return(-1);
                  }
              return(0); 
               }
             }
}
}
}
}


//+------------------------------------------------------------------+
//| END Function Check Close Trade 2 And 3                               |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Check First Trade Mode3                                         |
//+------------------------------------------------------------------+

void Mode3_MoveSL_Trade_2_3()
{

int err = 0, total = OrdersTotal(), history = HistoryTotal();
bool ChangeStopLoss = false;

for(int z = history - 1; z >= 0; z --)
   {
   if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY))
      {
      err = GetLastError();
      Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err );
      continue;
      }

   if(OrderSymbol() != Symbol()) continue;

   if(OrderMagicNumber() == MAGICMA03) break;
   
   if(OrderMagicNumber() == MAGICMA02) break;
 
   if(OrderMagicNumber() != MAGICMA01) continue;

   if(OrderProfit() > 0) 
      {
      ChangeStopLoss=true;
      break;
      }
   }


  if(ChangeStopLoss==true)
   {
   for(int y = total - 1; y >= 0; y --)
      {
      if(!OrderSelect(y,SELECT_BY_POS))
         {
         err = GetLastError();
         Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
         continue;
         }

      if(OrderSymbol() != Symbol()) continue;

      if(OrderMagicNumber() == MAGICMA02 || OrderMagicNumber() == MAGICMA03)
         {
         if(OrderType()==OP_BUY)
            {
            if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,GreenYellow)<0)
            {
            err = GetLastError();
            Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
            continue;
            }
//         return(0);  
         }

         if(OrderType()==OP_SELL)
         {
         if(OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice(),OrderTakeProfit(),0,GreenYellow)<0)
            {
            err = GetLastError();
            Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
            continue;
            }
//         return(0);  
         }
}      
}
}
}
//}
//+------------------------------------------------------------------+
//| END Check First Trade Mode 3                                     |
//+------------------------------------------------------------------+
 
 
//+------------------------------------------------------------------+
//| START Check Second Trade Mode3                                   |
//+------------------------------------------------------------------+

void Mode3_MoveSL_Trade_3()
{

double NewSLTrade3B,NewSLTrade3S;
int err = 0, total = OrdersTotal(), history = HistoryTotal();
bool ChangeStopLoss = false;

for(int z = history - 1; z >= 0; z --)
   {
   if(!OrderSelect( z,SELECT_BY_POS,MODE_HISTORY))
      {
      err = GetLastError();
      Print("OrderSelect( ", z, ", SELECT_BY_POS ) - Error #",err );
      continue;
      }

   if(OrderSymbol() != Symbol()) continue;

   if(OrderMagicNumber() == MAGICMA03) break;
   
   if(OrderMagicNumber() == MAGICMA01) break;
 
   if(OrderMagicNumber() != MAGICMA02) continue;

   if(OrderProfit() > 0) 
      {
      for(int y = total - 1; y >= 0; y --)
         {
         if(!OrderSelect(y,SELECT_BY_POS))
            {
            err = GetLastError();
            Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
            continue;
            }

         if(OrderSymbol() != Symbol()) continue;

         if(OrderMagicNumber() == MAGICMA03)
            {
            if(OrderType()==OP_BUY)
               {
               NewSLTrade3B=OrderOpenPrice()+NormalizeDouble(((OrderTakeProfit()-OrderOpenPrice())/2),Digits);
               if(OrderModify(OrderTicket(),OrderOpenPrice(),NewSLTrade3B,OrderTakeProfit(),0,GreenYellow)<0)
                  {
                  err = GetLastError();
                  Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
                  continue;
                  }
               return(0);  
               }

            if(OrderType()==OP_SELL)
               {
               NewSLTrade3S=OrderOpenPrice()-NormalizeDouble(((OrderOpenPrice()-OrderTakeProfit())/2),Digits);
               if(OrderModify(OrderTicket(),OrderOpenPrice(),NewSLTrade3S,OrderTakeProfit(),0,GreenYellow)<0)
                  {
                  err = GetLastError();
                  Print("OrderSelect( ", y, ", SELECT_BY_POS ) - Error #",err );
                  continue;
                  }
               return(0);  
               }
}      
}
}
}
}

//+------------------------------------------------------------------+
//| END Check Second Trade Mode 3                                    |
//+------------------------------------------------------------------+ 
 
  
//+------------------------------------------------------------------+
//| START Function Diverge                                           |
//+------------------------------------------------------------------+

double divergence(int F_Period, int S_Period, int F_Price, int S_Price, int mypos)
  {
    int i;
    double maF1, maF2, maS1, maS2;

    maF2 = iMA(Symbol(), 0, F_Period, 0, MODE_SMA, F_Price, mypos + 1);
    maS2 = iMA(Symbol(), 0, S_Period, 0, MODE_SMA, S_Price, mypos + 1);

    return(maF2-maS2);
  }

//+------------------------------------------------------------------+
//| END Function Diverge                                             |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Valid Trade Time                                  |
//+------------------------------------------------------------------+

bool F_ValidTradeTime (int iHour)
   {
      if(((iHour >= TradeFrom1) && (iHour <= (TradeUntil1-1)))||((iHour>= TradeFrom2) && (iHour <= (TradeUntil2-1)))||((iHour >= TradeFrom3)&& (iHour <= (TradeUntil3-1)))||((iHour >= TradeFrom4) && (iHour <=(TradeUntil4-1))))
      {
       return (true);
      }
      else
       return (false);
   }  

//+------------------------------------------------------------------+
//| END Function Valid Trade Time                                    |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Check Close Trade After x Hours                            |
//+------------------------------------------------------------------+

void CheckCloseAfterHours()
{
int total = OrdersTotal();

for(int cnt=0;cnt<total;cnt++)
   {
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   if(OrderType()<=OP_SELL &&
      OrderSymbol()==Symbol() &&
      OrderMagicNumber()==MAGICMA_A)
      {            
         if((CurTime()-OrderOpenTime())>(CloseAfterHours*3600) && OrderProfit()<0)
            {
            OrderClose(OrderTicket(),OrderLots(),Bid,10,Violet);
            }
      }
   }
}

//+------------------------------------------------------------------+
//| END Check Close Trade After x Hours                              |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Check Signals                                     |
//+------------------------------------------------------------------+

//=====================SIGNAL1========================
int CheckSignal(int Signal)
{
Signal=0;

bool BuySignal1=false, SellSignal1=false;

double HighEnvelope1 = iEnvelopes(NULL,0,EnvelopePeriod,MODE_SMA,0,PRICE_CLOSE,Percent,MODE_UPPER,1);
double LowEnvelope1  = iEnvelopes(NULL,0,EnvelopePeriod,MODE_SMA,0,PRICE_CLOSE,Percent,MODE_LOWER,1);
double CloseBar1     = iClose(NULL,0,1);

if(UseSignal1)
{
   if(CloseBar1 > HighEnvelope1) {SellSignal1 = true;} 
   if(CloseBar1 < LowEnvelope1)  {BuySignal1  = true;}
}
else {SellSignal1=true;BuySignal1=true;}



//=====================SIGNAL2========================

bool BuySignal2=false, SellSignal2=false;

double SMA1=iMA(NULL,0,SMAPeriod,0,MODE_SMA,PRICE_CLOSE,1);
double SMA2=iMA(NULL,0,SMAPeriod,0,MODE_SMA,PRICE_CLOSE,SMA2Bars);

if(UseSignal2)
{
   if(SMA2-SMA1>0) {BuySignal2  = true;}
   if(SMA2-SMA1<0) {SellSignal2 = true;}
}
else {SellSignal2=true;BuySignal2=true;}



//=====================SIGNAL3========================

bool BuySignal3=false, SellSignal3=false;

double OsMABar2=iOsMA(NULL,0,OSMASlow,OSMAFast,OSMASignal,PRICE_CLOSE,2);
double OsMABar1=iOsMA(NULL,0,OSMASlow,OSMAFast,OSMASignal,PRICE_CLOSE,1);

if(UseSignal3)
{
   if(OsMABar2 > OsMABar1)  {SellSignal3 = true;}
   if(OsMABar2 < OsMABar1)  {BuySignal3  = true;}
}
else {SellSignal3=true;BuySignal3=true;}


      
//=====================SIGNAL4========================  

   double diverge;
   bool BuySignal4=false,SellSignal4=false;
   
   diverge = divergence(Fast_Period, Slow_Period, Fast_Price, Slow_Price,0);

if(UseSignal4)
{
   if(diverge >= DVBuySell && diverge <= DVStayOut)
       {BuySignal4 = true;}
   if(diverge <= (DVBuySell*(-1)) && diverge >= (DVStayOut*(-1))) 
       {SellSignal4 = true;} 
}       
else {SellSignal4=true;BuySignal4=true;}


    
//=====================SIGNAL5=======================  

bool BuySignal5=false, SellSignal5=false;

if(UseSignal5)
{
   int iHour=TimeHour(LocalTime());
   int ValidTradeTime = F_ValidTradeTime(iHour);
   if(ValidTradeTime==true)
    {
    BuySignal5=true;
    SellSignal5=true;
    }
}
else {SellSignal5=true;BuySignal5=true;}

if((SellSignal1==true) && (SellSignal2==true) && (SellSignal3==true) && (SellSignal4==true) && (SellSignal5==true)) return(1);  
if((BuySignal1==true) && (BuySignal2==true) && (BuySignal3==true) && (BuySignal4==true) && (BuySignal5==true)) return(2);
}

//+------------------------------------------------------------------+
//| END Function Check Signals                                       |
//+------------------------------------------------------------------+   

//+------------------------------------------------------------------+
//| START Calculate optimal lot size                                 |
//+------------------------------------------------------------------+

double LotsOptimized()
  {
  if(MM==false) return(Lots);
   double lot=Lots;
   int    orders=HistoryTotal();
   int    losses=0;
   int    decimalPlaces=1;
   
   if(AccountIsMicro==true) decimalPlaces=2;

   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,decimalPlaces);
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,decimalPlaces);
     }

   if(lot<0.1 && AccountIsMicro==false) lot=0.1;
   if(lot<0.01 && AccountIsMicro==true) lot=0.01;
   if(lot>99) lot=99;
   return(lot);

  }
  
//+------------------------------------------------------------------+
//| END Calculate optimal lot size                                   |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| START Function Check TrailingStop                                |
//+------------------------------------------------------------------+
void CheckTrailingStop()
{
   for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA_A || OrderSymbol()!=Symbol()) continue;
   
      if(OrderType() == OP_BUY)
         {
         if(((Bid - OrderOpenPrice()) > (Point * TrailingStop)) && (OrderStopLoss() < (Bid - Point * TrailingStop)))
            OrderModify(
                        OrderTicket(),
                        OrderOpenPrice(),
                        Bid - Point * TrailingStop,
                        OrderTakeProfit(),
                        0,
                        GreenYellow);
         }
      
      if(OrderType() == OP_SELL)
         {
         if(((OrderOpenPrice() - Ask) > (Point * TrailingStop)) && (OrderStopLoss() > (Ask + Point * TrailingStop)))
            OrderModify(
                        OrderTicket(),
                        OrderOpenPrice(),
                        Ask + Point * TrailingStop,
                        OrderTakeProfit(),
                        0,
                        Red);
         }            
      }
}
//+------------------------------------------------------------------+
//| END Function Check TrailingStop                                  |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| START Function Check BreakEven                                   |
//+------------------------------------------------------------------+

void CheckBreakEven()
{
for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA_A || OrderSymbol()!=Symbol()) continue;
   
      if(OrderType() == OP_BUY)
         {
         if((Bid-OrderOpenPrice()) > (Point*BreakEvenAfterPips))
            OrderModify(
                        OrderTicket(),
                        OrderOpenPrice(),
                        OrderOpenPrice(),
                        OrderTakeProfit(),
                        0,
                        GreenYellow);
         }
      
      if(OrderType() == OP_SELL)
         {
         if((OrderOpenPrice()-Ask) > (Point*BreakEvenAfterPips))
            OrderModify(
                        OrderTicket(),
                        OrderOpenPrice(),
                        OrderOpenPrice(),
                        OrderTakeProfit(),
                        0,
                        Red);
         }            
      }
}

//+------------------------------------------------------------------+
//| END Function Check BreakEven                                 |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| START Function Close First Trade                                 |
//+------------------------------------------------------------------+


int CloseFirstTrade()
{
   for(int i=0;i<OrdersTotal();i++)
      {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false)        break;
      if(OrderMagicNumber()!=MAGICMA_A || OrderSymbol()!=Symbol()) continue;
      
         OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet); 
         return(0); 
      }
}  
//+------------------------------------------------------------------+
//| END Function Close First Trade                                   |
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| START Function Calculate Current Orders Mode 3                   |
//+------------------------------------------------------------------+
int Mode3CalculateCurrentOrders(string symbol)
  {
   int buys=0,sells=0;

   for(int i=0;i<OrdersTotal();i++)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;
      if(
      (OrderSymbol()==Symbol()) && 
      ((OrderMagicNumber()==MAGICMA01) ||
       (OrderMagicNumber()==MAGICMA02) || 
       (OrderMagicNumber()==MAGICMA03)))
        {
         if(OrderType()==OP_BUY)  buys++;
         if(OrderType()==OP_SELL) sells++;
        }
     }
    return(buys+sells);
  }
//+------------------------------------------------------------------+
//| STOP Function Calculate Current Orders Mode 3                    |
//+------------------------------------------------------------------+





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Moving average indicator
Envelopes indicator
Moving Average of Oscillator


Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It automatically opens orders when conditions are reached
It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features:

BackTest : EURUSD on H1

From 2009-08-01 to 2009-10-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2009-12-01 to 2010-01-17 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-04-01 to 2010-04-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-05-01 to 2010-05-31 Profit Factor:0.00 Total Net Profit:0.00

BackTest : EURUSD on H1

From 2010-06-01 to 2010-06-30 Profit Factor:0.00 Total Net Profit:0.00

BackTest : GBPUSD on H1

From 2010-01-01 to 2010-02-27 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDCAD on H1

From 2009-12-01 to 2010-01-01 Profit Factor:0.00 Total Net Profit:0.00

BackTest : USDJPY on H1

From 2009-11-01 to 2009-11-30 Profit Factor:0.00 Total Net Profit:0.00

Request Backtest for Phoenix_EA_v5_6_03


From : (yyyy/mm/dd) To: (yyyy/mm/dd)

Pair: Period: