English

## moving average no repaint

 86 fly7680 2016.06.17 21:58   Hello everyone, it is possible to obtain the moving average no repaint? By working with well-known moving average that in the historical shifts and is no longer true as I could solve?```//+------------------------------------------------------------------+ //|                                               Moving Average.mq4 | //|                   Copyright 2005-2014, MetaQuotes Software Corp. | //|                                              http://www.mql4.com | //+------------------------------------------------------------------+ #property copyright   "2005-2014, MetaQuotes Software Corp." #property link        "http://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;i0) 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_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;ima && 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(); //---   } //+------------------------------------------------------------------+```
 1236 FMIC 2016.06.18 02:37 #   A moving average does NOT REPAINT. You are just using it incorrectly. In fact, many indicators do not repaint, however, you should not be using the current bar for calculating the indicator (unless you know exactly what you are doing), because obviously the current bar is still in flux and its High, Low and Close values are still not totally defined, especially not its Close value (which is what you are using, namely "PRICE_CLOSE").You should only consider the previously closed bar because it will no longer change. So use a shift of [1] instead of [0] and adjust your Open/Close filter to be for bar [2] instead of [1].```//--- get Moving Average ma = iMA( NULL, PERIOD_CURRENT, MovingPeriod, MovingShift, MODE_SMA, PRICE_CLOSE, 1 ); //--- sell conditions    if( ( Open[ 2 ] > ma ) && ( Close[ 2 ] < ma ) ) { ... } //--- buy conditions    if( ( Open[ 2 ] < ma ) && ( Close[ 2 ] > ma ) ) { ... } ```An added advantage, is that since you are only considering the previous bar, you no longer need to check it on every tick. You only need to detect when a new bar is formed and only carry out your verification then, making your EA much faster during back-tests.With regard to your strategy of only using one move average, please be aware that you will still suffer many a situation of "whipsaw" that will drain your balance away. So add extra filters, such as for detecting the slope or deviation of the moving average, in order to minimise the impact.