Moving average EA

Back to topics list To post a new topic, please log in or register
avatar
4
TAL11983 2015.10.19 07:45
 

Hello

I don't know why but this EA that come with the MT4 doesn't open me trades-but when I do bactesting it shows that it works perfect-what could be the reason it doesn't working alive? Here all the messages I get when I put it on the graph

2015.10.19 08:33:49.535 Moving Average EURUSD,M1: initialized

2015.10.19 08:33:49.528 Moving Average EURUSD,M1 inputs: Lots=0.1; MaximumRisk=0.02; DecreaseFactor=3.0; MovingPeriod=12; MovingShift=6; 

2015.10.19 08:33:46.522 Expert Moving Average EURUSD,M1: loaded successfully

2015.10.19 08:33:43.603 Expert Moving Average EURUSD,M1: removed

2015.10.19 08:33:43.600 Moving Average EURUSD,M1: uninit reason 1


avatar
12985
WHRoeder 2015.10.19 13:20 #
 
  1. There are no mind readers here, we can't see your code.
  2. Verify you have a smile face when live.
avatar
4
TAL11983 2015.10.24 02:00 #
 

Sorry

Here is the code:

 


//|                                               Moving Average.mq4 |

//|                   Copyright 2005-2014, MetaQuotes Software Corp. |

//|                                              https://www.mql4.com |

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

#property copyright   "2005-2014, MetaQuotes Software Corp."

#property link        "https://www.mql4.com"

#property description "Moving Average sample expert advisor"


#define MAGICMA  20131111

//--- Inputs

input double Lots          =0.1;

input double MaximumRisk   =0.02;

input double DecreaseFactor=3;

input int    MovingPeriod  =12;

input int    MovingShift   =6;

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

//| Calculate open positions                                         |

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

int CalculateCurrentOrders(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()==MAGICMA)

        {

         if(OrderType()==OP_BUY)  buys++;

         if(OrderType()==OP_SELL) sells++;

        }

     }

//--- return orders volume

   if(buys>0) return(buys);

   else       return(-sells);

  }

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

//| Calculate optimal lot size                                       |

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

double LotsOptimized()

  {

   double lot=Lots;

   int    orders=HistoryTotal();     // history orders total

   int    losses=0;                  // number of losses orders without a break

//--- select lot size

   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//--- calcuulate number of losses orders without a break

   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,1);

     }

//--- return lot size

   if(lot<0.1) lot=0.1;

   return(lot);

  }

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

//| Check for open order conditions                                  |

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

void CheckForOpen()

  {

   double ma;

   int    res;

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average 

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//--- sell conditions

   if(Open[1]>ma && Close[1]<ma)

     {

      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);

      return;

     }

//--- buy conditions

   if(Open[1]<ma && Close[1]>ma)

     {

      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);

      return;

     }

//---

  }

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

//| Check for close order conditions                                 |

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

void CheckForClose()

  {

   double ma;

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average 

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//---

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

      //--- check order type 

      if(OrderType()==OP_BUY)

        {

         if(Open[1]>ma && Close[1]<ma)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

      if(OrderType()==OP_SELL)

        {

         if(Open[1]<ma && Close[1]>ma)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

     }

//---

  }

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

//| OnTick function                                                  |

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

void OnTick()

  {

//--- check for history and trading

   if(Bars<100 || IsTradeAllowed()==false)

      return;

//--- calculate open orders by current symbol

   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();

   else                                    CheckForClose();

//---

  }

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

2. Yes I have smile face when live

P.S: It did open me 2 trades but that's not what the backtest shows 


avatar
2017
gooly 2015.10.24 09:28 #
 

PLEASE use the SCR-Button for code!


avatar
4
TAL11983 2015.10.24 12:07 #
 
//|                                               Moving Average.mq4 |

//|                   Copyright 2005-2014, MetaQuotes Software Corp. |

//|                                              https://www.mql4.com |

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

#property copyright   "2005-2014, MetaQuotes Software Corp."

#property link        "https://www.mql4.com"

#property description "Moving Average sample expert advisor"



#define MAGICMA  20131111

//--- Inputs

input double Lots          =0.1;

input double MaximumRisk   =0.02;

input double DecreaseFactor=3;

input int    MovingPeriod  =12;

input int    MovingShift   =6;

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

//| Calculate open positions                                         |

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

int CalculateCurrentOrders(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()==MAGICMA)

        {

         if(OrderType()==OP_BUY)  buys++;

         if(OrderType()==OP_SELL) sells++;

        }

     }

//--- return orders volume

   if(buys>0) return(buys);

   else       return(-sells);

  }

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

//| Calculate optimal lot size                                       |

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

double LotsOptimized()

  {

   double lot=Lots;

   int    orders=HistoryTotal();     // history orders total

   int    losses=0;                  // number of losses orders without a break

//--- select lot size

   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);

//--- calcuulate number of losses orders without a break

   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,1);

     }

//--- return lot size

   if(lot<0.1) lot=0.1;

   return(lot);

  }

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

//| Check for open order conditions                                  |

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

void CheckForOpen()

  {

   double ma;

   int    res;

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average 

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//--- sell conditions

   if(Open[1]>ma && Close[1]<ma)

     {

      res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);

      return;

     }

//--- buy conditions

   if(Open[1]<ma && Close[1]>ma)

     {

      res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,0,0,"",MAGICMA,0,Blue);

      return;

     }

//---

  }

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

//| Check for close order conditions                                 |

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

void CheckForClose()

  {

   double ma;

//--- go trading only for first tiks of new bar

   if(Volume[0]>1) return;

//--- get Moving Average 

   ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

//---

   for(int i=0;i<OrdersTotal();i++)

     {

      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;

      if(OrderMagicNumber()!=MAGICMA || OrderSymbol()!=Symbol()) continue;

      //--- check order type 

      if(OrderType()==OP_BUY)

        {

         if(Open[1]>ma && Close[1]<ma)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

      if(OrderType()==OP_SELL)

        {

         if(Open[1]<ma && Close[1]>ma)

           {

            if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,White))

               Print("OrderClose error ",GetLastError());

           }

         break;

        }

     }

//---

  }

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

//| OnTick function                                                  |

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

void OnTick()

  {

//--- check for history and trading

   if(Bars<100 || IsTradeAllowed()==false)

      return;

//--- calculate open orders by current symbol

   if(CalculateCurrentOrders(Symbol())==0) CheckForOpen();

   else                                    CheckForClose();

//---

  }

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

avatar
2017
gooly 2015.10.24 14:33 #
 
May be Lots=0.1; MaximumRisk=0.02 and the money on the account doesn't allow to open any trade?
avatar
12985
WHRoeder 2015.10.24 15:06 #
 
  1. You should have edited your post.
    Don't paste code
    Play video
    Please edit your post.
    For large amounts of code, attach it.

  2. lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
    if(lot<0.1) lot=0.1;

  3.    if(Volume[0]>1) return;
    
  4. Bars is unreliable (a refresh/reconnect can change number of bars on chart) volume is unreliable (miss ticks) Always use time. New candle - MQL4 forum
  5.       res=OrderSend(Symbol(),OP_SELL,LotsOptimized(),Bid,3,0,0,"",MAGICMA,0,Red);
          return;
    Check your return codes (OrderSend) and find out why. What are Function return values ? How do I use them ? - MQL4 forum and Common Errors in MQL4 Programs and How to Avoid Them - MQL4 Articles
  6. Don't assume a 4 digit broker. 3 is a 0.3 pip slippage on 5 digit broker.
    #define  POINT          int         ///< `CHANGE / _Point`.
    #define  PIP            double      ///< `POINT / PipsPerPOINT`.
    CHANGE   points_to_change(POINT n){          return n * _Point;                }
    POINT    change_to_points(CHANGE c){         return POINT(c / _Point + 0.5);   }
    CHANGE   pips_to_change(PIP n){     return points_to_change(pips_to_points(n));}
    PIP      change_to_pips(CHANGE c){  return points_to_pips(change_to_points(c));}
    // Digits DE30=1/JPY=3/EURUSD=5 10 pt/PIP.  forum.mql4.com/43064#515262
    // tick 0.5       tick = point = 0.001
    POINT    pips_to_points(PIP n){              if( (_Digits&1) == 1)   n *= 10.0;
                                                 return POINT(n);                  }
    

  7.    if(Volume[0]>1) return;
    Bars is unreliable (a refresh/reconnect can change number of bars on chart) volume is unreliable (miss ticks) Always use time. New candle - MQL4 forum
avatar
4
TAL11983 2015.10.24 16:37 #
 
WHRoeder:
  1. You should have edited your post.

    Play video
    Please edit your post.
    For large amounts of code, attach it.


  2. Bars is unreliable (a refresh/reconnect can change number of bars on chart) volume is unreliable (miss ticks) Always use time. New candle - MQL4 forum
  3. Check your return codes (OrderSend) and find out why. What are Function return values ? How do I use them ? - MQL4 forum and Common Errors in MQL4 Programs and How to Avoid Them - MQL4 Articles
  4. Don't assume a 4 digit broker. 3 is a 0.3 pip slippage on 5 digit broker.
  5. Bars is unreliable (a refresh/reconnect can change number of bars on chart) volume is unreliable (miss ticks) Always use time. New candle - MQL4 forum
Wow thanks
Back to topics list  

To add comments, please log in or register