Laman utama Indikator Teknikal Siaran

Paparan Grafik Trend Semasa untuk Semua Tempoh Dalam Satu Panel - Indikator untuk MetaTrader 4

Lampiran
15620.zip (2.17 KB, Muat turun 0 kali)

Hari ini kita akan bincangkan satu indikator grafik yang berasaskan slope-direction-trend yang telah diterbitkan dalam beberapa bentuk sebelum ini.

Walaupun sudah ada beberapa versi indikator ini, tiada yang memaparkan semua tempoh masa dalam satu panel grafik di skrin anda. Anda boleh cari di sini untuk melihat pelbagai hasil.

Saya telah mengambil indikator ini dan menjadikannya satu panel grafik yang memaparkan semua tempoh masa, dengan beberapa modifikasi kecil pada kod asal. Salah satunya adalah, pengguna boleh memilih kaedah purata bergerak kedua yang digunakan untuk melicinkan data. Kod asal menggunakan Linear Weighted untuk pengiraan kedua, sedangkan saya memberikan pilihan kepada pengguna untuk memilih kaedah untuk pelicinan. Jika kita gunakan Linear Weighted untuk kedua-dua pengiraan, indikator itu menjadi terlalu responsif dan mungkin memberikan bacaan yang salah mengenai trend semasa. Dengan menggunakan Simple sebagai kaedah purata kedua, kita dapat trend yang lebih menunjukkan arah harga.

Satu lagi perubahan yang saya buat adalah keupayaan untuk bukan sahaja mendapatkan arah trend (naik, turun atau rata) tetapi juga mendapatkan nilainya. Saya akan bercerita lebih lanjut tentang ini dalam artikel lain yang akan saya terbitkan tidak lama lagi mengenai cara menggunakan indikator double SlopeDirection dan mencipta EA (Expert Advisor) dengannya.

SlopeDirection 

Tapi buat masa ini, mari kita lihat dengan cepat kodnya. Pertama sekali, saya akan mendefinisikan semua nama objek yang akan digunakan. Amalan ini adalah baik kerana setiap kali anda meletakkan nama objek di antara petikan, ia akan memperuntukkan ruang dalam program untuknya. Jadi jika ia didefinisikan sekali (dengan menggunakan pernyataan define), anda hanya menggunakan ruang dalam kod anda sekali.

// Definisi arah trend
#define     UPTREND           1
#define     DOWNTREND         -1
#define     FLATTREND         0

// Definisi Objek
#define     TrendPanel        "TrendPanel"
#define     InfoLine1         "InfoLine1"
#define     InfoLine2         "InfoLine2"
#define     TrendLabel        "Trend:  M1  M5  M15  M30  H1  H4  D1  W1  MN"
#define     TrendUp           "\233"
#define     TrendDown         "\234"
#define     TrendFlat         "\232"
#define     TrendUnknown      "\251"
#define     StatObjectError   "%s(%d) Gagal mencipta '%s'.  Ralat = %d"

Seterusnya, saya mendefinisikan dua array. Satu dengan kedudukan piksel untuk setiap 9 tempoh dan yang kedua dengan tempoh masa. Ini didefinisikan sebagai pembolehubah global.

// Definisi pembolehubah global
int      TrendPosition[] = { 44, 64, 88, 114, 136, 156, 174, 194, 216 };
int      TrendPeriods[] = { PERIOD_M1, PERIOD_M5, PERIOD_M15, PERIOD_M30, PERIOD_H1, PERIOD_H4, PERIOD_D1, PERIOD_W1, PERIOD_MN1 };

Fungsi OnInit() indikator kita akan memanggil fungsi untuk mencipta panel dan objek dalam panel. Ia juga melakukan pemeriksaan cepat pada bilangan bar yang digunakan untuk mengira trend. Kurang daripada 3 adalah agak tidak berguna.

//+------------------------------------------------------------------+
//| Fungsi inisialisasi indikator khusus                         |
//+------------------------------------------------------------------+
int   OnInit()
{
   // Cipta objek untuk panel indikator
   if(Create_Panel() && BarCount >= 3)
      return(INIT_SUCCEEDED);
   else
      return(INIT_FAILED);
}

Saya tidak akan terperinci mengenai bagaimana fungsi GetTrend() berfungsi, terdapat dokumentasi yang baik di laman ini untuk itu. Kita hanya akan melihat fungsi grafik DisplayTrend().

//+------------------------------------------------------------------+
//| Paparkan trend semasa untuk semua tempoh
//+------------------------------------------------------------------+
void  DisplayTrend(void)
{
   int      i, cntr, Trend, LastTrend;
   string   str;
   
   for(i=1; i<10; i++)
   {
      str = "Trend" + DoubleToStr(i, 0);
      Trend = (int)GetTrend(TrendPeriods[i-1], BarCount, Method);
      if(Trend == FLATTREND)
      {
         // Saya rata, cari arah trend terakhir
         cntr = 1;
         do 
         { 
            LastTrend = (int)GetTrend(TrendPeriods[i-1], BarCount, Method, false, cntr++);
         } while(LastTrend == Trend);
         ObjectSetText(str, TrendFlat, 8, "WingDings", (LastTrend == UPTREND ? Green : Red));
         ObjectSetInteger(0, str, OBJPROP_YDISTANCE, 6);
      }
      else
      {
         ObjectSetText(str, (Trend == UPTREND ? TrendUp : TrendDown), 8, "WingDings", (Trend == UPTREND ? Green : Red));
         ObjectSetInteger(0, str, OBJPROP_YDISTANCE, 5 + (Trend == UPTREND ? 1 : -1));
      }
   }
}

Secara ringkas, kita hanya mengulangi array TrendPeriods[] (untuk mendapatkan semua tempoh) dan menetapkan anak panah trend mengikut arah trend pada tempoh tersebut. Jika trend adalah rata, kita cari arah pertama yang bukan rata untuk mengetahui dari mana trend itu datang untuk memaparkan anak panah sisi dengan warna arah tersebut.

Fungsi Create_Panel() dalam OnInit() kita mencipta objek yang terikat pada sudut kiri bawah skrin dan menggunakan TrendPosition[] untuk meletakkan anak panah di tempat yang betul.

//+------------------------------------------------------------------+
//| Cipta panel trend di sudut kiri bawah skrin
//+------------------------------------------------------------------+
bool  Create_Panel(void)
{

   int      i;
   string   str;
   
   // Cipta tingkap indikator trend
   if(ObjectCreate(TrendPanel, OBJ_RECTANGLE_LABEL, 0, 0, 0))
   {
      ObjectSetInteger(0, TrendPanel, OBJPROP_XDISTANCE, 1);
      ObjectSetInteger(0, TrendPanel, OBJPROP_YDISTANCE, 29);
      ObjectSetInteger(0, TrendPanel, OBJPROP_XSIZE, 240);
      ObjectSetInteger(0, TrendPanel, OBJPROP_YSIZE, 26);
      ObjectSetInteger(0, TrendPanel, OBJPROP_BGCOLOR, White);
      ObjectSetInteger(0, TrendPanel, OBJPROP_BORDER_TYPE, 0);
      ObjectSetInteger(0, TrendPanel, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSetInteger(0, TrendPanel, OBJPROP_COLOR, Red);
      ObjectSetInteger(0, TrendPanel, OBJPROP_STYLE, STYLE_SOLID);
      ObjectSetInteger(0, TrendPanel, OBJPROP_WIDTH, 2);
      ObjectSetInteger(0, TrendPanel, OBJPROP_BACK, false);
      ObjectSetInteger(0, TrendPanel, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, TrendPanel, OBJPROP_SELECTED, false);
      ObjectSetInteger(0, TrendPanel, OBJPROP_HIDDEN, true);
      ObjectSetString(0, TrendPanel, OBJPROP_TOOLTIP, "\n");
   }
   else
   { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, TrendPanel, GetLastError()); return(false); }

   if(ObjectCreate(InfoLine1, OBJ_LABEL, 0, 0, 0))
   {
      ObjectSet(InfoLine1, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSet(InfoLine1, OBJPROP_XDISTANCE, 6);
      ObjectSet(InfoLine1, OBJPROP_YDISTANCE, 15);
      ObjectSetInteger(0, InfoLine1, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, InfoLine1, OBJPROP_HIDDEN, true);
      ObjectSetString(0, InfoLine1, OBJPROP_TOOLTIP, "\n");
      ObjectSetText(InfoLine1, TrendLabel, 8, "Arial", Black);
   }
   else
   { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, InfoLine1, GetLastError()); return(false); }
   
   if(ObjectCreate(InfoLine2, OBJ_LABEL, 0, 0, 0))
   {
      ObjectSet(InfoLine2, OBJPROP_CORNER, CORNER_LEFT_LOWER);
      ObjectSet(InfoLine2, OBJPROP_XDISTANCE, 6);
      ObjectSet(InfoLine2, OBJPROP_YDISTANCE, 5);
      ObjectSetInteger(0, InfoLine2, OBJPROP_SELECTABLE, false);
      ObjectSetInteger(0, InfoLine2, OBJPROP_HIDDEN, true);
      ObjectSetString(0, InfoLine2, OBJPROP_TOOLTIP, "\n");
      ObjectSetText(InfoLine2, " " + DoubleToStr(BarCount, 0) + " / " + DoubleToStr(Method, 0), 8, "Arial", Black);
   }
   else
   { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, InfoLine2, GetLastError()); return(false); }
   
   // Cipta objek trend dan paparkan trend semasa    
   for(i=1; i<10; i++)
   {
      str = "Trend" + DoubleToStr(i, 0);
      if(ObjectCreate(str, OBJ_LABEL, 0, 0, 0))
      {
         ObjectSet(str, OBJPROP_CORNER, CORNER_LEFT_LOWER);
         ObjectSet(str, OBJPROP_XDISTANCE, TrendPosition[i-1]);
         ObjectSet(str, OBJPROP_YDISTANCE, 5);
         ObjectSetInteger(0, str, OBJPROP_SELECTABLE, false);
         ObjectSetInteger(0, str, OBJPROP_HIDDEN, true);
         ObjectSetString(0, str, OBJPROP_TOOLTIP, "\n");
      }
      else
      { PrintFormat(StatObjectError, __FUNCTION__, __LINE__, str, GetLastError()); return(false); }
   }

   // Paparkan trend semasa
   DisplayTrend();
      
   // Semua baik
   return(true);
}

Fungsi ini akan mengembalikan TRUE jika berjaya dalam mencipta semua objek, atau mengembalikan FALSE jika berlaku ralat semasa mencipta objek. Yang bagusnya, indikator akan memaparkan dalam tab EXPERT konsol anda kod ralat dan nombor baris kod di mana ralat berlaku.

Kita juga perlu mengemas kini indikator trend untuk setiap tick baru yang diterima. Ini dilakukan dengan memanggil DisplayTrend() dalam fungsi start().

//+------------------------------------------------------------------+
//| Fungsi iterasi indikator khusus                              |
//+------------------------------------------------------------------+
int   start()
{
   // Paparkan trend semasa untuk semua tempoh
   DisplayTrend();   

   return(0);
}

Akhir sekali, kita musnahkan semua objek yang dicipta oleh indikator apabila kita menutup indikator.

//+------------------------------------------------------------------+
//| Fungsi deinisialisasi                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // Padam objek indikator
   if(ObjectFind(TrendPanel) >= 0) ObjectDelete(TrendPanel);
   if(ObjectFind(InfoLine1) >= 0) ObjectDelete(InfoLine1);
   if(ObjectFind(InfoLine2) >= 0) ObjectDelete(InfoLine2);
   for(int i=1; i<10; i++)
      if(ObjectFind("Trend"+DoubleToStr(i, 0)) >= 0) ObjectDelete("Trend"+DoubleToStr(i, 0));
}

Itulah dia! Kini anda mempunyai panel indikator yang menunjukkan trend semasa untuk semua tempoh di sudut kiri skrin anda.

Selamat berdagang!

Siaran berkaitan

Komen (0)