EMA2





//+------------------------------------------------------------------+
//|                                                          EMA.mq4 |
//|                                                 Âèêòîð ×åáîòàð¸â |
//|                                    http://www.chebotariov.co.ua/ |
//+------------------------------------------------------------------+
#property copyright "Âèêòîð ×åáîòàð¸â"
#property link      "http://www.chebotariov.co.ua/"

#define MAGIC 31052006

extern int    ShortEma = 4; // Ïåðèîä êîðîòêîé MA
extern int    ShortEma2 = 11; // Ïåðèîä âòîðîé êîðîòêîé MA
extern int    LongEma = 16; // Ïåðèîä äëèííîé MA
extern int    ShiftEma = 1;
extern int    RiskMax=45;
extern double LotsMax=90.0;
extern int    DecreaseFactor=6;
extern int    TakeProfit=60;
extern int    StopLoss=80;
extern int    TrailingStop=40;

//+------------------------------------------------------------------+
//| Ðàñ÷åò îïòèìàëüíîãî ðàçìåðà ëîòà                                 |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
//----
   double Lots=NormalizeDouble(AccountBalance()*RiskMax/(100000.0*Ask),1);
   if(AccountFreeMargin()<(1000*Ask*Lots))
     {
      Lots=NormalizeDouble(AccountFreeMargin()*RiskMax/(100000.0*Ask),1);
     }
   if(Lots>LotsMax)
     {
      Lots=LotsMax;
      Print("Ïðåâûøåí ìàêñèìàëüíûé ðàçìåð ëîòà. Ðàçìåð ëîòà èçìåíåí íà ",LotsMax);
     }
   
   int orders=HistoryTotal();
   int losses=0;
   
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false)
           {
            Print("Îøèáêà â èñòîðèè!");
            break;
           }
         if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=MAGIC || OrderType()>OP_SELL)continue;
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
         if(losses>1)
           {
            Lots=NormalizeDouble(Lots/(DecreaseFactor*losses),1);
           }
       }
     if(Lots<MarketInfo(Symbol(),MODE_MINLOT))
       {
        Lots=MarketInfo(Symbol(),MODE_MINLOT);
       }
     double raznica = MathMod(Lots,MarketInfo(Symbol(),MODE_LOTSTEP));
     if(raznica>0.0)
       {
        Lots -= raznica;
       }
//----
   return(Lots);
  }

//+------------------------------------------------------------------+

bool symbolOrders()
   {
//----
   int orders = OrdersTotal();
   for(int i=orders-1; i>=0; i--)
      {
      if(!OrderSelect(i, SELECT_BY_POS ))
         {
         Print("OrderSelect( ", i, ", SELECT_BY_POS ) - Error #", GetLastError());
         continue;
         }
         if(OrderSymbol()==Symbol())
            {
            if(OrderMagicNumber()==MAGIC)
               {
               return(true);
            }
         }
      }
//----
   return(false);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
//----
   int cnt, ticket;
   int total=OrdersTotal();

   if(Bars<100)
     {
      Print("Êîëè÷åñòâî áàðîâ ìåíüøå 100");
      return(0);  
     }
   if(TakeProfit<10 && TakeProfit>0)
     {
      TakeProfit=10;
      Print("Ðàçìåð TakeProfit áûë ìåíüøå 10, ïîýòîìó èçìåíåí íà 10");
     }

   double SEma0 = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,0);
   double SEma1 = iMA(NULL,0,ShortEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma);
   double SEma02 = iMA(NULL,0,ShortEma2,0,MODE_EMA,PRICE_CLOSE,0);
   double SEma12 = iMA(NULL,0,ShortEma2,0,MODE_EMA,PRICE_CLOSE,ShiftEma);  
   double LEma0 = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,0);
   double LEma1 = iMA(NULL,0,LongEma,0,MODE_EMA,PRICE_CLOSE,ShiftEma);
   
   if(!symbolOrders())
     {
      if(AccountFreeMargin()<(1000*LotsOptimized()))
        {
         Print("Ó Âàñ íåäîñòàòî÷íî äåíåã. Ñâîáîäíîé ìàðæè = ", AccountFreeMargin());
         return(0);
        }
      if(SEma0>LEma0 && SEma02<SEma0 && SEma12>SEma1)
        {
         if(!IsTradeAllowed())
           {
            Print("AD BUY: Òîðãîâûé ïîòîê çàíÿò.");
            return(0);
           }       
         ticket=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"EMA BUY",MAGIC,0,CLR_NONE);
         if(ticket>0)
           {
            if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Îòêðûòà ïîçèöèÿ íà ïîêóïêó ïî ñèãíàëó EMA BUY: ",OrderOpenPrice());
              }
            else
              {
               Print("Îøèáêà îòêðûòèÿ ïîçèöèè íà ïîêóïêó ïî ñèãíàëó EMA BUY: ",GetLastError());
               return(0);
              }
           }         
        }
                
      if(SEma0<LEma0 && SEma02>SEma0 && SEma12<SEma1)
        {
         if(!IsTradeAllowed())
           {
            Print("EMA SELL: Òîðãîâûé ïîòîê çàíÿò.");
            return(0);
           }
         ticket=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"EMA SELL",MAGIC,0,CLR_NONE);
         if(ticket>0)
           {
           if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Îòêðûòà ïîçèöèÿ íà ïðîäàæó ïî ñèãíàëó EMA SELL: ",OrderOpenPrice());
              }
            else
              {
               Print("Îøèáêà îòêðûòèÿ ïîçèöèè íà ïðîäàæó ïî ñèãíàëó EMA SELL: ",GetLastError());
               return(0);
              }
           }
        }
     }
     
   for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL && OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
        {
         if(OrderType()==OP_BUY)
           {
            if(SEma0<LEma0 && SEma02>SEma0 && SEma12<SEma1)
              {
               if(!IsTradeAllowed())
                 {
                  Print("Order ñlose: Òîðãîâûé ïîòîê çàíÿò.");
                  return(0);
                 }       
               OrderClose(OrderTicket(),OrderLots(),Bid,3,CLR_NONE);
               return(0);
              }
            if(TrailingStop>0)
              {
               if(Bid-OrderOpenPrice()>Point*TrailingStop)
                 {
                  if(OrderStopLoss()<Bid-Point*TrailingStop)
                    {
                     if(!IsTradeAllowed())
                       {
                        Print("Trailing stop: Òîðãîâûé ïîòîê çàíÿò.");
                        return(0);
                       }       
                     OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE);
                     return(0);
                    }
                 }
              }
           }
         else
           {
            if(SEma0>LEma0 && SEma02<SEma0 && SEma12>SEma1)
              {
               if(!IsTradeAllowed())
                 {
                  Print("Order ñlose: Òîðãîâûé ïîòîê çàíÿò.");
                  return(0);
                 }                    
               OrderClose(OrderTicket(),OrderLots(),Ask,3,CLR_NONE);
               return(0);
              }
            if(TrailingStop>0)
              {
               if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
                 {
                  if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
                    {
                     if(!IsTradeAllowed())
                       {
                        Print("Trailing stop: Òîðãîâûé ïîòîê çàíÿò.");
                        return(0);
                       }                   
                     OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,CLR_NONE);
                     return(0);
                    }
                 }
              }
           }
        }      
     }   
//----
   return(0);
  }
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:

Moving average indicator


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.59 Total Net Profit:-8134.75

BackTest : EURUSD on H1

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

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.42 Total Net Profit:-8874.85

BackTest : USDCAD on H1

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

Request Backtest for EMA2


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

Pair: Period: