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

 
Vinin >> :

Ogni caso ha la sua soluzione


Lasciate che vi dia il codice del programma per una critica costruttiva del pubblico (per favore, astenetevi dalla critica costruttiva dell'indicatore stesso). Ma prima una descrizione. Questo è lo STI (vero indice di forza). Si basa sul Momentum a 1 giorno. Questi incrementi sono smussati dalla media corrispondente (21 periodi). Ora aggiungiamo un ridimensionamento. Per fare questo, prendete la differenza di alto - basso e lisciateli con la stessa media esponenziale (21 periodi). Dividiamo il momento liscio per lo spread liscio. Questo rapporto è smussato da una breve media esponenziale (5 periodi). Abbiamo ottenuto la linea principale. Ora appianiamo la linea principale con una copertura (EMA(, 5)) e gioiamo, avendo ottenuto una linea di segnale. Infatti, rallegriamoci ancora una volta, perché abbiamo il TSI - un tipico indicatore di tendenza. Nella mia implementazione ho 3 buffer in più per i "cerchi", che uso per segnare l'intersezione delle linee principali e del segnale. Signori, vediamo il codice:

//--------------------------------------------------------------------
// 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()                         
{
    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+")");    
    
    ArrayResize(        mtm,        Bars);
    ArrayResize(        base,       Bars);
    ArrayResize(        mtmMA,      Bars);
    ArrayResize(        mtmS,       Bars);

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


    return(0);                                      
}

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


Lasciate che vi ricordi il motivo dell'appello. Se tirate un indicatore su un grafico, saltate qualche candela e ne aggiungete un altro dello stesso tipo, voi ed io otterremo una divergenza nei valori dell'indicatore. C'è anche una divergenza molto forte quando questo indicatore viene disegnato durante il test visivo dell'EA e successivamente lo stesso indicatore viene aggiunto al grafico. Potreste aiutarmi con articoli o esperienze personali su questo tipo di errore nell'indicatore? Grazie.
 
Il pulsante Stop/Play e il cursore della velocità mancano dal tester. Cosa fare?
 
VAM_ >> :
Il pulsante Stop/Play e il cursore della velocità mancano nel tester. Cosa fare?

Sollevare il pannello di controllo del tester un po' più in alto... usando il tasto sinistro del mouse...

 
Dmido >> :

Buona giornata a tutti)


Ho un Expert Advisor. Ho un Expert Advisor, è in grado di rilevare le grandi tendenze e ha un buon margine su di esse, ma riesco a malapena a coprire lo slippage sul mercato senza pesci.

La mia domanda è: come scrivo il segnale per il ridimensionamento? L'idea è questa - aggiungo quando c'è più di uno stop sopra la prima posizione e il trend è visibile.


Sono interessato all'unità stessa che manda un segnale per fare un accordo. Sto usando il codice copiato dal MACD Sample EA standard.

Come correggerlo per esempio per aprire una posizione lunga e poi chiudere entrambe le posizioni aperte e lunghe in una volta sola?


Ma gli accordi si moltiplicano come mosche e il risultato è un fottuto graal con mille trades aperte((((


In alternativa: monitorare visivamente le prestazioni dell'EA in tempo reale e ricaricare manualmente, questo è il granito (arte), ma non è un graal...

 
IlyaA >> :
        mtmMA[ i]                = iMAOnArray( mtm,   0, LengthMtm,     0, MODE_EMA, i) * 100;
        mtmMA[ i]               /= iMAOnArray( base,  0, LengthMtm,     0, MODE_EMA, i);

mtmMA - ci dovrebbero essere due array diversi. quando lo si divide, è auspicabile controllare la disuguaglianza a zero.


Per i calcoli intermedi è più conveniente usare un buffer.

Se 8 non è sufficiente, una delle soluzioni è qui.

 
Swan >> :

mtmMA - ci dovrebbero essere due array diversi. quando lo si divide, è auspicabile controllare la disuguaglianza a zero.


Per i calcoli intermedi è più conveniente usare un buffer.

Se 8 pezzi non sono sufficienti, una delle soluzioni è qui.






Grazie per il tuo commento. Notate che stiamo parlando della media della differenza alto - basso. È sempre positivo. E la media rafforza questa tendenza. Volevo controllare, ma poi penso che vedrò nel registro se c'è qualcosa. Pensate che un errore di divisione per zero possa causare una divergenza di grafici aggiunti a intervalli diversi.
 
IlyaA >> :


Grazie per il commento. Notate che stiamo parlando della media della differenza alto - basso. È sempre positivo. E la media rafforza questa tendenza. Volevo controllare, ma poi penso che vedrò nel registro se c'è qualcosa. Pensate che un errore di divisione per zero possa causare una divergenza di grafici aggiunti a intervalli diversi.

ma è consigliabile controllare)

la discrepanza è dovuta all'uso degli array senza spostamenti.

 
IlyaA писал(а) >>

Lasciatemi dare il codice del programma per una critica costruttiva da parte del pubblico (per favore astenetevi da critiche costruttive all'indicatore stesso). Ma prima una descrizione. Questo è lo STI (vero indice di forza). Si basa sul Momentum a 1 giorno. Questi incrementi sono smussati dalla media corrispondente (21 periodi). Ora aggiungiamo un ridimensionamento. Per fare questo, prendete la differenza di alto - basso e lisciateli con la stessa media esponenziale (21 periodi). Dividiamo il momento liscio per lo spread liscio. Questo rapporto è smussato da una breve media esponenziale (5 periodi). Abbiamo ottenuto la linea principale. Ora appianiamo la linea principale con una copertura (EMA(, 5)) e gioiamo, avendo ottenuto una linea di segnale. Infatti, rallegriamoci ancora una volta, perché abbiamo il TSI - un tipico indicatore di tendenza. Nella mia implementazione ho 3 buffer in più per i "cerchi", che uso per segnare l'intersezione delle linee principali e del segnale. Signori, per favore mandatemi il codice:

Lasciate che vi ricordi il motivo dell'indirizzo. Se si tira l'indicatore sul grafico, si saltano alcune candele e se ne aggiunge un altro simile, si otterrà una divergenza nei valori dell'indicatore. C'è anche una divergenza molto forte quando questo indicatore viene disegnato durante il test visivo dell'EA e successivamente lo stesso indicatore viene aggiunto al grafico. Potreste aiutarmi con articoli o esperienze personali su questo tipo di errore nell'indicatore? Grazie.

L'indicatore va bene. Se iMAOnArray() viene chiamata in un ciclo separato, è possibile ottenere un funzionamento corretto dell'indicatore indipendentemente dal suo tempo di impostazione.

Devi spezzare il tuo singolo loop in tre loop.

iMAOnArray() funzionerà più correttamente.

 
Swan >> :

ma è consigliabile controllare)

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

Non capisco bene cosa significhi senza uno spostamento. Puoi aggiungere parole, per favore?

 
IlyaA >> :

Non capisco bene cosa significhi senza uno spostamento. Aggiungere parole, per favore.

La matrice del buffer è spostata quando appare una nuova barra. gli indici sono incrementati di 1. normale non è.

il link qui sopra lo descrive in modo più dettagliato.

Motivazione: