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.
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
- Indikator Pembukaan Rentang Untuk MetaTrader 5: Panduan Lengkap
- Alat Master - Indikator untuk MetaTrader 4
- Tymen STARC Bands MTF: Indikator Multi-Tempoh untuk MetaTrader 5
- WeightOscillator_Alert: Indikator Trend untuk MetaTrader 5 dengan Pemberitahuan
- ColorXdinMA_Alert: Indikator Trend untuk MetaTrader 5 dengan Notifikasi