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.

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
- Panduan Lengkap MetaCOT 2 CFTC ToolBox untuk Analisis COT di MT4
- Master Tools: Alat Indikator untuk MetaTrader 4 yang Harus Dimiliki
- Indikator Open Range Breakout untuk MetaTrader 5: Strategi Trading yang Efektif
- Memprediksi Harga Selanjutnya dengan Jaringan Saraf: Panduan Lengkap untuk Trader
- Volume Profile + Range v6.0: Indikator Penting untuk MetaTrader 5