Indikator WeightOscillator merupakan alat trend yang sangat berguna, lengkap dengan fungsi pemberitahuan yang mampu menghantar emel serta notifikasi terus ke telefon pintar anda.
Berikut adalah perubahan yang telah dilakukan pada kod indikator untuk menambah baik fungsi pemberitahuan, emel dan notifikasi:
- Pengenalan enum untuk pilihan penghasilan isyarat indikator ditetapkan di skop global sebelum pembolehubah input ditentukan.//+----------------------------------------------------+
//| Pengenalan pilihan penghasilan isyarat |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Isyarat breakout
MODE_TREND //Isyarat breakout dan trend
}; - Parameter input baru diperkenalkan//---- Pembolehubah input untuk pemberitahuan
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Mod penghasilan isyarat
input uint NumberofBar=1; //Bilangan bar untuk menghasilkan isyarat
input bool SoundON=true; //Aktifkan pemberitahuan bunyi
input uint NumberofAlerts=2; //Bilangan pemberitahuan
input bool EMailON=false; //Aktifkan penghantaran emel isyarat
input bool PushON=false; //Aktifkan penghantaran isyarat ke peranti mudah alih - Tiga fungsi baru ditambah di hujung kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe()//+------------------------------------------------------------------+
//| Fungsi isyarat beli |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// nama indikator untuk emel dan notifikasi
double &ColorArray[],// buffer indeks warna
int ColorIndex,// indeks warna dalam buffer untuk menghasilkan isyarat
const int Rates_total, // jumlah bar semasa
const int Prev_calculated, // jumlah 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," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Isyarat BELI telah dihantar","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," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Isyarat Up Trend telah dihantar","ISYARAT Up Trend 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,// nama indikator untuk emel dan notifikasi
double &ColorArray[], // buffer indeks warna
int ColorIndex, // indeks warna dalam buffer untuk menghasilkan isyarat
const int Rates_total, // jumlah bar semasa
const int Prev_calculated, // jumlah 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," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Isyarat JUAL telah dihantar","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," masa sekarang=",text," Simbol=",Symbol()," Tempoh=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Isyarat Down Trend telah dihantar","ISYARAT Down Trend 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));
//----
} - Beberapa panggilan kepada fungsi BuySignal() dan SellSignal() ditambah selepas kitaran pengiraan indikator dalam blok OnCalculate() //---
BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
//---Di mana ColorBuffer ialah nama buffer indeks warna untuk menyimpan warna indikator. Nilai 0 dan 4 adalah nombor warna dalam buffer ini, di mana osilator berada dalam kawasan terlebih beli dan terlebih jual, masing-masing.
Diharapkan hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.
Indikator ini menggunakan kelas dalam perpustakaan SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas ini telah diterangkan secara terperinci dalam artikel "Rata-rata siri harga untuk pengiraan sementara tanpa menggunakan buffer tambahan".

Fig1. Indikator WeightOscillator_Alert pada carta

Fig.2. Indikator WeightOscillator_Alert. Menghasilkan pemberitahuan untuk isyarat breakout

Fig.3. Indikator WeightOscillator_Alert. Menghasilkan pemberitahuan untuk isyarat trend
Siaran berkaitan
- Penggunaan Buffer Jam untuk Pengumpulan Data di MetaTrader 5
- Indikator Pembukaan Rentang Untuk MetaTrader 5: Panduan Lengkap
- Panduan Volume Profile + Range v6.0 untuk MetaTrader 5: Indikator Trading Utama
- ColorXdinMA_Alert: Indikator Trend untuk MetaTrader 5 dengan Notifikasi
- Menggunakan Kalendar Ekonomi untuk Backtesting Strategi Trading di MetaTrader 5