Q : Может ли кто-нибудь помочь мне пролить свет на это?
Тройная экспонента Скользящее среднее было создано Патриком Маллой и впервые опубликовано в февральском выпуске журнала "Технический анализ акций и товаров" за февраль 1994 года - Сглаживание данных с меньшими задержками.
Вы не будете " limit"глубина TEMA
- triple-" self "-convolution за счет уменьшения глубины окна ввода данных, поскольку это приводит к обработке поврежденных значений, вы, скорее, должны сказать CustomIndicator
-код, сколько времени требуется, чтобы «стабилизировать» значения TEMA на дальнем левом краю, прежде чем его вычисленные значения на левом краю начинают иметь некоторый смысл:
SetIndexDrawBegin
Устанавливает номер бара (с начала данных), с которого должен начаться отрисовка данной линии индикатора.
void SetIndexDrawBegin(
int index, // line index
int begin // position
);
Параметры:
index [in] Line index. Must lie between 0 and 7.
begin [in] First drawing bar position number.
Возвращаемое значение: Нет ne.
Примечание:
Индикаторы отображаются слева направо. Значения массива индикаторов, которые находятся слева от данного бара, не будут показаны на графике или в окне данных. По умолчанию будет установлено значение 0, и все данные будут отрисованы.
Ваш измененный код TEMA просто игнорирует все свечи ( Bars - BarsBack )
и запускает вычисления в зеленом поле, но для BarsBack
(который генерирует все артефакты тройной самосвертки, которые происходят "рядом" с текущей полосой горячего конца [0]).
Удалите эту часть кода и проверьте все свои IndicatorBuffer{ 0 | 1 | 2 | 3 }
-линии на в дальнем левом крае, как быстро они «консолидируют» свои значения и только после этой визуальной проверки задайте:
SetIndexDrawBegin( { 0 | 1 | ... | 3 }, <_N_bars_To_Converge_STABLE_> );
Или можете оставить на месте код для предотвращения вычислений,
, но нужно увеличить BarsBack >> <_N_bars_To_Converge_STABLE_>
Эффективность кода с помощью итеративных вычислений может быть улучшена:
В то время как MQL4 (по состоянию на 2020-Q1) не имеет поддержки для векторизованной математики здесь есть место для улучшения производительности:
/*
for ( i = limit; i >= 0; i-- ) Ema[i] = iMA( NULL, 0, EMA_period, 0, MODE_EMA, PRICE_CLOSE, i );
for ( i = limit2; i >= 0; i-- ) EmaOfEma[i] = iMAOnArray( Ema, 0, EMA_period, 0, MODE_EMA, i );
for ( i = limit3; i >= 0; i-- ) EmaOfEmaOfEma[i] = iMAOnArray( EmaOfEma, 0, EMA_period, 0, MODE_EMA, i );
for ( i = limit3; i >= 0; i-- ) TemaBuffer[i] = EmaOfEmaOfEma[i]
+ 3*Ema[i]
- 3*EmaOfEma[i];
*/
////////////////////////////////////////////////////////////////////
// 25% MORE EFFICIENT PROCESSING:
// PROGRESSIVE BUILDUP, AVOIDS DOUBLE limit3-DEEP RE-ITERATIONS:
////////////////////////////////////////////////////////////////////
for ( i = limit; i >= 0; i-- ) { Ema[i] = iMA( NULL, 0, EMA_period, 0, MODE_EMA, PRICE_CLOSE, i ); TemaBuffer[i] = Ema[i]; }
for ( i = limit2; i >= 0; i-- ) { EmaOfEma[i] = iMAOnArray( Ema, 0, EMA_period, 0, MODE_EMA, i ); TemaBuffer[i] -= EmaOfEma[i]; TemaBuffer[i] *= 3; }
for ( i = limit3; i >= 0; i-- ) { EmaOfEmaOfEma[i] = iMAOnArray( EmaOfEma, 0, EMA_period, 0, MODE_EMA, i ); TemaBuffer[i] += EmaOfEmaOfEma[i]; }
И последнее, но не менее важное: еще более эффективные вычислительные TEMA
вычислительные стратегии существуют здесь для дальнейшего снижения задержки на наносекунды: о)