Startseite Technischer Indikator Beitrag

Ideal ZigZag: Der unverzichtbare Indikator für MetaTrader 4

Anhang
10671.zip (2.71 KB, Herunterladen 0 mal)



Vorteile des Ideal ZigZag Indikators

  • Die kostspieligste Funktion ist iBarShift, die alle Zyklen im Code ersetzt, die benötigt werden, um Spitzen abzurufen.
  • Alle Informationen, die benötigt werden, um den ZigZag für jede Kerze zu erstellen, sind nicht nur jederzeit zugänglich, sondern auch für jeden externen Code.
  • Keine unterbrochenen Spitzen.
  • Effiziente Methode zur Auffindung von Spitzen ist vorhanden.
  • Sehr schnell.
  • Funktioniert korrekt bei Historieneinfügungen und beim Wechseln der Zeitrahmen.
  • Perfekt für den Einsatz in Expert Advisors (EAs).

Nachteile

1. Speicheranforderungen: Dieser Indikator verwendet 5 Buffer anstelle von 2 (oder sogar 1) in anderen ähnlichen Implementierungen. Aber (meiner Meinung nach) ist das ein guter Preis für die Vorteile #6 und #7. Keiner der schnellen ZigZags, die ich gesehen habe, kann Historieneinfügungen verarbeiten, ohne eine vollständige Neubewertung durchzuführen. Meiner kann das und macht es zudem effizient.

2. Zusätzliche Linien sind verfügbar: Diese sind erforderlich, um die Daten für jeden externen Code sichtbar zu machen. Diese Linien sollten niemals angezeigt werden.

Prinzip:

Der ZigZag wird nach dem Kanalprinzip gezeichnet.

Die Kanalbreite kann in Punkten (XLab_ZZ) oder in Prozent (XLab_ZZP) definiert werden.

Spitzenabfrage:

extern int ChannelWidth = 100;

#property indicator_chart_window
#property indicator_buffers 1

#property indicator_color1 Red
#property indicator_width1 3

datetime LastTime;

int init()
{
    LastTime = 0;
    return(0);
}

bool GetValue(double dir, int bar, int prevBar, double& peak, int& peakBar, datetime& peakTime)
{
    if (dir < 0)
    {
        datetime t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar);
        int i = iBarShift(Symbol(), 0, t);

        if (i == prevBar)
        {
            t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
            i = iBarShift(Symbol(), 0, t);
        }

        double v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);

        if (v == EMPTY_VALUE)
        {
            t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 2, bar + 1);
            i = iBarShift(Symbol(), 0, t);
            v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 1, i);
        }

        peak = v;
        peakBar = i;
        peakTime = t;
    }
    else if (dir > 0)
    {
        t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar);
        i = iBarShift(Symbol(), 0, t);

        if (i == prevBar)
        {
            t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
            i = iBarShift(Symbol(), 0, t);
        }

        v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);

        if (v == EMPTY_VALUE)
        {
            t = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 3, bar + 1);
            i = iBarShift(Symbol(), 0, t);
            v = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 0, i);
        }

        peak = v;
        peakBar = i;
        peakTime = t;
    }
    else 
    {
        return (false);
    }
    return (true);
}

int start()
{
    if (LastTime == Time[0]) return (0);
    LastTime = Time[0];

    double dir = iCustom(Symbol(), 0, "XLab_ZZ", ChannelWidth, 4, 1);
    double rdir = -dir;

    if (dir == EMPTY_VALUE) return (0);

    double v1, v2, v3, v4, v5;
    int i1, i2, i3, i4, i5;
    datetime t1, t2, t3, t4, t5;

    GetValue(dir, 1, 0, v1, i1, t1);
    GetValue(rdir, i1, 0, v2, i2, t2);
    GetValue(dir, i2, i1, v3, i3, t3);
    GetValue(rdir, i3, i2, v4, i4, t4);
    GetValue(dir, i4, i3, v5, i5, t5);

    SetPt("1", v1, t1);
    SetPt("2", v2, t2);
    SetPt("3", v3, t3);
    SetPt("4", v4, t4);
    SetPt("5", v5, t5);

    Print(v1, "   ", v2, "  ", v3, "  ", v4, " ", v5, " ", i1, "  ", i2, "  ", i3, " ", i4, " ", i5);

    return(0);
}

void SetPt(string name, double price, datetime time)
{
    ObjectCreate(name, OBJ_ARROW, 0, time, price);
    ObjectSet(name, OBJPROP_ARROWCODE, 108);
    ObjectSet(name, OBJPROP_PRICE1, price);
    ObjectSet(name, OBJPROP_TIME1, time);
}

Dieses Beispiel ist ein Indikator, der (einmal pro Kerze) die ersten fünf Spitzen markiert (einschließlich der aktuellen, die sich bildet).

Achtung! Dieser Code kann fehlerhaft arbeiten, wenn der 0. Bar-Modus aktiviert ist.


0. Bar-Modus:

Wird durch die Variable DrawZeroBar eingestellt und ist standardmäßig deaktiviert.

Es wird nicht empfohlen, diese Option zu verwenden, insbesondere wenn der Indikator in einem EA genutzt wird.


Viel Spaß beim Nutzen! :) Bei Fragen stehe ich gerne zur Verfügung.

Falls Fehler auftreten, bitte meldet sie mir. Vielen Dank!

Verwandte Beiträge

Kommentar (0)