Penulis Asli: dimeon
Hai traders! Hari ini kita akan bincangkan tentang indikator ColorXdinMA yang menarik ini. Ia merupakan indikator purata bergerak (moving average) yang dilengkapi dengan fungsi notifikasi. Dengan ColorXdinMA, anda boleh menerima amaran melalui email dan notifikasi push ke peranti mudah alih anda.
Berikut adalah beberapa perubahan yang telah dilakukan pada kod indikator untuk mengimplementasikan fungsi notifikasi ini:
- Enumeration untuk pilihan penghasilan isyarat indikator telah dinyatakan pada skop global sebelum pembolehubah input dinyatakan.//+----------------------------------------------------+
//| Enumeration untuk pilihan penghasilan isyarat |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Isyarat breakout
MODE_TREND //Isyarat breakout dan trend
}; - Parameter input baru diperkenalkan//---- Pembolehubah input untuk notifikasi
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Mod penghasilan isyarat
input uint NumberofBar=1; //Bilangan bar untuk menghasilkan isyarat
input bool SoundON=true; //Aktifkan notifikasi suara
input uint NumberofAlerts=2; //Bilangan notifikasi
input bool EMailON=false; //Aktifkan pengiriman email untuk isyarat
input bool PushON=false; //Aktifkan penghantaran isyarat ke peranti mudah alih - Ditambah tiga fungsi baru di akhir kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe()//+------------------------------------------------------------------+
//| Fungsi isyarat beli |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// teks nama indikator untuk email dan notifikasi
double &ColorArray[],// buffer indeks warna
int ColorIndex,// indeks warna dalam buffer untuk menghasilkan isyarat
const int Rates_total, // bilangan bar semasa
const int Prev_calculated, // bilangan bar pada tick sebelumnya
const double &Close[], // harga tutup
const int &Spread[]) // spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool BuySignal=false;
bool SeriesTest=ArrayGetAsSeries(ColorArray);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
}
else
{
if(ColorArray[index]==ColorIndex) BuySignal=true;
}
if(BuySignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("ISYARAT BELI Ask=",Ask," Bid=",Bid," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": ISYARAT BELI ALERT","ISYARAT BELI pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
if(PushON) SendNotification(SignalSirname+": ISYARAT BELI pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
}
else
{
if(SoundON) Alert("Isyarat Up Trend Ask=",Ask," Bid=",Bid," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Isyarat Up Trend ALERT","ISYARAT BELI pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Isyarat Up Trend pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Fungsi isyarat jual |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// teks nama indikator untuk email dan notifikasi
double &ColorArray[], // buffer indeks warna
int ColorIndex, // indeks warna dalam buffer untuk menghasilkan isyarat
const int Rates_total, // bilangan bar semasa
const int Prev_calculated, // bilangan bar pada tick sebelumnya
const double &Close[], // harga tutup
const int &Spread[]) // spread
{
//---
static uint counter=0;
if(Rates_total!=Prev_calculated) counter=0;
bool SellSignal=false;
bool SeriesTest=ArrayGetAsSeries(ColorArray);
int index,index1;
if(SeriesTest)
{
index=int(NumberofBar);
index1=index+1;
}
else
{
index=Rates_total-int(NumberofBar)-1;
index1=index-1;
}
if(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
}
else
{
if(ColorArray[index]==ColorIndex) SellSignal=true;
}
if(SellSignal && counter<=NumberofAlerts)
{
counter++;
MqlDateTime tm;
TimeToStruct(TimeCurrent(),tm);
string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
SeriesTest=ArrayGetAsSeries(Close);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
double Ask=Close[index];
double Bid=Close[index];
SeriesTest=ArrayGetAsSeries(Spread);
if(SeriesTest) index=int(NumberofBar);
else index=Rates_total-int(NumberofBar)-1;
Bid+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
if(SoundON) Alert("ISYARAT JUAL Ask=",Ask," Bid=",Bid," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": ISYARAT JUAL ALERT","ISYARAT JUAL pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
if(PushON) SendNotification(SignalSirname+": ISYARAT JUAL pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
}
else
{
if(SoundON) Alert("Isyarat Down Trend Ask=",Ask," Bid=",Bid," waktu semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Isyarat Down Trend ALERT","ISYARAT JUAL pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Isyarat Down Trend pada Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Mendapatkan tempoh masa sebagai string |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Ditambah beberapa panggilan kepada fungsi BuySignal() dan SellSignal() selepas kitaran pengiraan indikator dalam blok OnCalculate()//---
BuySignal("ColorXdinMA_Alert",ColorXdinMA,1,rates_total,prev_calculated,close,spread);
SellSignal("ColorXdinMA_Alert",ColorXdinMA,2,rates_total,prev_calculated,close,spread);
//---
Di mana ColorXdinMA adalah nama buffer indeks warna untuk menyimpan warna indikator. Nilai 1 dan 2 adalah nombor warna dalam buffer ini, di mana purata bergerak menaik atau menurun, masing-masing.
Adalah diandaikan bahawa hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.
Indikator ini menggunakan kelas dari pustaka SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas ini telah diterangkan dengan mendalam dalam artikel "Rata-rata Siri Harga untuk Pengiraan Sementara Tanpa Menggunakan Buffer Tambahan".

Fig1. Indikator ColorXdinMA_Alert pada carta

Fig.2. Indikator ColorXdinMA_Alert. Menghasilkan notifikasi untuk isyarat breakout

Fig.3. Indikator ColorXdinMA_Alert. Menghasilkan notifikasi untuk isyarat trend
Siaran berkaitan
- HarmonikManual: Indikator Canggih untuk MetaTrader 4
- Alat Master - Indikator untuk MetaTrader 4
- Paparan Grafik Trend Semasa untuk Semua Tempoh Dalam Satu Panel - Indikator untuk MetaTrader 4
- Indikator Pembukaan Rentang Untuk MetaTrader 5: Panduan Lengkap
- Panduan Menggunakan Indikator XDPO_HTF_Signal di MetaTrader 5