Beranda Indikator Teknis Postingan

Tampilkan Tren Saat Ini untuk Semua Time Frame dalam Satu Panel Sederhana di MetaTrader 4

Lampiran
15620.zip (2.17 KB, Unduh 0 kali)

Halo, para trader! Kali ini kita akan membahas sebuah indikator grafis yang sangat berguna, yaitu indikator yang berbasis pada Slope-Direction-Trend. Indikator ini sudah ada dalam beberapa versi sebelumnya, tetapi yang ini istimewa karena mampu menampilkan semua time frame dalam satu panel grafis di layar Anda.

Bagi yang penasaran, Anda bisa mencari lebih banyak hasil dengan mengunjungi tautan ini.

Saya telah mengambil indikator ini dan mengubahnya menjadi panel grafis yang menampilkan semua time frame dengan beberapa modifikasi kecil pada kode aslinya. Salah satu perubahan yang saya lakukan adalah memberikan opsi kepada pengguna untuk memilih metode moving average kedua yang digunakan untuk smoothing. Kode asli menggunakan Linear Weighted, yang bisa membuat indikator terlalu responsif dan berpotensi memberikan sinyal palsu. Dengan menggunakan Simple sebagai metode rerata kedua, kita bisa mendapatkan tren yang lebih menggambarkan arah harga saat ini.

Perubahan lainnya adalah kemampuan untuk mendapatkan tidak hanya arah tren (naik, turun, atau datar) tetapi juga nilainya. Saya akan membahas lebih lanjut tentang hal ini di artikel selanjutnya mengenai penggunaan indikator SlopeDirection ganda dan cara membuat System Trading darinya.

SlopeDirection

Untuk saat ini, mari kita lihat sekilas kode dari indikator ini. Pertama-tama, saya mendefinisikan semua nama objek yang akan digunakan. Ini adalah praktik yang baik karena setiap kali Anda menempatkan nama objek dalam tanda kutip, itu akan mengalokasikan ruang di program untuknya. Jadi, jika didefinisikan sekali dengan menggunakan pernyataan define, Anda hanya menggunakan ruang di kode Anda sekali.

// Mendefinisikan arah tren
#define     UPTREND           1
#define     DOWNTREND         -1
#define     FLATTREND         0

// Mendefinisikan 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 membuat '%s'.  Error = %d"

Selanjutnya, saya mendefinisikan dua array. Satu untuk posisi piksel untuk masing-masing dari 9 time frame dan yang kedua untuk time frame itu sendiri. Ini didefinisikan sebagai variabel global.

// Mendefinisikan variabel 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() dari indikator kita memanggil fungsi untuk membuat panel dan objek di dalam panel. Ini juga melakukan pengecekan cepat pada jumlah bar yang digunakan untuk menghitung tren. Kurang dari 3 itu agak tidak berguna.

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

Saya tidak akan menjelaskan secara detail bagaimana fungsi GetTrend() benar-benar bekerja, karena sudah ada dokumentasi yang baik di situs ini untuk itu. Kita hanya akan melihat fungsi DisplayTrend() yang grafis.

//+------------------------------------------------------------------+
//| Tampilkan tren saat ini untuk semua time frame
//+------------------------------------------------------------------+
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)
      {
         // Jika datar, cari arah tren 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));
      }
   }
}

Intinya, kita hanya melakukan perulangan melalui array TrendPeriods[] (untuk mendapatkan semua time frame) dan mengatur panah tren sesuai dengan arah tren untuk time frame tersebut. Jika tren datar, kita mencari arah pertama yang tidak datar untuk mengetahui dari mana tren itu berasal, sehingga kita dapat menampilkan panah samping dengan warna arah tersebut.

Fungsi Create_Panel() di OnInit() kita membuat objek yang terpasang di sudut kiri bawah layar dan menggunakan TrendPosition[] untuk menempatkan panah di tempat yang tepat.

//+------------------------------------------------------------------+
//| Membuat panel tren di sudut kiri bawah layar
//+------------------------------------------------------------------+
bool  Create_Panel(void)
{

   int      i;
   string   str;
   
   // Membuat jendela indikator tren
   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))
   {
      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); }

   // Buat objek tren dan tampilkan tren saat ini    
   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); }
   }

   // Tampilkan tren saat ini
   DisplayTrend();
      
   // Semua baik-baik saja
   return(true);
}

Fungsi ini akan mengembalikan TRUE jika berhasil membuat semua objek, atau mengembalikan FALSE jika terjadi kesalahan saat membuat objek. Yang menyenangkan adalah indikator akan menampilkan di tab EXPERT konsol Anda kode kesalahan dan nomor baris kode tempat kesalahan terjadi.

Kita juga perlu memperbarui indikator tren untuk setiap tick baru yang kita terima. Ini dilakukan dengan memanggil DisplayTrend() di fungsi start() kita.

//+------------------------------------------------------------------+
//| Fungsi iterasi indikator kustom                              |
//+------------------------------------------------------------------+
int   start()
{
   // Tampilkan tren saat ini untuk semua time frame
   DisplayTrend();   

   return(0);
}

Terakhir, kita menghancurkan semua objek yang dibuat oleh indikator saat kita menutup indikator tersebut.

//+------------------------------------------------------------------+
//| Fungsi deinisialisasi                                        |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // Hapus 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. Sekarang Anda memiliki panel indikator yang menunjukkan tren saat ini untuk semua time frame di sudut kiri bawah layar Anda.

Selamat trading!

Postingan terkait

Komentar (0)