Indikator ColorJFatl_Digit ini mempunyai ciri-ciri amaran yang membolehkan anda menerima pemberitahuan melalui email dan notifikasi push ke peranti mudah alih anda.
Berikut adalah beberapa perubahan yang telah dilakukan pada kod indikator untuk melaksanakan amaran, mesej email, dan notifikasi push:
- Diperkenalkan parameter input baru:
//---- Pembolehubah input untuk amaran input uint JumlahBar=1; //Nombor bar untuk isyarat input bool BunyiON=true; //Aktifkan amaran input uint JumlahAmaran=2; //Jumlah amaran input bool EMailON=false; //Aktifkan penghantaran isyarat melalui email input bool PushON=false; //Aktifkan penghantaran isyarat ke peranti mudah alih
- Menambah tiga fungsi baru di akhir kod indikator: BuySignal(), SellSignal(), dan GetStringTimeframe()
//+------------------------------------------------------------------+ //| Fungsi isyarat beli | //+------------------------------------------------------------------+ void BuySignal(string NamaIsyarat,// teks nama indikator untuk email dan mesej push double &ArrayWarna[],// penampung indeks warna int IndeksWarna,// indeks warna dalam penampung indeks warna untuk menghasilkan isyarat const int JumlahBar, // nombor bar terkini const int Prev_calculated, // nombor bar pada tick sebelumnya const double &Close[], // harga tutup const int &Spread[]) // spread { //--- static uint counter=0; if(JumlahBar!=Prev_calculated) counter=0; bool IsyaratBeli=false; bool UjiSeries=ArrayGetAsSeries(ArrayWarna); int index,index1; if(UjiSeries) { index=int(JumlahBar); index1=index+1; } else { index=JumlahBar-int(JumlahBar)-1; index1=index-1; } if(ArrayWarna[index1]!=IndeksWarna && ArrayWarna[index]==IndeksWarna) IsyaratBeli=true; if(IsyaratBeli && counter<=JumlahAmaran) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string teks=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); UjiSeries=ArrayGetAsSeries(Close); if(UjiSeries) index=int(JumlahBar); else index=JumlahBar-int(JumlahBar)-1; double Ask=Close[index]; double Bid=Close[index]; UjiSeries=ArrayGetAsSeries(Spread); if(UjiSeries) index=int(JumlahBar); else index=JumlahBar-int(JumlahBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(BunyiON) Alert("ISYARAT BELI Ask=",Ask," Bid=",Bid," waktu sekarang=",teks," Simbol=",Symbol()," Tempoh=",sPeriod); if(EMailON) SendMail(NamaIsyarat+": amaran isyarat beli","ISYARAT BELI di Ask="+sAsk+", Bid="+sBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sPeriod); if(PushON) SendNotification(NamaIsyarat+": ISYARAT BELI di Ask="+sAsk+", Bid="+sBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Fungsi isyarat jual | //+------------------------------------------------------------------+ void SellSignal(string NamaIsyarat, // teks nama indikator untuk email dan mesej push double &ArrayWarna[], // penampung indeks warna int IndeksWarna, // indeks warna dalam penampung indeks warna untuk menghasilkan isyarat const int JumlahBar, // nombor bar terkini const int Prev_calculated, // nombor bar pada tick sebelumnya const double &Close[], // harga tutup const int &Spread[]) // spread { //--- static uint counter=0; if(JumlahBar!=Prev_calculated) counter=0; bool IsyaratJual=false; bool UjiSeries=ArrayGetAsSeries(ArrayWarna); int index,index1; if(UjiSeries) { index=int(JumlahBar); index1=index+1; } else { index=JumlahBar-int(JumlahBar)-1; index1=index-1; } if(ArrayWarna[index1]!=IndeksWarna && ArrayWarna[index]==IndeksWarna) IsyaratJual=true; if(IsyaratJual && counter<=JumlahAmaran) { counter++; MqlDateTime tm; TimeToStruct(TimeCurrent(),tm); string teks=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min); UjiSeries=ArrayGetAsSeries(Close); if(UjiSeries) index=int(JumlahBar); else index=JumlahBar-int(JumlahBar)-1; double Ask=Close[index]; double Bid=Close[index]; UjiSeries=ArrayGetAsSeries(Spread); if(UjiSeries) index=int(JumlahBar); else index=JumlahBar-int(JumlahBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(BunyiON) Alert("ISYARAT JUAL Ask=",Ask," Bid=",Bid," waktu sekarang=",teks," Simbol=",Symbol()," Tempoh=",sPeriod); if(EMailON) SendMail(NamaIsyarat+": amaran isyarat jual","ISYARAT JUAL di Ask="+sAsk+", Bid="+sBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sPeriod); if(PushON) SendNotification(NamaIsyarat+": ISYARAT JUAL di Ask="+sAsk+", Bid="+sBid+", Tarikh="+teks+" Simbol="+Symbol()+" Tempoh="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Mendapatkan tempoh masa sebagai string | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Menambah beberapa panggilan kepada fungsi BuySignal() dan SellSignal() selepas kitaran pengiraan indikator dalam blok OnCalculate()
//--- BuySignal("ColorJFatl_Digit_Alert",ArrayWarna,2,JumlahBar,Prev_calculated,Close,Spread); SellSignal("ColorJFatl_Digit_Alert",ArrayWarna,0,JumlahBar,Prev_calculated,Close,Spread); //---
Di mana ArrayWarna adalah nama penampung indeks warna untuk menyimpan warna garis dalam bentuk indeks.
Diharapkan 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 terperinci dalam artikel "Rata-Rata Siri Harga untuk Pengiraan Sementara Tanpa Menggunakan Penampung Tambahan".

Fig1. Indikator ColorJFatl_Digit_Alert pada carta
Fig.2. Indikator ColorJFatl_Digit_Alert Menghasilkan amaran.
