Penulis asal:
Wellx
Indikator signal semaphore ini berasaskan nilai dari Accelerator Oscillator dan Awesome Oscillator yang dihasilkan oleh Bill Williams. Ia dilengkapi dengan notifikasi, penghantaran e-mel, dan pemberitahuan push ke peranti mudah alih.
Berikut adalah beberapa perubahan yang telah dilakukan pada kod indikator untuk melaksanakan notifikasi, mesej e-mel dan pemberitahuan push:
- Parameter input baru telah diperkenalkan:
input uint BilanganBar=1;//Bilangan bar untuk signal input bool BunyiON=true; //Aktifkan notifikasi input uint BilanganNotifikasi=2;//Bilangan notifikasi input bool EMailON=false; //Aktifkan penghantaran signal melalui e-mel input bool PushON=false; //Aktifkan penghantaran signal ke peranti mudah alih
- Tiga fungsi baru ditambah di akhir kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe()
//+------------------------------------------------------------------+ //| Fungsi signal beli | //+------------------------------------------------------------------+ void BuySignal(string NamaSignal, // teks nama indikator untuk mesej e-mel dan push double &ArrowBeli[], // penampung indikator dengan signal beli const int Jumlah_rates, // bilangan bar semasa const int Prev_hitung,// bilangan bar pada tick sebelumnya const double &Tutup[], // harga tutup const int &Spread[]) // spread { u//--- static uint pengira=0; if(Jumlah_rates!=Prev_hitung) pengira=0; bool SignalBeli=false; bool UjiSiri=ArrayGetAsSeries(ArrowBeli); int index; if(UjiSiri) index=int(BilanganBar); else index=Jumlah_rates-int(BilanganBar)-1; if(NormalizeDouble(ArrowBeli[index],_Digits) && ArrowBeli[index]!=EMPTY_VALUE) SignalBeli=true; if(SignalBeli && pengira<=BilanganNotifikasi) { pengira++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string teks=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.jam)+":"+string(tm.menit); UjiSiri=ArrayGetAsSeries(Tutup); if(UjiSiri) index=int(BilanganBar); else index=Jumlah_rates-int(BilanganBar)-1; double Tanya=Tutup[index]; double Tanya=Tutup[index]; UjiSiri=ArrayGetAsSeries(Spread); if(UjiSiri) index=int(BilanganBar); else index=Jumlah_rates-int(BilanganBar)-1; Tanya+=Spread[index]; string sTanya=DoubleToString(Tanya,_Digits); string sTanya=DoubleToString(Tanya,_Digits); string sTemp=GetStringTimeframe(ChartPeriod()); if(BunyiON) Alert("SIGNAL BELI Tanya=",Tanya," Bid=",Tanya," masa sekarang=",teks," Simbol=",Symbol()," Period=",sTemp); if(EMailON) SendMail(NamaSignal+": NOTIFIKASI BELI","SIGNAL BELI di Tanya="+sTanya+", Bid="+sTanya+", Tarikh="+teks+" Simbol="+Symbol()+" Period="+sTemp); if(PushON) SendNotification(NamaSignal+": SIGNAL BELI di Tanya="+sTanya+", Bid="+sTanya+", Tarikh="+teks+" Simbol="+Symbol()+" Period="+sTemp); } u//--- } //+------------------------------------------------------------------+ //| Fungsi signal jual | //+------------------------------------------------------------------+ void SellSignal(string NamaSignal, // teks nama indikator untuk mesej e-mel dan push double &ArrowJual[], // penampung indikator dengan signal jual const int Jumlah_rates, // bilangan bar semasa const int Prev_hitung, // bilangan bar pada tick sebelumnya const double &Tutup[], // harga tutup const int &Spread[]) // spread { u//--- static uint pengira=0; if(Jumlah_rates!=Prev_hitung) pengira=0; bool SignalJual=false; bool UjiSiri=ArrayGetAsSeries(ArrowJual); int index; if(UjiSiri) index=int(BilanganBar); else index=Jumlah_rates-int(BilanganBar)-1; if(NormalizeDouble(ArrowJual[index],_Digits) && ArrowJual[index]!=EMPTY_VALUE) SignalJual=true; if(SignalJual && pengira<=BilanganNotifikasi) { pengira++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string teks=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.jam)+":"+string(tm.menit); UjiSiri=ArrayGetAsSeries(Tutup); if(UjiSiri) index=int(BilanganBar); else index=Jumlah_rates-int(BilanganBar)-1; double Tanya=Tutup[index]; double Tanya=Tutup[index]; UjiSiri=ArrayGetAsSeries(Spread); if(UjiSiri) index=int(BilanganBar); else index=Jumlah_rates-int(BilanganBar)-1; Tanya+=Spread[index]; string sTanya=DoubleToString(Tanya,_Digits); string sTanya=DoubleToString(Tanya,_Digits); string sTemp=GetStringTimeframe(ChartPeriod()); if(BunyiON) Alert("SIGNAL JUAL Tanya=",Tanya," Bid=",Tanya," masa sekarang=",teks," Simbol=",Symbol()," Period=",sTemp); if(EMailON) SendMail(NamaSignal+": NOTIFIKASI JUAL","SIGNAL JUAL di Tanya="+sTanya+", Bid="+sTanya+", Tarikh="+teks+" Simbol="+Symbol()+" Period="+sTemp); if(PushON) SendNotification(NamaSignal+": SIGNAL JUAL di Tanya="+sTanya+", Bid="+sTanya+", Tarikh="+teks+" Simbol="+Symbol()+" Period="+sTemp); } u//--- } //+------------------------------------------------------------------+ //| Mendapatkan timeframe 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()
u//--- BuySignal("wlxBW5ZoneAlert",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("wlxBW5ZoneAlert",SellBuffer,rates_total,prev_calculated,close,spread); u//---
Di mana BuyBuffer dan SellBuffer adalah nama penampung indikator untuk menyimpan signal beli dan jual. Jika terdapat nilai kosong dalam penampung indikator sama ada adalah nol atau EMPTY_VALUE perlu ditetapkan.
Diharapkan hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.
Indikator ini menggunakan kelas perpustakaan SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas tersebut telah diterangkan dengan terperinci dalam artikel "Averaging Price Series for Intermediate Calculations Without Using Additional Buffers".
Asal indikator ini ditulis dalam MQL4 dan pertama kali diterbitkan dalam Code Base pada 08.03.2008.

Fig.1. Indikator wlxBW5ZoneAlert pada carta
Fig.2. Indikator wlxBW5ZoneAlert. Menghasilkan notifikasi.
