[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 247

 
ДА. Промежуточные массивы надо делать такими же как и основные. Варианты вроде подсказали.
 
Swan >>:

не может. но желательно проверять)

расхождение получается из-за использования массивов без сдвига.


Большое тебе спасибо. Я через твою ссылку понял в чем фокус. Внимание! Господа ситуация заключалась в том, что  я использовал БУФЕРЫ под iMAONArray(). А инициализация буферов осуществлялась в init(). Когда я прогонял визуальное тестирование, первоначальный размер Bars был маленький. И все массивы инициализируются маленьким размером !!! Я увеличил размер инициализации до 6000 элементов минимум. И все! Визуальное тестирование советника подтвердило корректность расчета индикаторов. Ха, делов-то. Теперь остается проверить на задержке баров. Интересно будут ли отличаться значения индикаторов? Но это мы увидим в понедельник. Если кто может предложить как съэкономить оперативу и не делать массивы такими большими, но так, чтобы расчет длился короче чем полгода - смело высказывайте любые идеи, т.к. не ошибается тот, кто ничего не делает.

Добавьте, пожалуйста, мой случай в какой-нибудь FAQ.


Наконец-то заработало!

Новый вариант функции:

//-----------------------------------------------------------------------------
int init()                         
{
    SetIndexBuffer(0, tsi);                                 // Назначение массива буферу
    SetIndexBuffer(1, ergodic);                             // Назначение массива буферу
    SetIndexBuffer(2, cross);                               // Назначение массива буферу
    
    SetIndexStyle (0, DRAW_LINE,        STYLE_SOLID, 1);    // Стиль линии DRAW_HISTOGRAM STYLE_SOLID
    SetIndexStyle (1, DRAW_LINE,        STYLE_SOLID, 1);    // Стиль линии        
    SetIndexStyle (2, DRAW_ARROW,       STYLE_SOLID, 0);    // Стиль линии
    SetIndexArrow (2, 161);
    
    SetIndexLabel(0, "TSI");
    SetIndexLabel(1, "Ergodic");
    SetIndexLabel(2, "Cross");
    IndicatorShortName("TSI("+LengthMtm+","+LengthSmooth+","+LengthErgodic+")");    
    
    int BigBars                     = MathMax(Bars, 6000);
    
    ArrayResize(        mtm,        BigBars);
    ArrayResize(        base,       BigBars);
    ArrayResize(        mtmMA,      BigBars);
    ArrayResize(        mtmS,       BigBars);

    ArraySetAsSeries(   mtm,        true);
    ArraySetAsSeries(   base,       true);
    ArraySetAsSeries(   mtmMA,      true); 
    ArraySetAsSeries(   mtmS,       true);


    return(0);                                      
}
Большое спасибо за поддержку. Индикатор пользуйте кто, как хочет. Правда он тормозной чуть-чуть. :)))
 

Вроде работает

//--------------------------------------------------------------------
// TSI.mq4 
// Предназначен для использования в качестве трендового индикатора
//--------------------------------------------------------------------

#property indicator_separate_window         // indicator_chart_window, indicator_separate_window
#property indicator_buffers     3           // Количество буферов
#property indicator_color1      Red         // Цвет первой линии Red Blue Lime 
#property indicator_color2      Blue        // Цвет второй линии
#property indicator_color3      Yellow
#property indicator_level1      -20
#property indicator_level2       20
//#property indicator_minimum   -100
//#property indicator_maximum    100

extern int LengthMtm            = 21;
extern int LengthSmooth         = 5;
extern int LengthErgodic        = 5;
extern int HistoryLimit         = 2000;

double tsi[], ergodic[], cross[];           // Объявление массивов (под буферы индикатора)
double mtm[], base[], mtmMA[], mtmS[];


//-----------------------------------------------------------------------------
int MathSgn(double Value = 0.0)
{
    if (Value < 0) return(-1); else return( 1);
}

//-----------------------------------------------------------------------------
int init()                         
{
    IndicatorBuffers(7);
    SetIndexBuffer(0, tsi);                                 // Назначение массива буферу
    SetIndexBuffer(1, ergodic);                             // Назначение массива буферу
    SetIndexBuffer(2, cross);                               // Назначение массива буферу
    
    SetIndexBuffer(3, mtm);
    SetIndexBuffer(4, base);
    SetIndexBuffer(5, mtmMA);
    SetIndexBuffer(6, mtmS);
        
    SetIndexStyle (0, DRAW_LINE,        STYLE_SOLID, 1);    // Стиль линии DRAW_HISTOGRAM STYLE_SOLID
    SetIndexStyle (1, DRAW_LINE,        STYLE_SOLID, 1);    // Стиль линии        
    SetIndexStyle (2, DRAW_ARROW,       STYLE_SOLID, 0);    // Стиль линии
    SetIndexArrow (2, 161);
    
    SetIndexLabel(0, "TSI");
    SetIndexLabel(1, "Ergodic");
    SetIndexLabel(2, "Cross");


    IndicatorShortName("TSI("+LengthMtm+","+LengthSmooth+","+LengthErgodic+")");    
    
    return(0);                                      
}

//-----------------------------------------------------------------------------
int start()                         
{    
    if (HistoryLimit == 0) HistoryLimit = Bars;
    
    int Counted_bars            = IndicatorCounted();
    int i, limit                = MathMin(Bars - Counted_bars - 1, HistoryLimit); 
    double tmp;
    for (i=limit;i>=0;i--) {
        mtm[i]                  = Close[i] - Close[i+1];
        base[i]                 = High[i]  - Low[i];
   }
    for (i=limit;i>=0;i--) {
        mtmMA[i]                = iMAOnArray(mtm,   0, LengthMtm,     0, MODE_EMA, i) * 100;
        tmp                     = iMAOnArray(base,  0, LengthMtm,     0, MODE_EMA, i);
        mtmS[i]=0;
        if (tmp>0)  mtmMA[i]   /= tmp;
        mtmS[i]                 = iMAOnArray(mtmMA, 0, LengthSmooth,  0, MODE_EMA, i);
        tsi[i]                  = mtmS[i];
   }
   for (i=limit;i>=0;i--) {
        ergodic[i]              = iMAOnArray(mtmS,  0, LengthErgodic, 0, MODE_EMA, i); 
        
         cross[i]           = EMPTY_VALUE;
        if ( MathSgn(tsi[i+1] - ergodic[i+1]) != MathSgn(tsi[i] - ergodic[i]) )       
            cross[i]           = ergodic[i];


        
    }
    
    return(0);                          
}
 
Зацените, а jpg картинку он не стал сжимать. Так ведь png куда меньше весит.
 
Vinin >>:

Вроде работает


Твой вариант быстрее, чем новый мой. В советнике так вообще летает! :))) Но я не пойму, если его после визуального тестирования еще раз бросить на график, то линии не отрисовываются. Можешь предположить в чем может быть дело?
 
IlyaA писал(а) >>

Твой вариант быстрее, чем новый мой. В советнике так вообще летает! :))) Но я не пойму, если его после визуального тестирования еще раз бросить на график, то линии не отрисовываются. Можешь предположить в чем может быть дело?

Я исправил уже. Пост выше изменен

 
Vinin >>:

Я исправил уже. Пост выше изменен


Перевыложи, пожалуйста, что-то у меня снова не отрисовывает.
 
IlyaA писал(а) >>

Перевыложи, пожалуйста, что-то у меня снова не отрисовывает.
Файлы:
tsi.mq4  4 kb
 
Vinin >>:


Есть фокус, когда его просто вытащиш на график он не рисует, а перекомпиляция помогает ему познать цифры, т.е. мы его таки начинаем видеть.
 
IlyaA писал(а) >>

Есть фокус, когда его просто вытащиш на график он не рисует, а перекомпиляция помогает ему познать цифры, т.е. мы его таки начинаем видеть.

Завтра еще посмотрю. Сегодня поздно уже. Да и устал

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