[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 247

 
SIM. As matrizes intermediárias devem ser as mesmas que as matrizes principais. As opções parecem ter sido sugeridas.
 
Swan >> :

mas é aconselhável verificar)

A discrepância se deve ao uso de matrizes sem um turno.


Muito obrigado. Eu descobri o truque através de seu link. Advertência. Cavalheiros, a situação era que eu usava BUFFERS sob iMAONArray(). E os amortecedores foram inicializados no init(). Quando eu fiz um teste visual, o tamanho inicial das barras era pequeno. E todas as matrizes são inicializadas com tamanho pequeno!!! Aumentei o tamanho da inicialização para um mínimo de 6000 elementos. E foi só isso! Os testes visuais da EA confirmaram que o cálculo dos indicadores estava correto. Ha, isso é um acordo. Agora resta testar o atraso na barra. Pergunto-me se os valores dos indicadores serão diferentes. Mas veremos na segunda-feira. Se alguém tiver alguma sugestão para economizar tempo de operação e não para tornar as matrizes tão grandes, mas para que o cálculo seja inferior a seis meses - sinta-se à vontade para expressar qualquer idéia, pois quem não faz nada não comete erros.

Por favor, acrescente meu caso a algumas perguntas freqüentes.


Finalmente está funcionando!

Nova versão da função:

//-----------------------------------------------------------------------------
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);                                      
}
Muito obrigado por seu apoio. Você pode usar o indicador da maneira que quiser. É um pouco lento, no entanto. :)))
 

Parece estar funcionando

//--------------------------------------------------------------------
// 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);                          
}
 
Veja só, não comprimiu a imagem do jpg. A png é muito mais leve, porém.
 
Vinin >> :

>> Parece estar funcionando.


Sua versão é mais rápida do que a minha nova versão. Na EA voa assim! :))) Mas não entendo, se após o teste visual for atirado novamente no gráfico, as linhas não são desenhadas. Você pode sugerir qual poderia ser o problema?
 
IlyaA писал(а) >>

Sua versão é mais rápida do que a minha nova versão. Na EA voa assim! :))) Mas não entendo, se for atirado novamente na tabela após testes visuais, as linhas não são desenhadas. Você pode sugerir qual pode ser o problema?

Eu já corrigi isso. O cargo acima foi alterado.

 
Vinin >> :

Eu já corrigi isso. >> o cargo acima foi alterado.


Por favor, poste novamente, algo não está me renderizando novamente.
 
IlyaA писал(а) >>

Por favor, poste-o novamente, algo não está me renderizando novamente.
Arquivos anexados:
tsi.mq4  4 kb
 
Vinin >> :


Há um truque, quando você simplesmente o retira em um gráfico, ele não desenha, mas recompilá-lo ajuda a aprender os números, ou seja, começamos a vê-lo.
 
IlyaA писал(а) >>

Há um truque, quando você apenas puxa em um gráfico ele não desenha, mas recompilá-lo ajuda a aprender os números, ou seja, nós começamos a vê-lo.

Darei outra olhada amanhã. Hoje já é tarde. >> e eu estou cansado.