Zero-Lag Moving Average

Опубликовано в AmiBroker

Все сглаживающие фильтры и все скользящие средние имеют запаздывание. Это отставание обусловлено использованием в расчете не только данные текущей (последней) свечи, но и данные предыдущих (более старых) свечей. Однако можно попытаться уменьшить величину этого отставания из экспоненциальной скользящей средней (EMA). Совсем убирать задержку нельзя, поскольку в этом случае скользящая средняя будет в точности повторять линию цены, по которой она строится. Здесь нужно искать приемлемый компромисс. Предпримем попытку удалить запаздывание индикатора, а уже после чего попробуем использовать фильтрацию.

 

Модифицируем экспоненциальную скользящую среднюю. Значение рассчитаем путём суммирования текущего значение EMA, умноженного на α и значения EMA, рассчитанной для предыдущей свечи, умноженной на 1 - α

xEMA = α * Price + (1 - α) * EMA[1];

Вот этот коэффициент α (альфа) и есть фактор сглаживания. Он всегда больше 0 и меньше 1.

// Zero-Lag Indicator for AmiBroker
Length = Param("Length", 32, 0, 100 );
GainLimit = Param("Gain limit", 22, 1, 100 );
Threshold = Param("Threshold", 0.75, 0.1, 10, 0.01 );
alpha = 2 / ( Length + 1 );
iEMA = AMA( Close, alpha );
EC = Close[ 0 ];
for( bar = 0; bar < BarCount; bar++ )
{  EC1 = EC;
   LeastError = 1e9;
   BestEC = 0;
   for( gain = -0.1 * GainLimit; gain < 0.1 * GainLimit; gain += 0.1 )
   {  EC = alpha * ( iEMA[ bar ] + gain * ( Close[ bar ] - EC1 ) ) + ( 1 - alpha ) * EC1;
      Erro = abs( Close[ bar ] - EC );
      if( Erro < LeastError )
      {   LeastError = Erro;
          BestEC = EC;
      }
   }
   iEC[ bar ] = BestEC;
   iLeastError[ bar ] = LeastError;
}
Plot( iEMA, "EMA", colorRed );
Plot( iEC, "EC" + _PARAM_VALUES(), colorYellow, styleThick );
Plot( C, "Close", ParamColor("Color", colorGreen ), ParamStyle("Style") | GetPriceStyle() );
// strategy rules
Buy = Cross( iEC, iEMA ) AND 100 * iLeastError / Close > Threshold;
Short = Cross( iEMA, iEC ) AND 100 * iLeastError / Close > Threshold;
Sell = Short;
Cover = Buy;
// trade on next bar open
SetTradeDelays( 1, 1, 1, 1 );
BuyPrice = SellPrice = CoverPrice = ShortPrice = Open;


См. также Zero-Lag MACD

Добавить комментарий


Защитный код
Обновить