Penulis asal:
RoboFx
Indikator Balance of Power (BOP) adalah sebuah histogram berwarna yang menunjukkan kekuatan dan arah trend semasa. Ia dilengkapi dengan penggera yang boleh menghantar email dan notifikasi push ke peranti mudah alih. Histogram ini akan berwarna mengikut nilai parameter input untuk tahap terlebih beli dan terlebih jual serta arah pergerakan histogram tersebut.
Berikut adalah perubahan yang telah dilakukan pada kod indikator untuk melaksanakan penggera, mesej email dan notifikasi push:
- Parameter input baru telah diperkenalkan.
//---- Pembolehubah input untuk penggera input uint NumberofBar=1; //Bilangan bar untuk isyarat input bool SoundON=true; //Aktifkan penggera input uint NumberofAlerts=2; //Bilangan penggera input bool EMailON=false; //Aktifkan pengiriman isyarat melalui email input bool PushON=false; //Aktifkan penghantaran isyarat ke peranti mudah alih
- Tiga fungsi baru telah ditambah di akhir kod indikator: BuySignal(), SellSignal() dan GetStringTimeframe().
//+------------------------------------------------------------------+ //| Fungsi isyarat belian | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname,// teks nama indikator untuk mesej email dan push double &ColorArray[],// buffer indeks warna int ColorIndex,// indeks warna dalam buffer indeks warna untuk menjana isyarat const int Rates_total, // bilangan bar semasa const int Prev_calculated, // bilangan 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(ColorArray[index1]!=ColorIndex && 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+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("ISYARAT BELIAN Ask=",Ask," Bid=",Bid," masa semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod); if(EMailON) SendMail(SignalSirname+": amaran isyarat BELIAN","ISYARAT BELIAN di Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod); if(PushON) SendNotification(SignalSirname+": ISYARAT BELIAN di Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod); } //--- } //+------------------------------------------------------------------+ //| Fungsi isyarat jual | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // teks nama indikator untuk mesej email dan push double &ColorArray[], // buffer indeks warna int ColorIndex, // indeks warna dalam buffer indeks warna untuk menjana isyarat const int Rates_total, // bilangan bar semasa const int Prev_calculated, // bilangan 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(ColorArray[index1]!=ColorIndex && 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+=Spread[index]; string sAsk=DoubleToString(Ask,_Digits); string sBid=DoubleToString(Bid,_Digits); string sPeriod=GetStringTimeframe(ChartPeriod()); if(SoundON) Alert("ISYARAT JUAL Ask=",Ask," Bid=",Bid," masa semasa=",text," Simbol=",Symbol()," Tempoh=",sPeriod); if(EMailON) SendMail(SignalSirname+": amaran isyarat JUAL","ISYARAT JUAL di Ask="+sAsk+", Bid="+sBid+", Tarikh="+text+" Simbol="+Symbol()+" Tempoh="+sPeriod); if(PushON) SendNotification(SignalSirname+": ISYARAT JUAL di 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() telah ditambah selepas kitaran pengiraan indikator dalam blok OnCalculate().
//--- BuySignal("BalanceOfPower_Histogram_Alert",ColorIndBuffer,0,rates_total,prev_calculated,close,spread); SellSignal("BalanceOfPower_Histogram_Alert",ColorIndBuffer,7,rates_total,prev_calculated,close,spread); //---
Di mana ColorIndBuffer adalah nama buffer indeks warna untuk menyimpan warna candle dalam bentuk indeks.
Adalah diandaikan bahawa hanya satu panggilan kepada fungsi BuySignal() dan SellSignal() akan digunakan dalam blok OnCalculate() kod indikator.
Indikator ini menggunakan kelas dari perpustakaan SmoothAlgorithms.mqh (salin ke <terminal_data_folder>\MQL5\Include). Penggunaan kelas ini telah diterangkan dengan terperinci dalam artikel "Pengendalian Rantaian Harga untuk Pengiraan Pertengahan Tanpa Menggunakan Buffer Tambahan".
Asalnya, indikator ini ditulis dalam MQL5 dan pertama kali diterbitkan di Kod Asas pada 07.02.2013.

Fig1. Indikator BalanceOfPower_Histogram_Alert pada carta
Fig.2. Indikator BalanceOfPower_Histogram_Alert menjana penggera.
