लेखक:
TrendLaboratory Ltd.
Fisher_org_v1 ऑस्सीलेटर पर आधारित यह सेमाफोर एरो सिग्नल इंडिकेटर ओवरबॉट और ओवर्सोल्ड क्षेत्रों से बाहर निकलने पर सिग्नल देता है। इसमें अलर्ट्स, ईमेल भेजने और मोबाइल डिवाइस पर पुश-नोटिफिकेशन भेजने की सुविधा है।
इंडिकेटर कोड में अलर्ट्स, ईमेल मैसेज और पुश-नोटिफिकेशन को कार्यान्वित करने के लिए निम्नलिखित परिवर्तन किए गए हैं:
- नए इनपुट पैरामीटर्स जोड़े गए हैं:
input uint NumberofBar=1;//सिग्नल के लिए बार संख्या input bool SoundON=true; //अलर्ट सक्षम करें input uint NumberofAlerts=2;//अलर्ट की संख्या input bool EMailON=false; //सिग्नल ईमेल करने की अनुमति दें input bool PushON=false; //मोबाइल डिवाइस पर सिग्नल भेजने की अनुमति दें
- इंडिकेटर कोड के अंत में तीन नए फ़ंक्शन जोड़े गए हैं: BuySignal(), SellSignal() और GetStringTimeframe()
//+------------------------------------------------------------------+ //| खरीद सिग्नल फ़ंक्शन | //+------------------------------------------------------------------+ void BuySignal(string SignalSirname, // ईमेल और पुश मैसेज के लिए इंडिकेटर नाम का टेक्स्ट double &BuyArrow[], // खरीद सिग्नलों के लिए इंडिकेटर बफर const int Rates_total, // वर्तमान बार की संख्या const int Prev_calculated, // पिछले टिक पर बार की संख्या const double &Close[], // क्लोज़ प्राइस const int &Spread[]) // स्प्रेड { u//--- static uint 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; 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("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); } u//--- } //+------------------------------------------------------------------+ //| बेचना सिग्नल फ़ंक्शन | //+------------------------------------------------------------------+ void SellSignal(string SignalSirname, // ईमेल और पुश मैसेज के लिए इंडिकेटर नाम का टेक्स्ट double &SellArrow[], // बिक्री सिग्नलों के लिए इंडिकेटर बफर const int Rates_total, // वर्तमान बार की संख्या const int Prev_calculated, // पिछले टिक पर बार की संख्या const double &Close[], // क्लोज़ प्राइस const int &Spread[]) // स्प्रेड { u//--- static uint 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; 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("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); } u//--- } //+------------------------------------------------------------------+ //| समय सीमा को स्ट्रिंग के रूप में प्राप्त करना | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) { //---- return(StringSubstr(EnumToString(timeframe),7,-1)); //---- }
- BuySignal() और SellSignal() फ़ंक्शंस को OnCalculate() ब्लॉक के बाद कॉल करने के लिए जोड़ा गया है:
BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread); SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
जहां BuyBuffer और SellBuffer उन नामों के इंडिकेटर बफर हैं, जो खरीद और बिक्री सिग्नलों को संग्रहीत करते हैं। इंडिकेटर बफर में खाली मान या तो शून्य या EMPTY_VALUE होना चाहिए।
यह मान लिया गया है कि इंडिकेटर कोड के OnCalculate() ब्लॉक में BuySignal() और SellSignal() फ़ंक्शन का केवल एक ही कॉल उपयोग किया जाएगा।

Fig.1. The Fisher_org_v1_Sign indicator on the chart

Fig.2. The Fisher_org_v1_Sign indicator Generating alerts.
संबंधित पोस्ट
- ओपन रेंज ब्रेकआउट इंडिकेटर: ट्रेडिंग में लाभ उठाने का तरीका
- WeightOscillator_Alert: MetaTrader 5 के लिए अलर्ट देने वाला ट्रेंड इंडिकेटर
- बोलिंजर स्क्वीज़ एडवांस्ड MT5 - आपके ट्रेडिंग के लिए परफेक्ट इंडिकेटर
- Karacatica_HTF_Signal: MetaTrader 5 के लिए एक बेहतरीन इंडिकेटर
- Volume Profile + Range v6.0: MetaTrader 5 के लिए नया इंडिकेटर