Laman utama Indikator Teknikal Siaran

ZigZag Ideal: Indikator Terbaik untuk MetaTrader 4

Lampiran
10671.zip (2.71 KB, Muat turun 0 kali)



Kelebihan:

  • Fungsi iBarShift yang mahal ini menggantikan semua kitaran dalam kod yang diperlukan untuk mendapatkan puncak.
  • Semua maklumat yang diperlukan untuk membina ZZ bagi setiap bar boleh diakses bukan sahaja pada setiap masa tetapi juga untuk setiap kod extern.
  • Tidak ada puncak yang tergantung.
  • Kaedah yang cekap untuk mencari puncak tersedia.
  • Sangat pantas.
  • Bekerja dengan betul pada penyisipan sejarah dan semasa menukar TF.
  • Ideal untuk digunakan dalam EA.

Kekurangan:

1. Keperluan memori. Indikator ini menggunakan 5 buffer berbanding 2 (atau bahkan 1) dalam pelaksanaan lain yang serupa. Namun, bagi saya, ini adalah harga yang baik untuk kelebihan #6 dan #7. Tiada ZigZag pantas yang saya lihat mampu memproses penyisipan sejarah tanpa membina semula sepenuhnya. Indikator saya melakukannya, malah dengan cara yang cekap.

2. Garis tambahan tersedia. Ini diperlukan untuk menjadikan data kelihatan untuk sebarang kod extern. Garis ini seharusnya tidak pernah kelihatan.

Prinsip:

ZZ dilukis dengan prinsip saluran.

Lebar saluran boleh ditentukan dalam Points (XLab_ZZ) atau dalam Peratus (XLab_ZZP).

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

      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 menandakan (sekali setiap bar) lima puncak pertama (termasuk yang sedang terbentuk).

Perhatian! Kod ini mungkin tidak berfungsi dengan betul jika Mod Bar 0 diaktifkan.

Mod Bar 0:

Diaktifkan dengan pembolehubah DrawZeroBar. Dinonaktifkan secara lalai.

Tidak disyorkan untuk menggunakan pilihan ini, terutama jika indikator digunakan dalam EA.


Selamat menggunakannya ;) . Jangan ragu untuk bertanya sebarang soalan.

Jika terdapat sebarang pepijat, sila laporkan kepada saya. Terima kasih.

Siaran berkaitan

Komen (0)