[¡AVISO CERRADO!] Cualquier pregunta de novato, para no saturar el foro. Profesionales, no pasen. No puedo ir a ningún sitio sin ti. - página 247

 
SÍ. Las matrices intermedias deben ser las mismas que las matrices principales. Las opciones parecen haber sido sugeridas.
 
Swan >> :

pero es aconsejable comprobarlo)

La discrepancia se debe al uso de matrices sin desplazamiento.


Muchas gracias. He descubierto el truco a través de tu enlace. Advertencia. Señores la situación fue que usé BUFFERS bajo iMAONArray(). Y los buffers fueron inicializados en init(). Cuando hice una prueba visual, el tamaño inicial de las barras era pequeño. ¡¡¡Y todas las matrices se inicializan con un tamaño pequeño !!! He aumentado el tamaño de la inicialización a 6000 elementos como mínimo. ¡Y eso fue todo! Las pruebas visuales del EA confirmaron que el cálculo de los indicadores era correcto. Ja, eso es un trato. Ahora queda por probar en el retraso de la barra. Me pregunto si los valores de los indicadores serán diferentes. Pero ya veremos el lunes. Si alguien tiene alguna sugerencia para ahorrar tiempo de operación y no hacer las matrices tan grandes, sino para que el cálculo sea más corto que medio año - no dude en expresar cualquier idea, porque el que no hace nada no se equivoca.

Por favor, añada mi caso a algunas preguntas frecuentes.


¡Por fin funciona!

Nueva versión de la función:

//-----------------------------------------------------------------------------
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);                                      
}
Muchas gracias por su apoyo. Puedes utilizar el indicador como quieras. Sin embargo, es un poco lento. :)))
 

Parece que funciona

//--------------------------------------------------------------------
// 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);                          
}
 
Compruébalo, no comprimió la imagen jpg. Sin embargo, el png es mucho más ligero.
 
Vinin >> :

>> Parece que funciona.


Tu versión es más rápida que la mía. En EA vuela así. :))) Pero no entiendo, si después de la prueba visual se lanza en el gráfico de nuevo, las líneas no se dibujan. ¿Puede sugerir cuál puede ser el problema?
 
IlyaA писал(а) >>

Tu versión es más rápida que la mía. En EA vuela así. :))) Pero no entiendo, si se lanza en el gráfico de nuevo después de la prueba visual, las líneas no se dibujan. ¿Puede sugerir cuál puede ser el problema?

Ya lo he corregido. El post anterior ha sido modificado.

 
Vinin >> :

Ya lo he corregido. >> se ha modificado el post anterior.


Por favor, vuelve a publicar, algo no me está rindiendo de nuevo.
 
IlyaA писал(а) >>

Por favor, vuelve a publicarlo, algo no me está rindiendo de nuevo.
Archivos adjuntos:
tsi.mq4  4 kb
 
Vinin >> :


Hay un truco, cuando lo sacas en un gráfico no dibuja, pero al recompilarlo le ayuda a aprender los números, es decir, sí empezamos a verlo.
 
IlyaA писал(а) >>

Hay un truco, cuando lo sacas en un gráfico no se dibuja, pero recompilarlo le ayuda a aprender los números, es decir, sí empezamos a verlo.

Mañana echaré otro vistazo. Hoy es tarde. >> Y estoy cansado.

Razón de la queja: