Beranda Indikator Teknis Postingan

ZigZag Ideal: Indikator Unggulan untuk MetaTrader 4

Lampiran
10671.zip (2.71 KB, Unduh 0 kali)


Keunggulan ZigZag Ideal:

  • Fungsi iBarShift yang canggih, menggantikan semua siklus dalam kode untuk mengambil puncak dengan efisien.
  • Informasi lengkap untuk membangun ZigZag pada setiap bar tersedia, tidak hanya saat ini tetapi juga untuk setiap kode eksternal.
  • Tidak ada puncak yang tertunda.
  • Metode efisien untuk menemukan puncak tersedia.
  • Sangat cepat dalam pengolahan data.
  • Berfungsi dengan baik pada penyisipan sejarah dan saat berpindah Time Frame (TF).
  • Sangat cocok digunakan dalam Sistem Trading (EA).

Kekurangan ZigZag Ideal:

1. Kebutuhan memori. Indikator ini menggunakan 5 buffer dibandingkan 2 (atau bahkan 1) pada implementasi serupa lainnya. Namun, menurut pendapat saya, ini adalah harga yang pantas untuk keunggulan #6 dan #7. Tidak ada ZigZag cepat yang saya lihat dapat memproses penyisipan sejarah tanpa perlu membangun ulang sepenuhnya. Indikator ini melakukannya dengan cara yang efisien.

2. Garis tambahan tersedia. Ini diperlukan untuk membuat data terlihat untuk kode eksternal. Garis-garis ini seharusnya tidak pernah terlihat.

Prinsip Kerja:

ZigZag digambar dengan prinsip saluran. Lebar saluran dapat didefinisikan dalam Poin (XLab_ZZ) atau dalam Persen (XLab_ZZP).

Pencarian Puncak:

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

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

Contoh ini adalah indikator yang menandai lima puncak pertama (termasuk yang sedang terbentuk) setiap kali bar baru terbentuk.

Perhatian! Kode ini dapat bekerja tidak sesuai jika Mode Bar ke-0 diaktifkan.

Mode Bar ke-0:

Diatur dengan variabel DrawZeroBar. Secara default dimatikan.

Tidak disarankan untuk menggunakan opsi ini, terutama jika indikator digunakan dalam EA.


Selamat menggunakan! Jika ada pertanyaan, jangan ragu untuk bertanya.

Jika menemukan bug, silakan laporkan kepada saya. Terima kasih.

Postingan terkait

Komentar (0)