Penulis Asli:
Ramdass - Penukaran sahaja
Indikator BykovTrend ini dilengkapi dengan isyarat semaphore dan mampu menghantar amaran melalui email serta notifikasi push ke peranti mudah alih.
Beberapa perubahan telah dilakukan pada kod indikator untuk melaksanakan amaran, mesej email dan notifikasi push:
- Parameter input baru telah diperkenalkan:
inputuint NumberofBar=1;//Bilangan bar untuk isyaratinputbool SoundON=true; //Aktifkan amaraninputuint NumberofAlerts=2;//Jumlah amaraninputbool EMailON=false; //Aktifkan penghantaran isyarat melalui emailinputbool PushON=false; //Aktifkan penghantaran isyarat ke peranti mudah alih
- Tiga fungsi baru telah ditambah pada akhir kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe()
//+------------------------------------------------------------------+//| Fungsi isyarat beli |//+------------------------------------------------------------------+void BuySignal(string SignalSirname, // nama indikator untuk mesej email dan push double &BuyArrow[], // penampung indikator untuk isyarat beli constint Rates_total, // jumlah bar semasa constint Prev_calculated, // jumlah bar pada tick sebelumnya constdouble &Close[], // harga tutup constint &Spread[]) // spread { //--- staticuint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool BuySignal=false; bool SeriesTest=ArrayGetAsSeries(BuyArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) 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; doubleAsk=Close[index]; doubleBid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } //--- } //+------------------------------------------------------------------+//| Fungsi isyarat jual |//+------------------------------------------------------------------+void SellSignal(string SignalSirname, // nama indikator untuk mesej email dan push double &SellArrow[], // penampung indikator untuk isyarat jual constint Rates_total, // jumlah bar semasa constint Prev_calculated, // jumlah bar pada tick sebelumnya constdouble &Close[], // harga tutup constint &Spread[]) // spread { //--- staticuint counter=0; if(Rates_total!=Prev_calculated) counter=0; bool SellSignal=false; bool SeriesTest=ArrayGetAsSeries(SellArrow); int index; if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) 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; doubleAsk=Close[index]; doubleBid=Close[index]; SeriesTest=ArrayGetAsSeries(Spread); if(SeriesTest) index=int(NumberofBar); else index=Rates_total-int(NumberofBar)-1; Bid+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod); if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod); } //--- } //+------------------------------------------------------------------+//| Mendapatkan timeframe sebagai string |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- Panggilan kepada fungsi BuySignal() dan SellSignal() ditambah selepas kitaran pengiraan indikator dalam blok OnCalculate()
//--- BuySignal("BykovTrendAlert",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("BykovTrendAlert",SellBuffer,rates_total,prev_calculated,close,spread); //---
Di mana BuyBuffer dan SellBuffer adalah nama penampung indikator untuk menyimpan isyarat beli dan jual. Nilai kosong dalam penampung indikator sama ada sifar atau EMPTY_VALUE perlu ditetapkan.
Diandaikan bahawa hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.
Indikator ini pertama kali dilaksanakan dalam MQL4 dan diterbitkan dalam Code Base pada 28.09.2007.

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


Komen 0