MorningFlat_Expert_V3





//+------------------------------------------------------------------+
//|                                            MorninFlat_Expert.mq4 |
//|                                                        Scriptong |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Scriptong"
#property link      ""

//---- input parameters
extern double    Lots        = 0.1;
extern int       StartHour   = 0;
extern int       EndHour     = 8;
extern double    TargetLevel = 200;
extern int       MagicNumber = 17589 ;

bool Activate, FreeMarginAlert;
double Tick, Spread, StopLevel, MinLot, MaxLot, LotStep;
double FUp, FDn;   // Çíà÷åíèÿ ïîñëåäíèõ ôðàêòàëîâ (FUp - ïåðâûé âåðõíèé, FDn - ïåðâûé íèæíèé)
int NUp, NDn;
datetime LastBar, LastBuyBar, LastSellBar, EuroLast, FrancLast;
int CurTrend, EuroTrend, FrancTrend;  // Òåêóùåå íàïðàâëåíèå òðåíäà (0 - íå îïðåäåëåíî, 1 - âîñõîäÿùèé, 2 - íèñõîäÿùèé)
double EuroLowV, EuroHighV, EuroTargetU, EuroTargetD, FrancLowV, FrancHighV, FrancTargetU, FrancTargetD;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   Activate = False;
   Tick = MarketInfo(Symbol(), MODE_TICKSIZE);
   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);
   StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point+Tick);  
   MinLot = MarketInfo(Symbol(), MODE_MINLOT);
   MaxLot = MarketInfo(Symbol(), MODE_MAXLOT);
   LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);

   // Ïðîâåðêà êîððåêòíîñòè îáúåìà ñäåëêè
   if(Lots < MinLot || Lots > MaxLot)
     {
      Comment("Ïàðàìåòðîì Lots áûë çàäàí íåïðàâèëüíûé îáúåì ñäåëêè! Ñîâåòíèê îòêëþ÷åí!");
      return(0);
     }
   Lots = MathRound(Lots/LotStep)*LotStep;

   if(StartHour < 0 || EndHour < 0 || StartHour > 23 || EndHour > 23 || StartHour >= EndHour)
     {
      Comment("Çíà÷åíèÿ StartHour è EndHour äîëæíû ëåæàòü â äèàïàçîíå îò 0 äî 24 è StartHour < EndHour.");
      return(0);
     } 
     
   LastBar = 0;
   LastBuyBar = 0;
   LastSellBar = 0;
   EuroLast = 0;
   FrancLast = 0;
   Activate = True;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   Comment("");
//----
   return(0);
  }
  
//+------------------------------------------------------------------+
//| Ïðèâåäåíèå çíà÷åíèé ê òî÷íîñòè îäíîãî òèêà                       |
//+------------------------------------------------------------------+
double ND(double A)
{
 return(NormalizeDouble(A, Digits));
}  
  
//+------------------------------------------------------------------+
//| Îòêðûòèå ïîçèöèè                                                 |
//| Âîçâðàùàåò:                                                      |
//|   True - Ïîçèöèÿ îòêðûòà óñïåøíî                                 |
//|   False - Îøèáêà îòêðûòèÿ                                        |
//+------------------------------------------------------------------+
bool OpenOrder(int Type, double Price, double SL, double TP)
{
 // Áëîê ïðîâåðêè äîñòàòî÷íîñòè ñâîáîäíûõ ñðåäñòâ
 if(AccountFreeMarginCheck(Symbol(), OP_BUY, Lots) <= 0 || GetLastError() == 134)
  {
   if(!FreeMarginAlert)
    {
     Print("Íåäîñòàòî÷íî ñðåäñòâ äëÿ îòêðûòèÿ ïîçèöèè. Free Margin = ", AccountFreeMargin());
     FreeMarginAlert = True;
    } 
   return;  
  }
 FreeMarginAlert = False;  
 // ---------------------------------------------

 if(Type == OP_BUY)
   string S = "BUY";
  else
   S = "SELL"; 
 int ticket=OrderSend(Symbol(), Type, Lots, ND(Price), 3, SL, TP, NULL, MagicNumber, 0, CLR_NONE);
 if(ticket<0)
   {
    Print("Îøèáêà îòêðûòèÿ ïîçèöèè ", S, ": ",GetLastError()); 
    return(False);
   } 
 return(True); 
}   


//+----------------------------------------------------------------------------------------------------------------------+
//| Çàêðûâàåò âñå ïîçèöèè òèïà Type. Åñëè çàêðûòü íå óäàëîñü èëè ïðèñóòñòâóþò ïðîòèâîïîëîæíûå ïîçèöèè, âîçâðàùàåò False  |
//+----------------------------------------------------------------------------------------------------------------------+
bool CheckOrders(int Type)
{
 for(int i = OrdersTotal()-1; i >= 0; i--)
   if(OrderSelect(i, SELECT_BY_POS))
     if(OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber && OrderType() < 2) 
       if(OrderType() == Type)
         {
          if(Type == OP_BUY)
            double Pr = ND(Bid);
           else
            Pr = ND(Ask); 
          if(!OrderClose(OrderTicket(), OrderLots(), Pr, 3))
            return(False);
           else
             RefreshRates();
         }
        else
         {
          if (OrderType() == OP_BUY)
            LastBuyBar = iTime(Symbol(), PERIOD_D1, 0);
           else
            LastSellBar = iTime(Symbol(), PERIOD_D1, 0); 
          return(False); 
         } 
 return(True);        
}
 
//+----------------------------------+
//| Ïîèñê ïðîáèòèÿ ïî îäíîé âàëþòå.  |
//+----------------------------------+ 
void CheckBit(string Pair, double& LowV, double& HighV, double& TargetU, double& TargetD, int& Trend)
{
  datetime BeginDay = iTime(Pair, PERIOD_D1, 0);  // Ðàñ÷åò âðåìåíè íà÷àëà ñóòîê
  int StartBar = iBarShift(Pair, PERIOD_H1, BeginDay+StartHour*3600);   // Áàð, ñîîòâåòñâóþùèé íà÷àëó ñóòîê ïëþñ ñìåùåíèå â ÷àñàõ
  int FinishBar = iBarShift(Pair, PERIOD_H1, BeginDay+(EndHour-1)*3600); // Áàð, ñîîòâåòñòâóþùèé ïîñëåäíåìó áàðó "óòðåííåãî ôëýòà"
  LowV = iLow(Pair, PERIOD_H1, iLowest(Pair, PERIOD_H1, MODE_LOW, StartBar-FinishBar+1, FinishBar));  // Íèæíÿÿ ãðàíèöà
  HighV = iHigh(Pair, PERIOD_H1, iHighest(Pair, PERIOD_H1, MODE_HIGH, StartBar-FinishBar+1, FinishBar)); // Âåðõíÿÿ ãðàíèöà
  TargetU = (HighV-LowV)*(TargetLevel-100)/100+HighV;
  TargetD = LowV-(HighV-LowV)*(TargetLevel-100)/100;
  // ------------------------
  
  // Ïîèñê ïîñëåäíåãî ïðîáèòèÿ êàíàëà
  Trend = 0;
        // Ïðîáåæêà ïî ìèíóòêàì
        int FinishBarM1 = iBarShift(Pair, PERIOD_M1, BeginDay+EndHour*3600);   // Áàð íà Ì1, ñîîòâåòñâóþùèé íà÷àëó ÷àñà EndHour
        for(int i = 0; i < FinishBarM1; i++)
          {
           if(iHigh(Pair, PERIOD_M1, i) > HighV)
             {
              Trend = 1;
              break;
             }
           if(iLow(Pair, PERIOD_M1, i) < LowV)
             {
              Trend = 2;
              break;
             }
          }
        // ---------------------  
}    
 
 
//+------------------------------+
//| Ïðîâåðêà âîçìîæíîñòè âõîäà.  |
//+------------------------------+ 
void CheckLevels()
{
  // ðàñ÷åò çíà÷åíèé äëÿ åâðî
  if (EuroLast < iTime("EURUSD", PERIOD_D1, 0))
    {
     EuroTrend = 0;
     CheckBit("EURUSD", EuroLowV, EuroHighV, EuroTargetU, EuroTargetD, EuroTrend);
     EuroLast = iTime("EURUSD", PERIOD_D1, 0);
    }
   else
     if (iATR("EURUSD", PERIOD_D1, 24, 1) > 2*(EuroHighV - EuroLowV))
       {
        if (Symbol() == "EURUSD")
          double Price = ND(Bid);
        else
          Price = ND(iClose("EURUSD", PERIOD_M1, 1));
        if (Price > EuroHighV)
           EuroTrend = 1;
        if (Price < EuroLowV)
           EuroTrend = 2;     
       } 
      else
       EuroTrend = 0; 
  // -------------------------
  
  // ðàñ÷åò çíà÷åíèé äëÿ ôðàíêà
  if (FrancLast < iTime("USDCHF", PERIOD_D1, 0))
    {
     FrancTrend = 0;
     CheckBit("USDCHF", FrancLowV, FrancHighV, FrancTargetU, FrancTargetD,  FrancTrend);
     FrancLast = iTime("USDCHF", PERIOD_D1, 0);
    } 
   else
     if (iATR("USDCHF", PERIOD_D1, 24, 1) > 2*(FrancHighV - FrancLowV))
       { 
        if (Symbol() == "USDCHF")
          Price = ND(Bid);
         else
          Price = ND(iClose("USDCHF", PERIOD_M1, 1));
        if (Price > FrancHighV)
          FrancTrend = 1;
        if (Price < FrancLowV)
          FrancTrend = 2;     
       }  
  // --------------------------
  
  CurTrend = 0;
  if(EuroTrend > 0 && FrancTrend > 0)
    {
     if(EuroTrend == 1 && FrancTrend == 2)
       {
        if(Symbol() == "EURUSD")
          CurTrend = 1;
        if(Symbol() == "USDCHF")  
          CurTrend = 2;
       }   
     if(EuroTrend == 2 && FrancTrend == 1)
       {
        if(Symbol() == "EURUSD")
          CurTrend = 2;
        if(Symbol() == "USDCHF")  
          CurTrend = 1;
       }   
    }
}

//+--------------------------------------------------------+
//| Ïðîâåðêà íà ïðåäìåò äîñòèæåíèÿ ïåðâîé öåëè.            |
//+--------------------------------------------------------+ 
void CheckBreakEven()
{
 for (int i = OrdersTotal()-1; i >= 0; i--)
   if (OrderSelect(i, SELECT_BY_POS))
     if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
       {
        // Ïðîâåðêà äîñòèæåíèÿ öåëè
           double Price = 0;
            // Äëÿ åâðî
           if (Symbol() == "EURUSD")
             {
              if (EuroTargetD == 0)
                return;
              if (OrderType() == OP_BUY)
                {
                 if (ND(Bid - EuroTargetU) >= 0)
                   {
                    Price = ND(EuroHighV+Tick);
                    if (ND(Price - OrderOpenPrice() - Tick) < 0)
                      Price = ND(OrderOpenPrice() + Tick);
                    if (ND(Bid - Price - StopLevel) <= 0 || ND(Price-OrderStopLoss()) <= 0)  
                      Price = 0;
                   } 
                }
               else
                if (ND(EuroTargetD - Bid) >= 0)
                  {
                   Price = ND(EuroLowV-Tick);
                   if (ND(Price - OrderOpenPrice() + Tick) > 0)
                     Price = ND(OrderOpenPrice() - Tick);
                   if (ND(Price - StopLevel - Ask) <= 0 || ND(OrderStopLoss() - Price) <= 0)  
                     Price = 0;
                  } 
             }      
            // --------------
            
            // Äëÿ ôðàíêà 
           if (Symbol() == "USDCHF")
             {
              if (FrancTargetD == 0)
                return;
              if (OrderType() == OP_BUY)
                {
                 if (ND(Bid - FrancTargetU) >= 0)
                   {
                    Price = ND(FrancHighV+Tick);
                    if (ND(Price - OrderOpenPrice() - Tick) < 0)
                      Price = ND(OrderOpenPrice() + Tick);
                    if (ND(Bid - Price - StopLevel) <= 0 || ND(Price-OrderStopLoss()) <= 0)  
                      Price = 0;
                   }   
                }
               else
                if (ND(FrancTargetD - Bid) >= 0)
                  {
                   Price = ND(FrancLowV-Tick);
                   if (ND(Price - OrderOpenPrice() + Tick) > 0)
                     Price = ND(OrderOpenPrice() - Tick);
                   if (ND(Price - StopLevel - Ask) <= 0 || ND(OrderStopLoss() - Price) <= 0)  
                     Price = 0;
                  }   
             }  
            // ------------
        // ----------------------------------  
      
        // Íåïîñðåäñòâåííî ìîäèôèêàöèÿ
        if (Price != 0)     
           OrderModify(OrderTicket(), 0, Price, 0, 0);
        return;
        // ---------------------------  
       }
}  
  
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   if(!Activate)
     return(0);

   CheckBreakEven();

   if(Hour() < EndHour)
     return(0);
     
   CheckLevels();
   
   if(CurTrend == 1)  
     if(CheckOrders(OP_SELL))
       if (LastBuyBar < iTime(Symbol(), PERIOD_D1, 0))
         {
          if(Symbol() == "EURUSD")
            {
             double TP = ND(EuroTargetU);
             double SL = ND(EuroTargetD);
            } 
           else
            {
             TP = ND(FrancTargetU); 
             SL = ND(FrancTargetD);
            } 
          if(ND(TP - Ask - StopLevel) > 0 && ND(Bid - SL - StopLevel) > 0)
            if (OpenOrder(OP_BUY, Ask, SL, 0))
              LastBuyBar = iTime(Symbol(), PERIOD_D1, 0);
         }   

   if(CurTrend == 2)  
     if(CheckOrders(OP_BUY))
       if (LastSellBar < iTime(Symbol(), PERIOD_D1, 0))
         {
          if(Symbol() == "EURUSD")
            {
             TP = ND(EuroTargetD + Spread);
             SL = ND(EuroTargetU + Spread);
            } 
           else
            {
             TP = ND(FrancTargetD + Spread); 
             SL = ND(FrancTargetU + Spread);
            } 
          if(ND(Bid - TP - StopLevel) > 0 && ND(SL - Ask - StopLevel) > 0)
            if (OpenOrder(OP_SELL, Bid, SL, 0))
              LastSellBar = iTime(Symbol(), PERIOD_D1, 0);
         }   
     
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Indicator of the average true range


Custom Indicators Used:

Order Management characteristics:
It automatically opens orders when conditions are reached
Checks for the total of open orders
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.95 Total Net Profit:-14.75

BackTest : EURUSD on H1

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

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 : USDCHF on H1

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

BackTest : USDJPY on H1

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

Request Backtest for MorningFlat_Expert_V3


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

Pair: Period: