[WARNUNG GESCHLOSSEN!] Alle Fragen von Neulingen, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Ohne dich kann ich nirgendwo hingehen. - Seite 246

 
Vinin >> :

Jeder Fall hat seine eigene Lösung


Ich möchte Ihnen den Programmcode zur Verfügung stellen, damit Sie konstruktive Kritik üben können (bitte unterlassen Sie konstruktive Kritik am Indikator selbst). Doch zunächst eine Beschreibung. Dies ist der TSI (True Force Index). Er basiert auf dem 1-Tages-Momentum. Diese Inkremente werden durch den entsprechenden Durchschnitt (21 Perioden) geglättet. Fügen wir nun eine Skalierung hinzu. Dazu nimmt man die Differenz zwischen Hoch und Tief und glättet sie mit demselben exponentiellen Durchschnitt (21 Perioden). Teilen wir den glatten Impuls durch die glatte Streuung. Dieses Verhältnis wird durch einen kurzen exponentiellen Durchschnitt (5 Perioden) geglättet. Wir haben die Hauptleitung erhalten. Jetzt glätten wir die Hauptlinie mit einer Absicherung (EMA(, 5)) und freuen uns, dass wir eine Signallinie erhalten haben. In der Tat, freuen wir uns noch einmal, denn wir haben TSI - ein typischer Trendindikator. In meiner Implementierung habe ich 3 weitere Puffer für "Kreise", die ich benutze, um den Schnittpunkt der Haupt- und Signalleitungen zu markieren. Meine Herren, lassen Sie uns den Code sehen:

//--------------------------------------------------------------------
// 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);                          
}


Ich möchte Sie an den Grund für die Beschwerde erinnern. Wenn Sie einen Indikator auf ein Diagramm ziehen, ein paar Kerzen auslassen und einen anderen der gleichen Art hinzufügen, erhalten Sie und ich eine Divergenz der Indikatorwerte. Es gibt auch eine sehr starke Divergenz, wenn dieser Indikator während des visuellen Tests des EAs gezeichnet wird und später derselbe Indikator zum Diagramm hinzugefügt wird. Können Sie mir mit Artikeln oder persönlichen Erfahrungen zu dieser Art von Fehlern im Indikator helfen? Ich danke Ihnen.
 
Die Stop/Play-Taste und der Geschwindigkeitsregler fehlen auf dem Testgerät. Was ist zu tun?
 
VAM_ >> :
Die Stop/Play-Taste und der Geschwindigkeitsregler fehlen im Testgerät. Was ist zu tun?

Heben Sie das Bedienfeld des Testers ein wenig an... mit der linken Maustaste...

 
Dmido >> :

Guten Tag an alle)


Ich habe einen Expert Advisor. Ich habe einen Expert Advisor, der in der Lage ist, große Trends zu erkennen und einen guten Vorsprung zu haben, aber ich kann die Slippage auf dem fischlosen Markt kaum abdecken.

Meine Frage ist: Wie schreibe ich das Signal für die Skalierung ein? Die Idee ist folgende - ich füge hinzu, wenn es mehr als einen Stopp über der ersten Position gibt und der Trend sich zeigt.


Ich interessiere mich für die Einheit selbst, die ein Signal zum Abschluss eines Geschäfts sendet. Ich verwende den aus dem Standard-MACD Sample EA kopierten Code.

Wie kann man es korrigieren, wenn man beispielsweise eine Long-Position eröffnet und dann beide Positionen auf einmal schließt?


Aber Geschäfte vermehren sich wie die Fliegen und das Ergebnis ist ein verdammter Gral mit tausend offenen Geschäften((((


Alternativ: die Leistung des EA in Echtzeit visuell überwachen und manuell nachfüllen, das ist Granit (Kunst), aber kein Gral...

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

mtmMA - es sollte zwei verschiedene Arrays geben. Bei der Teilung ist es wünschenswert, auf Ungleichheit zu Null zu prüfen.


Für Zwischenberechnungen ist es bequemer, einen Puffer zu verwenden.

Wenn 8 nicht ausreichen, finden Sie eine der Lösungenunter .

 
Swan >> :

mtmMA - es sollte zwei verschiedene Arrays geben. Bei der Teilung ist es wünschenswert, auf Ungleichheit zu Null zu prüfen.


Für Zwischenberechnungen ist es bequemer, einen Puffer zu verwenden.

Wenn 8 Stück nicht ausreichen, ist eine der Lösungen hier.






Vielen Dank für Ihren Kommentar. Beachten Sie, dass es sich um den Durchschnitt der Differenz zwischen dem höchsten und dem niedrigsten Wert handelt. Sie ist immer positiv. Und der Durchschnitt verstärkt diesen Trend. Ich wollte nachsehen, aber dann werde ich wohl im Fahrtenbuch nachsehen, ob es etwas gibt. Glauben Sie, dass ein Fehler bei der Division durch Null zu einer Divergenz von Graphen führen könnte, die in unterschiedlichen Abständen hinzugefügt wurden?
 
IlyaA >> :


Danke für den Kommentar. Beachten Sie, dass es sich um den Durchschnitt der Differenz zwischen dem höchsten und dem niedrigsten Wert handelt. Es ist immer positiv. Und der Durchschnitt verstärkt diesen Trend. Ich wollte nachsehen, aber dann werde ich wohl im Fahrtenbuch nachsehen, ob es etwas gibt. Glauben Sie, dass ein Fehler bei der Division durch Null zu einer Divergenz von Graphen führen kann, die in unterschiedlichen Abständen hinzugefügt wurden?

aber es ist ratsam, das zu überprüfen)

die Diskrepanz ist auf die Verwendung von Arrays ohne Shifts zurückzuführen.

 
IlyaA писал(а) >>

Lassen Sie mich den Programmcode für konstruktive Kritik der Öffentlichkeit zur Verfügung stellen (bitte sehen Sie von konstruktiver Kritik an dem Indikator selbst ab). Doch zunächst eine Beschreibung. Dies ist der TSI (True Force Index). Er basiert auf dem 1-Tages-Momentum. Diese Inkremente werden durch den entsprechenden Durchschnitt (21 Perioden) geglättet. Fügen wir nun eine Skalierung hinzu. Dazu nimmt man die Differenz zwischen Hoch und Tief und glättet sie mit demselben exponentiellen Durchschnitt (21 Perioden). Teilen wir den glatten Impuls durch die glatte Streuung. Dieses Verhältnis wird durch einen kurzen exponentiellen Durchschnitt (5 Perioden) geglättet. Wir haben die Hauptleitung erhalten. Jetzt glätten wir die Hauptlinie mit einer Absicherung (EMA(, 5)) und freuen uns, dass wir eine Signallinie erhalten haben. In der Tat, freuen wir uns noch einmal, denn wir haben TSI - ein typischer Trendindikator. In meiner Implementierung habe ich 3 weitere Puffer für "Kreise", die ich benutze, um die Kreuzung der Haupt- und Signalstrecken zu markieren. Meine Herren, bitte schicken Sie mir den Code:

Ich möchte Sie an den Grund der Ansprache erinnern. Wenn Sie den Indikator auf das Diagramm ziehen, ein paar Kerzen überspringen und einen weiteren Indikator hinzufügen, erhalten wir eine Divergenz der Indikatorwerte. Es gibt auch eine sehr starke Divergenz, wenn dieser Indikator während des visuellen Tests des EAs gezeichnet wird und später derselbe Indikator zum Chart hinzugefügt wird. Können Sie mir mit Artikeln oder persönlichen Erfahrungen zu dieser Art von Fehlern im Indikator helfen? Ich danke Ihnen.

Der Indikator ist in Ordnung. Wenn iMAOnArray() in einer separaten Schleife aufgerufen wird, kann der Indikator unabhängig von seiner Setzzeit korrekt funktionieren.

Sie müssen Ihre einzelne Schleife in drei Schleifen aufteilen.

iMAOnArray() wird korrekter funktionieren.

 
Swan >> :

aber es ist ratsam, das zu überprüfen)

Die Diskrepanz ist auf die Verwendung von Arrays ohne Verschiebung zurückzuführen.

Ich verstehe nicht wirklich, was das ohne eine Verschiebung bedeutet. Könnten Sie bitte Worte hinzufügen?

 
IlyaA >> :

Ich verstehe nicht wirklich, was das ohne eine Verschiebung bedeutet. Bitte Wörter hinzufügen.

Das Pufferfeld wird verschoben, wenn ein neuer Balken erscheint. Die Indizes werden um 1 erhöht.

der obige Link beschreibt es genauer.

Grund der Beschwerde: