Помогите разобраться (индикаторы TRIX, TSI, CMI)

 

Написал вышеуказанные индикаторы и работает вроде всё нормально, но вот в начале графика происходит что-то непонятное - линии идут откуда-то с "потолка". Пробовал различные варианты, но исправить никак не получается - понятно только что подобное возникает, когда несколько раз применяю iMAOnArray. Для примера выкладываю код TRIX, подскажите, пожалуйста, что не так. Ранее советовали применять Сomment и т.д., но пока с этим не разобрался.

#property copyright "Copyright © 2007, Rone_IS"
#property link      "rone.sergey@gmail.com"
 
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Blue
#property indicator_color2 LimeGreen
#property indicator_width1 2
#property indicator_width2 1
 
double TrixBuf[];
double signalBuf[];
double first[];
double second[];
double third[];
 
extern int TRIX_Period=15;
extern int Signal_Period=9;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
  IndicatorBuffers(5);
  SetIndexBuffer(0,TrixBuf);
  SetIndexStyle(0,DRAW_LINE);
  SetIndexBuffer(1,signalBuf);
  SetIndexStyle(1,DRAW_LINE);  
  SetIndexBuffer(2,first);
  SetIndexBuffer(3,second);
  SetIndexBuffer(4,third);
  
  IndicatorShortName("TRIX ("+TRIX_Period+")");
  SetIndexLabel(0,"TRIX");
  SetIndexLabel(1,"Signal Line");
 
   return(0);
  }
 
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
//   int  limit,  counted_bars=IndicatorCounted();
//   if(counted_bars>0) counted_bars--;
//   limit=Bars-counted_bars;
   ArrayInitialize(0,TrixBuf);
   ArrayInitialize(1,signalBuf);
   ArrayInitialize(2,first);
   ArrayInitialize(3,second);
   ArrayInitialize(4,third);
   
//----
   for(int i=Bars-TRIX_Period-1;i>=0;i--)
      {
      first[i]=iMA(Symbol(),0,TRIX_Period,0,MODE_EMA,PRICE_CLOSE,i);
      }
   for(i=Bars-2*TRIX_Period-1;i>=0;i--)
      {
      second[i]=iMAOnArray(first,0,TRIX_Period,0,MODE_EMA,i);
      }
   for(i=Bars-3*TRIX_Period-1;i>=0;i--)
      {
      third[i]=iMAOnArray(second,0,TRIX_Period,0,MODE_EMA,i);
      TrixBuf[i]=100*((third[i]-third[i+1])/third[i]);
      }
   for(i=Bars-3*TRIX_Period-Signal_Period-1;i>=0;i--)
      signalBuf[i]=iMAOnArray(TrixBuf,0,Signal_Period,0,MODE_EMA,i);     
   
//----
   return(0);
  }
 
SetIndexDrawBegin() поможет
 

Спасибо, но я уже пробовал - не помогает.

Что ещё может быть не так? может быть, стоит вместо ArrayInitialize вернуться к counted_bars?

правда, у меня так тоже не получалось

 
Для EMA надо обрезать раз в 10-15 больше чем период EMA, четыре сглаживания подряд, вот и считайте сколько надо обрезать. 4*15*Period
 
   ArrayInitialize(0,TrixBuf);
   ArrayInitialize(1,signalBuf);
   ArrayInitialize(2,first);
   ArrayInitialize(3,second);
   ArrayInitialize(4,third);
А это вобще удалить, ктому же параметры неправильно передаются
 
А я, чтобы линия в потолок не уходила, перед тем как делать iMAOnArray,  забивал в буфер нули. Вот пример для OsMA:
if(counted_bars<1)
for(i=1; i<=(SlowMA_Period+Shift); i++) ind_buffer2[Bars-i]=0.0;
//----
for(i=0; i<=limit; i++)
ind_buffer3[i]=iMAOnArray(ind_buffer2, Bars, SignalMA_Period, SignalMA_Shift, SignalMA_Method, i);
 
Трикс считается немного по другому.
Вот алгоритм Трикса из Омеги:
{*******************************************************************
Description    : This Function returns TRIX - Triple Exponential Average        
Provided By    : Omega Research, Inc. (c) Copyright 1999
********************************************************************}
 
Inputs : Price(NumericSeries),Length(NumericSimple);
Variables : TripleXAvg(0);
 
If Length <> 0 Then Begin
    TripleXAvg = XAverage(XAverage(XAverage(Log(Price), Length) , Length) , Length);
    Trix = (TripleXAvg - TripleXAvg[1]) * 10000;
End
Else
    Trix = 0;
Текст XAverage:
{*******************************************************************
Description: Exponential Average
Provided By: Omega Research, Inc. (c) Copyright 1999
********************************************************************}
 
Inputs: Price(NumericSeries), Length(NumericSimple);
Variables: Factor(0);
 
If Length + 1 <> 0 Then Begin
    If CurrentBar <= 1 Then Begin
        Factor = 2 / (Length + 1);
        XAverage = Price;
    End
    Else  
        XAverage = Factor * Price + (1 - Factor) * XAverage[1];
End;
Экспоненциальное среднее (XAverage) тут считается правильно - никаких выбросов не дает, и ни одного бара обрезать не требуется.
Если в МТ оно дает выбросы, значит там есть глючек с расчетом - значение на первом баре нужно инициализировать входным значением.
 
Если в МТ оно дает выбросы, значит там есть глючек с расчетом - значение на первом баре нужно инициализировать входным значением.

И уже начиная со второго бара она показывает правильные значения? $-)
 
Правильнее пожалуй так сказать - начиная со второго бара это будет экспоненциальный фильтр с заданным периодом, который будет показывать правильные значения, в предположении, что все бары до первого равны значению первого.
В текущей реализации в МТ все работает правильно, но в предположении, что значения слева от первого бара равны нулю (или еще чему-то)
 

Спасибо всем за ответы.

Сделал так как посоветовал Integer - всё отображатся корректно. Но я не понимаю почему следует делать столь большое обрезание. В принципе, я считал так: допустим у нас период 15, то есть значение ЕМА мы можем просчитать начиная с 16-го бара, потом сглаживаем таким же периодом, для этого необходимо иметь просчитанных 15 значений ЕМА - итого 2*Period и т.д. Потому, когда ставил в SetIndexDrawBegin значение 3*Period + Signal_Period и ничего не получилось, подумал, что проблема не в этом.

Также попробую и вариант, предложенный Sadhu.

Что касается формулы, брал её вот с этого сайта: http://fmlabs.com/reference/default.htm Правда, там тоже не всегда всё хорошо - с тем же Stochastic Mometntum Index пришлось помучиться - оказалось что у них на сайте в формуле вместо + стоит - (проверял по книге У.Блау). Может и с TRIX похожая история

Причина обращения: