[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 247

 
SÌ. Gli array intermedi dovrebbero essere gli stessi degli array principali. Le opzioni sembrano essere state suggerite.
 
Swan >> :

ma è consigliabile controllare)

La discrepanza è dovuta all'uso degli array senza spostamento.


Grazie mille. Ho scoperto il trucco attraverso il tuo link. Attenzione. Signori, la situazione era che ho usato BUFFERS sotto iMAONArray(). E i buffer sono stati inizializzati in init(). Quando ho fatto un test visivo, la dimensione iniziale delle barre era piccola. E tutti gli array sono inizializzati con dimensioni ridotte!!! Ho aumentato la dimensione dell'inizializzazione a 6000 elementi minimo. E questo era tutto! Il test visivo dell'EA ha confermato che il calcolo degli indicatori era corretto. Ha, è un affare. Ora resta da controllare il ritardo della barra. Mi chiedo se i valori degli indicatori saranno diversi. Ma vedremo lunedì. Se qualcuno ha qualche suggerimento per risparmiare tempo nelle operazioni e per non rendere gli array così grandi, ma per far sì che il calcolo sia più breve di mezzo anno - sentitevi liberi di esprimere qualsiasi idea, perché chi non fa niente non fa errori.

Si prega di aggiungere il mio caso a qualche FAQ.


Finalmente funziona!

Nuova versione della funzione:

//-----------------------------------------------------------------------------
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);                                      
}
Grazie mille per il vostro sostegno. Potete usare l'indicatore in qualsiasi modo vogliate. Però è un po' lento. :)))
 

Sembra funzionare

//--------------------------------------------------------------------
// 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);                          
}
 
Controlla, non ha compresso l'immagine jpg. Il png è molto più leggero, però.
 
Vinin >> :

>> Sembra funzionare.


La tua versione è più veloce della mia. In EA vola così! :))) Ma non capisco, se dopo il test visivo viene lanciato di nuovo sul grafico, le linee non vengono disegnate. Potete suggerire quale potrebbe essere il problema?
 
IlyaA писал(а) >>

La tua versione è più veloce della mia. In EA vola così! :))) Ma non capisco, se viene lanciato di nuovo sul grafico dopo il test visivo, le linee non vengono disegnate. Potete suggerire quale può essere il problema?

L'ho già corretto. Il post sopra è stato cambiato.

 
Vinin >> :

L'ho già corretto. >> il post sopra è stato cambiato.


Per favore ri-postate, qualcosa non sta rendendo di nuovo per me.
 
IlyaA писал(а) >>

Si prega di ri-postarlo, qualcosa non sta rendendo di nuovo per me.
File:
tsi.mq4  4 kb
 
Vinin >> :


C'è un trucco, quando lo si tira fuori su un grafico non disegna, ma la ricompilazione lo aiuta ad imparare i numeri, cioè si comincia a vederlo.
 
IlyaA писал(а) >>

C'è un trucco, quando lo si tira fuori su un grafico non disegna, ma la ricompilazione lo aiuta ad imparare i numeri, cioè si comincia a vederlo.

Domani darò un'altra occhiata. Oggi è tardi. >> e sono stanco.

Motivazione: