Halo para trader! Kali ini kita akan membahas tentang indikator WeightOscillator yang sangat berguna untuk analisis tren. Indikator ini dilengkapi dengan fitur notifikasi yang akan mengirimkan email dan push-notifikasi langsung ke perangkat mobile kamu. Sangat praktis, bukan?
Berikut adalah beberapa perubahan yang telah dilakukan pada kode indikator untuk menerapkan notifikasi, pesan email, dan push-notifikasi:
- Pengenalan enumerasi untuk opsi pembuatan sinyal indikator yang dideklarasikan secara global sebelum variabel input.//+----------------------------------------------------+
//| Enumerasi untuk opsi pembuatan sinyal |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //Sinyal breakout
MODE_TREND //Sinyal breakout dan tren
}; - Pengenalan parameter input baru//---- Variabel input untuk notifikasi
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //Mode pembuatan sinyal
input uint NumberofBar=1; //Jumlah bar untuk menghasilkan sinyal
input bool SoundON=true; //Aktifkan notifikasi suara
input uint NumberofAlerts=2; //Jumlah notifikasi
input bool EMailON=false; //Aktifkan pengiriman sinyal via email
input bool PushON=false; //Aktifkan pengiriman sinyal ke perangkat mobile - Menambahkan tiga fungsi baru di akhir kode indikator: BuySignal(), SellSignal(), dan GetStringTimeframe()//+------------------------------------------------------------------+
//| Fungsi sinyal beli |
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,// nama indikator untuk email dan pesan push
double &ColorArray[],// indeks warna buffer
int ColorIndex,// indeks warna dalam buffer untuk menghasilkan sinyal
const int Rates_total, // jumlah bar saat ini
const int Prev_calculated, // jumlah bar pada tick sebelumnya
const double &Close[], // harga penutupan
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("Sinyal BUY Ask=",Ask," Bid=",Bid," waktu=",text," Simbol=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Notifikasi sinyal BUY","Sinyal BUY di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinyal BUY di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
}
else
{
if(SoundON) Alert("Sinyal Tren Naik Ask=",Ask," Bid=",Bid," waktu=",text," Simbol=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Notifikasi sinyal Tren Naik","Sinyal Tren Naik di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinyal Tren Naik di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Fungsi sinyal jual |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// nama indikator untuk email dan pesan push
double &ColorArray[], // indeks warna buffer
int ColorIndex, // indeks warna dalam buffer untuk menghasilkan sinyal
const int Rates_total, // jumlah bar saat ini
const int Prev_calculated, // jumlah bar pada tick sebelumnya
const double &Close[], // harga penutupan
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("Sinyal SELL Ask=",Ask," Bid=",Bid," waktu=",text," Simbol=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Notifikasi sinyal SELL","Sinyal SELL di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinyal SELL di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
}
else
{
if(SoundON) Alert("Sinyal Tren Turun Ask=",Ask," Bid=",Bid," waktu=",text," Simbol=",Symbol()," Periode=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Notifikasi sinyal Tren Turun","Sinyal Tren Turun di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Sinyal Tren Turun di Ask="+sAsk+", Bid="+sBid+", Tanggal="+text+" Simbol="+Symbol()+" Periode="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| Mengambil timeframe sebagai string |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - Menambahkan beberapa panggilan ke fungsi BuySignal() dan SellSignal() setelah siklus perhitungan indikator di blok OnCalculate() //---
BuySignal("WeightOscillator_Alert",ColorBuffer,0,rates_total,prev_calculated,close,spread);
SellSignal("WeightOscillator_Alert",ColorBuffer,4,rates_total,prev_calculated,close,spread);
//---
Dimana ColorBuffer adalah nama buffer indeks warna untuk menyimpan warna indikator. Nilai 0 dan 4 adalah nomor warna dalam buffer ini, di mana osilator berada di area overbought dan oversold, secara berturut-turut.
Diperkirakan bahwa hanya satu panggilan ke fungsi BuySignal() dan SellSignal() yang akan digunakan dalam blok OnCalculate() dari kode indikator.
Indikator ini menggunakan kelas dari pustaka SmoothAlgorithms.mqh (salin ke <folder_data_terminal>\MQL5\Include). Penggunaan kelas-kelas tersebut telah dijelaskan dengan rinci dalam artikel "Rata-rata Deret Harga untuk Perhitungan Intermediate Tanpa Menggunakan Buffer Tambahan".

Gambar 1. Indikator WeightOscillator_Alert di grafik

Gambar 2. Indikator WeightOscillator_Alert. Menghasilkan notifikasi untuk sinyal tren

Gambar 3. Indikator WeightOscillator_Alert. Menghasilkan notifikasi untuk sinyal tren
Komentar 0