Zero-Lag Moving Average
Все сглаживающие фильтры и все скользящие средние имеют запаздывание. Это отставание обусловлено использованием в расчете не только данные текущей (последней) свечи, но и данные предыдущих (более старых) свечей. Однако можно попытаться уменьшить величину этого отставания из экспоненциальной скользящей средней (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