लेखक: dimeon
ColorXdinMA एक ट्रेंड मूविंग एवरेज संकेतक है, जो अलर्ट, ईमेल और मोबाइल डिवाइस पर पुश-नोटिफिकेशन भेजने की सुविधा के साथ आता है।
संकेतक कोड में निम्नलिखित बदलाव किए गए हैं ताकि अलर्ट, ईमेल संदेश और पुश-नोटिफिकेशन को लागू किया जा सके:
- संकेतक सिग्नल जनरेशन के विकल्पों के लिए एन्यूमरेशन को इनपुट वेरिएबल्स के घोषित होने से पहले глобल स्कोप में घोषित किया गया है।//+----------------------------------------------------+
//| सिग्नल जनरेशन विकल्पों के लिए एन्यूमरेशन |
//+----------------------------------------------------+
enum ENUM_SIGNAL_MODE
{
MODE_SIGNAL, //ब्रेकआउट सिग्नल
MODE_TREND //ब्रेकआउट और ट्रेंड सिग्नल
}; - नए इनपुट पैरामीटर्स को पेश किया गया है//---- अलर्ट के लिए इनपुट वेरिएबल्स
input ENUM_SIGNAL_MODE SignMode=MODE_SIGNAL; //सिग्नल जनरेशन मोड
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 &ColorArray[],// रंग सूची बफर
int ColorIndex,// रंग सूची बफर में सिग्नल उत्पन्न करने के लिए रंग सूची
const int Rates_total, // वर्तमान बार की संख्या
const int Prev_calculated, // पिछले टिक पर बार की संख्या
const double &Close[], // बंद मूल्य
const int &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(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) BuySignal=true;
}
else
{
if(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+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
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);
}
else
{
if(SoundON) Alert("Up Trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Up Trend signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Up Trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| बेचने का सिग्नल फंक्शन |
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,// ईमेल और पुश संदेशों के लिए संकेतक नाम का टेक्स्ट
double &ColorArray[], // रंग सूची बफर
int ColorIndex, // रंग सूची बफर में सिग्नल उत्पन्न करने के लिए रंग सूची
const int Rates_total, // वर्तमान बार की संख्या
const int Prev_calculated, // पिछले टिक पर बार की संख्या
const double &Close[], // बंद मूल्य
const int &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(SignMode==MODE_SIGNAL)
{
if(ColorArray[index1]!=ColorIndex && ColorArray[index]==ColorIndex) SellSignal=true;
}
else
{
if(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+=_Point*Spread[index];
string sAsk=DoubleToString(Ask,_Digits);
string sBid=DoubleToString(Bid,_Digits);
string sPeriod=GetStringTimeframe(ChartPeriod());
if(SignMode==MODE_SIGNAL || (SignMode==MODE_TREND && ColorArray[index1]!=ColorIndex))
{
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);
}
else
{
if(SoundON) Alert("Down trend signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
if(EMailON) SendMail(SignalSirname+": Down trend signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
if(PushON) SendNotification(SignalSirname+": Down trend signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
}
}
//---
}
//+------------------------------------------------------------------+
//| समय सीमा को स्ट्रिंग के रूप में प्राप्त करना |
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
{
//----
return(StringSubstr(EnumToString(timeframe),7,-1));
//----
} - संकेतक कैलकुलेशन चक्रों के बाद BuySignal() और SellSignal() फंक्शन्स को कॉल करने के लिए कुछ जोड़ें//---
BuySignal("ColorXdinMA_Alert",ColorXdinMA,1,rates_total,prev_calculated,close,spread);
SellSignal("ColorXdinMA_Alert",ColorXdinMA,2,rates_total,prev_calculated,close,spread);
//---
जहां ColorXdinMA रंग सूची बफर का नाम है, जो संकेतक रंगों को स्टोर करता है। मान 1 और 2 इस बफर में रंगों की संख्या हैं, जिन पर मूविंग एवरेज बढ़ रही है या घट रही है।
यह मान लिया गया है कि संकेतक कोड के OnCalculate() ब्लॉक में BuySignal() और SellSignal() फंक्शन्स का केवल एक कॉल किया जाएगा।
संकेतक SmoothAlgorithms.mqh लाइब्रेरी की कक्षाओं का उपयोग करता है (इसे <terminal_data_folder>\MQL5\Include में कॉपी करें)। कक्षाओं का उपयोग विस्तार से वर्णित किया गया है "अतिरिक्त बफर का उपयोग किए बिना मध्यवर्ती गणनाओं के लिए मूल्य श्रृंखलाओं का औसत" लेख में।

Fig1. ColorXdinMA_Alert संकेतक चार्ट पर

Fig.2. ColorXdinMA_Alert संकेतक। ब्रेकआउट सिग्नल के लिए अलर्ट उत्पन्न करना

Fig.3. ColorXdinMA_Alert संकेतक। ट्रेंड सिग्नल के लिए अलर्ट उत्पन्न करना