Momo_Trades_V3





//+------------------------------------------------------------------+
//|                                                  Momo_Trades.mq4 |
//|                      Copyright © 2008, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "#xrustsolution#"
#property link      "#xrust.ucoz.net#"
//-------------------------------------------------------------------+
// äîáàâëåíà ôóíêöèÿ áåçóáûòêà                                       +
// äîáàâëåí ðàñ÷åò ÒÏ îòøèðèíû êàíàëà
//---- input parameters----------------------------------------------+
extern double    Lots=0.1;
extern double    Risk=0.1;
extern int       Sl=100;
extern int       Tp=0;
extern int       bu=0;//êîë-âî ïóíêòîâ òðàëà: Åñëè "0",òî â áåçóáûòîê
extern int       magic=78977;
extern int       PriseShift=10;
extern bool      AutoLot=false;
extern bool      CloseEndDay=true;
extern bool      BU=false;
//---- Ma parameters-------------------------------------------------+
extern int       MaPeriod=22;
extern int       MaShift=1;
//---- MaCd parameters-----------------------------------------------+ 
extern int       Fast=12;      
extern int       Slow=26;
extern int       Signal=9;
extern int       MacdShift=1;
//------Variables----------------------------------------------------+
static int prevtime = 0 ;
double MacdMain[11];
//int
bool UseSound=false;
//------------------
bool first=true;
double MinLot, MaxLot, MarginMinLot;//,Risk=0.1; 
int    MinLotDgts;
//+------------------------------------------------------------------+
void FirstCalc()
{
// 
// Ïðåäñòàðòîâûé ðàñ÷åò. Âûïîëíÿåòñÿ îäèí ðàç - ïðè çàïóñêå
// (è êàæäûé ðàç ïîñëå ñáîÿ ñâÿçè).
//
      first=false;
//+--- Ìèíèìàëüíûé è ìàêñèìàëüíûé ðàçìåðû ëîòîâ
   MinLot=MarketInfo(Symbol(),MODE_MINLOT);
   if(MinLot<0.1) MinLotDgts=2; // ðàçìåðíîñòü ìèíëîòà   
   else
   {
      if(MinLot<1.0) MinLotDgts=1;
      else MinLotDgts=0;
   }
   MaxLot=MarketInfo(Symbol(),MODE_MAXLOT);   
//----
   return;
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
   //if(!IsTesting())return(0);



   
   ArrayInitialize(MacdMain,0.0); 
// Æäåì, êîãäà ñôîðìèðóåòñÿ íîâûé áàð
   if (Time[0] == prevtime) return(0);
      prevtime = Time[0]; 
      MACD();  
      if(first==true) FirstCalc();
//----------------------BU--------------------------------------------+   
   if(OrdersTotal()>0&&BU){
    for(int n=0;n<OrdersTotal();n++){
     if(OrderSelect(n,SELECT_BY_POS,MODE_TRADES)){Bu(OrderTicket());}}}
//-------------------------------------------------------------------+
   if(OrdersTotal()<1){
   if(MacdBuy()&&EmaBuy()){open(false,Sl,Tp,Lots);}
   
   if(MacdSell()&&EmaSell()){open(true,Sl,Tp,Lots);}
   }
//-------------------------------------------------------------------+
   if(DayOfWeek()!=5){int end=23;}else{end=21;}
   if(CloseEndDay&&OrdersTotal()>0&&Hour()==end){
    for(int m=0;m<OrdersTotal();n++){
     if(OrderSelect(m,SELECT_BY_POS,MODE_TRADES)){del(OrderTicket());}}} 


   if(OrdersTotal()>0){Comment(TimeOpenLastPos());}
//----
   return(0);
  }
//+------------------------------------------------------------------+
double CalcLotsAuto()
{
   // íóæåí çàëîã íà ìèíëîò
   double MarginMinLot=MarketInfo(Symbol(),MODE_MARGINREQUIRED)*MinLot;
   // èìååì ñâîáîäíûõ ñðåäñòâ
   double FreeMargin=AccountFreeMargin();
   // åñëè èõ íå èìååì :(
   if(MarginMinLot>FreeMargin) return(-1.0);
   // à åñëè èìååì, òî ñêîëüêî ëîòîâ ìîæåì ñåáå ïîçâîëèòü íà ïîçó
   int n=1;
   int m=NormalizeDouble(MaxLot/MinLot,0);
   double level=MarginMinLot*2;
   while(level<=FreeMargin && n<=m)
   {
      n++;
      level=level+MarginMinLot*n*Risk; // Ìåíåå àãðåññèâíî, äëÿ ìèíèôîðåêñà
      //level=level+MarginMinLot*MathSqrt(n*Risk); // Áîëåå àãðåññèâíî
   }
   n--;
   double lots=NormalizeDouble((MinLot*n),MinLotDgts);
   return(lots);
}  
//+------------------------------------------------------------------+
void MACD(){
for(int i=0;i<10;i++){
MacdMain[i]=iMACD(Symbol(),0,Fast,Slow,Signal,0,MODE_MAIN,MacdShift+i);}}
//+------------------------------------------------------------------+
bool MacdBuy(){
bool _MacdBuy=false;
   if(
     (MacdMain[3]>MacdMain[4]&&
      MacdMain[4]>MacdMain[5]&&
      MacdMain[5]==0&&
      MacdMain[5]>MacdMain[6]&&
      MacdMain[6]>MacdMain[7])||
     (MacdMain[3]>MacdMain[4]&&
      MacdMain[4]>MacdMain[5]&&
      MacdMain[5]>=0&&
      MacdMain[6]<=0&& 
      MacdMain[6]>MacdMain[7]&&
      MacdMain[7]>MacdMain[8])){_MacdBuy=true;}
return(_MacdBuy);}      
//+------------------------------------------------------------------+
bool MacdSell(){
bool _MacdSell=false;
   if(
     (MacdMain[3]<MacdMain[4]&&
      MacdMain[4]<MacdMain[5]&&
      MacdMain[5]==0&&
      MacdMain[5]<MacdMain[6]&&
      MacdMain[6]<MacdMain[7])||
     (MacdMain[3]<MacdMain[4]&&
      MacdMain[4]<MacdMain[5]&&
      MacdMain[5]<=0&&
      MacdMain[6]>=0&& 
      MacdMain[6]<MacdMain[7]&&
      MacdMain[7]<MacdMain[8])){_MacdSell=true;}
return(_MacdSell);}  
//+------------------------------------------------------------------+  
bool EmaBuy(){bool _Emabuy=false;
 if(Close[MaShift]
    -iMA(Symbol(),0,MaPeriod,0,1,0,MaShift)>PriseShift*Point)
      {_Emabuy=true;}
return(_Emabuy);}
//+------------------------------------------------------------------+  
bool EmaSell(){bool _EmaSell=false;
 if(iMA(Symbol(),0,MaPeriod,0,1,0,MaShift)
         -Close[MaShift]>PriseShift*Point){_EmaSell=true;}
return(_EmaSell);}  
//--------Ôóíêöèÿ îòêðûòèÿ îðäåðîâ-------------------------------------+
int open(bool tip,int Sl,int Tp,double lots)
{//tip = false => OP_BUYSTOP ; tip = true => OP_SELLSTOP;
   GetLastError();
   int err;
   if(AutoLot){lots=CalcLotsAuto();}
   double lastprise,prise,sl,tp; // ñàìàÿ ñâåæàÿ öåíà
   int ticket;
   int slip =(MarketInfo(Symbol(),MODE_SPREAD))*Point;//ìàêñ îòêëîíåíèå = ñïðåäó
   
//------   
   while (!IsTradeAllowed()){ Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê
   if (tip == false)
    {
     prise = NormalizeDouble(MarketInfo(Symbol(),MODE_ASK),Digits);
     if(Sl!=0){sl = NormalizeDouble((MarketInfo(Symbol(),MODE_BID)-(Sl*Point)),Digits);}else{sl=0;}
     if(Tp!=0){tp = NormalizeDouble((MarketInfo(Symbol(),MODE_ASK)+(Tp*Point)),Digits);}else{tp=0;}
     for(int i=0;i<5;i++) 
      {
       RefreshRates();// îáíîâèì öåíó
        ticket = OrderSend(Symbol(), OP_BUY,lots ,prise, slip,sl,tp,NULL,magic,0, Blue);
         if (ticket < 0)
          {
           if(UseSound){PlaySound("timeout.wav");}
            Print("Öåíà ñëèøêîì áëèçêî!",prise,"  ",sl,"  ",tp,"  Íå ìîãó ïîñòàâèòü îðäåð BUY!");
             }
              else
               {
                break;
                 }
                  }
                   }
  if(tip==true)
   {
    prise = NormalizeDouble(MarketInfo(Symbol(),MODE_BID),Digits);
    if(Sl!=0){sl = NormalizeDouble((MarketInfo(Symbol(),MODE_ASK)+(Sl*Point)),Digits);}else{sl=0;}
    if(Tp!=0){tp = NormalizeDouble((MarketInfo(Symbol(),MODE_BID)-(Tp*Point)),Digits);}else{tp=0;}    
    for( i=0;i<5;i++) 
     {
      RefreshRates();// îáíîâèì öåíó
       ticket = OrderSend(Symbol(), OP_SELL, lots ,prise, slip,sl,tp,NULL,magic,0, Red);
        if (ticket < 0)
         {
          if(UseSound){PlaySound("timeout.wav");}
           Print("Öåíà ñëèøêîì áëèçêî!",prise,"  ",sl,"  ",tp,"  Íå ìîãó ïîñòàâèòü îðäåð SELL!");
            }
             else
              {
               break;
                }
                 }
                  }

return(ticket); 
 } 
//-------------------------------------------------------------------+
int del(int ticket)
   {
    int err;
        GetLastError();//îáíóëÿåì îøèêó
        OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES);
        string symbol = OrderSymbol();
        
        if(OrderType()==OP_BUY)
         {
          RefreshRates();
           double prise = MarketInfo(symbol,MODE_BID);
            OrderClose(ticket,OrderLots(),prise,3,Green);
             err = GetLastError();
             }
        if(OrderType()==OP_SELL)
         {
          RefreshRates();
           prise = MarketInfo(symbol,MODE_ASK);
            OrderClose(ticket,OrderLots(),prise,3,Green);
             err = GetLastError();
             }
        if (err == 0&&UseSound){PlaySound("expert.wav");} if (err != 0) {PlaySound("timeout.wav");Print(err);} 
        while (!IsTradeAllowed()){ Sleep(5000);}// åñëè ðûíîê çàíÿò òî ïîäîæäåì 5 ñåê 
    return(err);     
    }            
//-------------------------------------------------------------------+
// ôóíêöèÿ ïåðåâîäèò ÑË â áó èëè íà íóæíûé óðîâåíü                   +
//+------------------------------------------------------------------+
 int Bu(int ti=0)
 {
  int err;double sl;
  if(ti==0){return(-1);}
  if(OrderSelect(ti,SELECT_BY_TICKET,MODE_TRADES)&&(OrderCloseTime()==0)){
    if(bu==0){sl=OrderOpenPrice();}else{
      if(OrderType()==OP_BUY) {sl=NormalizeDouble((OrderOpenPrice()+bu*Point),Digits);}
       if(OrderType()==OP_SELL){sl=NormalizeDouble((OrderOpenPrice()-bu*Point),Digits);}} 
    if(OrderType()==OP_BUY){
     if(sl<MarketInfo(OrderSymbol(),MODE_BID)-(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){ 
      err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}} 
    if(OrderType()==OP_SELL){
     if(sl>MarketInfo(OrderSymbol(),MODE_ASK)+(MarketInfo(OrderSymbol(),MODE_STOPLEVEL)*Point)&&sl!=OrderStopLoss()){ 
      err = OrderModify(ti,OrderOpenPrice(),sl,OrderTakeProfit(),0,White);}}}      
 return(err);
 }
//+----------------------------------------------------------------------------+
//|  Àâòîð    : Êèì Èãîðü Â. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Âåðñèÿ   : 19.02.2008                                                     |
//|  Îïèñàíèå : Âîçâðàùàåò âðåìÿ îòêðûòèÿ ïîñëåäíåé îòêðûòîé ïîçèöèé.          |
//+----------------------------------------------------------------------------+
//|  Ïàðàìåòðû:                                                                |
//|    sy - íàèìåíîâàíèå èíñòðóìåíòà   (""   - ëþáîé ñèìâîë,                   |
//|                                     NULL - òåêóùèé ñèìâîë)                 |
//|    op - îïåðàöèÿ                   (-1   - ëþáàÿ ïîçèöèÿ)                  |
//|    mn - MagicNumber                (-1   - ëþáîé ìàãèê)                    |
//+----------------------------------------------------------------------------+
datetime TimeOpenLastPos(string sy="", int op=-1, int mn=-1) {
  datetime t;
  int      i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==sy || sy=="") {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op) {
            if (mn<0 || OrderMagicNumber()==mn) {
              if (t<OrderOpenTime()) t=OrderOpenTime();
            }
          }
        }
      }
    }
  }
//--------------------âû÷èñëÿåì ðàçíîñòü âðåìåíè-------------------------------
  int TimeShift = (TimeCurrent()-t)/60;
  
  
  
  return(TimeShift);
}     
  





        



Sample





Analysis



Market Information Used:

Series array that contains open time of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

MACD Histogram
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:

It plays sound alerts

BackTest : EURUSD on H1

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

BackTest : EURUSD on H1

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

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:1.75 Total Net Profit:82.40

BackTest : USDCAD on H1

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

BackTest : USDCHF on H1

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

BackTest : USDJPY on H1

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

Request Backtest for Momo_Trades_V3


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

Pair: Period: