//+------------------------------------------------------------------+ //| i-Example.mq4 | //| Êèì Èãîðü Â. aka KimIV | //| http://www.kimiv.ru | //| | //| 04.09.2005 Ïðèìåð óíèâåðñàëüíîãî èíäèêàòîðà | //+------------------------------------------------------------------+ #property copyright "Êèì Èãîðü Â. aka KimIV" #property link "http://www.kimiv.ru" #property indicator_chart_window #property indicator_buffers 4 #property indicator_color1 LightBlue #property indicator_color2 Salmon #property indicator_color3 LightBlue #property indicator_color4 Salmon //------- Ãëîáàëüíûå ïåðåìåííûå -------------------------------------- //------- Ïîêëþ÷åíèå âíåøíèõ ìîäóëåé --------------------------------- //#include <f-KimIV.mqh> // Áèáëèîòåêà äîïîëíèòåëüíûõ ôóíêöèé //#include <s-MACD.mqh> // Ñèãíàëüíûé ìîäóëü //------- Âíåøíèå ïàðàìåòðû èíäèêàòîðà ------------------------------- extern int NumberOfBars = 1000; // Êîëè÷åñòâî áàðîâ îáñ÷¸òà (0-âñå) extern int idIndicator = 1; // Èäåíòèôèêàòîð èíäèêàòîðà extern int FastEMAPeriod = 5; // Ïåðèîä áûñòðîãî ÌÀ extern int SlowEMAPeriod = 34; // Ïåðèîä ìåäëåííîãî ÌÀ extern int MACDSMAPeriod = 5; // Ïåðèîä MACD ÌÀ extern int BarsForCheck = 20; // Êîëè÷åñòâî áàðîâ äëÿ ïîèñêà äèâåðãåíöèé int ArrowInterval; //------- Áóôåðû èíäèêàòîðà ------------------------------------------ double SigBuy[]; double SigSell[]; double SigExitBuy[]; double SigExitSell[]; //+------------------------------------------------------------------+ //| Ãëàâíàÿ ôóíêöèÿ ïîëó÷åíèÿ ñèãíàëîâ (âûçûâàåòñÿ èç ñîâåòíèêà) | //| Ïàðàìåòðû: | //| id - èäåíòèôèêàòîð èíäèêàòîðà | //| nb - íîìåð áàðà | //| ms - ìàññèâ ñèãíàëîâ (èñõîäÿùèõ) | //| 0. Ñèãíàë íà ïîêóïêó | //| 1. Ñèãíàë íà ïðîäàæó | //| 2. Ñèãíàë íà âûõîä èç ïîêóïêè | //| 3. Ñèãíàë íà âûõîä èç ïðîäàæè | //| 4. Èäåíòèôèêàòîð èíäèêàòîðà, äàâøåãî ñèãíàë | //+------------------------------------------------------------------+ void GetSignals(int id, int nb, double& ms[]) { if (id==1) CrossingSignalMain(nb, ms); if (id==2) TurnMain(nb, ms); if (id==3) TurnSignal(nb, ms); if (id==4) DivergenceMACDMain(nb, ms); if (id==5) DivergenceMACDSignal(nb, ms); } //+------------------------------------------------------------------+ //| Âîçâðàùàåò íàèìåíîâàíèå ñèãíàëà | //| Ïàðàìåòðû: | //| id - èäåíòèôèêàòîð èíäèêàòîðà | //+------------------------------------------------------------------+ string GetNameSignal(int id) { switch (id) { case 1: return("Ïåðåñå÷åíèå ñèãíàëüíîé è îñíîâíîé ëèíèé MACD"); case 2: return("Ðàçâîðîò îñíîâíîé ëèíèé MACD"); case 3: return("Ðàçâîðîò ñèãíàëüíîé ëèíèé MACD"); case 4: return("Äèâåðãåíöèÿ MACD îñíîâíîé ëèíèè"); case 5: return("Äèâåðãåíöèÿ MACD ñèãíàëüíîé ëèíèè"); default: return("íå âûáðàí èíäèêàòîð"); } } //+------------------------------------------------------------------+ //| Ïåðåñå÷åíèå ñèãíàëüíîé è îñíîâíîé ëèíèé MACD | //| Ïàðàìåòðû: | //| nb - íîìåð áàðà | //| ms - ìàññèâ ñèãíàëîâ | //+------------------------------------------------------------------+ void CrossingSignalMain(int nb, double& ms[]) { double s1, s2, m1, m2; s1 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+1); s2 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+2); m1 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+1); m2 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+2); // Ñèãíàë íà ïîêóïêó if (s1<m1 && m2<s2) { ms[0] = Low[nb] - ArrowInterval * Point; ms[4] += 1; } // Ñèãíàë íà ïðîäàæó if (s1>m1 && m2>s2) { ms[1] = High[nb] + ArrowInterval * Point; ms[4] += 1; } } //+------------------------------------------------------------------+ //| Ðàçâîðîò îñíîâíîé ëèíèé MACD | //| Ïàðàìåòðû: | //| nb - íîìåð áàðà | //| ms - ìàññèâ ñèãíàëîâ | //+------------------------------------------------------------------+ void TurnMain(int nb, double& ms[]) { double m1, m2, m3, m4; m1 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+1); m2 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+2); m3 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+3); m4 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+4); // Ñèãíàë íà ïîêóïêó if (m4>m3 && m3>m2 && m2+Point<m1) { ms[0] = Low[nb] - ArrowInterval * Point; ms[4] += 2; } // Ñèãíàë íà ïðîäàæó if (m4<m3 && m3<m2 && m2-Point>m1) { ms[1] = High[nb] + ArrowInterval * Point; ms[4] += 2; } } //+------------------------------------------------------------------+ //| Ðàçâîðîò ñèãíàëüíîé ëèíèé MACD | //| Ïàðàìåòðû: | //| nb - íîìåð áàðà | //| ms - ìàññèâ ñèãíàëîâ | //+------------------------------------------------------------------+ void TurnSignal(int nb, double& ms[]) { double s1, s2, s3, s4; s1 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+1); s2 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+2); s3 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+3); s4 = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+4); // Ñèãíàë íà ïîêóïêó if (s4>s3 && s3>s2 && s2<s1) { ms[0] = Low[nb] - ArrowInterval * Point; ms[4] += 3; } // Ñèãíàë íà ïðîäàæó if (s4<s3 && s3<s2 && s2>s1) { ms[1] = High[nb] + ArrowInterval * Point; ms[4] += 3; } } //+------------------------------------------------------------------+ //| Äèâåðãåíöèè MACD îñíîâíîé ëèíèè | //| Ïàðàìåòðû: | //| nb - íîìåð áàðà | //| ms - ìàññèâ ñèãíàëîâ | //+------------------------------------------------------------------+ void DivergenceMACDMain(int nb, double& ms[]) { double mu1, mu2, md1, md2; double pu1, pu2, pd1, pd2; double tt[]; int sh; ArrayResize(tt, BarsForCheck); // Çàïîëíåíèå ìàññèâà òî÷åê. for (sh=0; sh<BarsForCheck; sh++) { tt[sh] = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_MAIN, nb+sh); } // Îïðåäåëåíèå êëþ÷åâûõ òî÷åê. mu1=0; mu2=0; pu1=0; pu2=0; for (sh=0; sh<BarsForCheck; sh++) { if (tt[sh+1]<tt[sh+2] && tt[sh+2]>tt[sh+3]) { if (mu1!=0 && mu2==0) { mu2 = tt[sh+1]; pu2 = High[nb+sh]; } if (mu1==0 && tt[1]<tt[2] && tt[2]>tt[3]) { mu1 = tt[sh+1]; pu1 = High[nb+sh]; } } } md1=0; md2=0; pd1=0; pd2=0; for (sh=0; sh<BarsForCheck; sh++) { if (tt[sh+1]>tt[sh+2] && tt[sh+2]<tt[sh+3]) { if (md1!=0 && md2==0) { md2 = tt[sh+1]; pd2 = Low[nb+sh]; } if (md1==0 && tt[1]>tt[2] && tt[2]<tt[3]) { md1 = tt[sh+1]; pd1 = Low[nb+sh]; } } } // Ñèãíàë íà ïîêóïêó if (pd1<pd2 && md1>md2 && md1<0 && md2<0) { ms[0] = Low[nb] - ArrowInterval * Point; ms[4] += 4; } // Ñèãíàë íà ïðîäàæó if (pu1>pu2 && mu1<mu2 && mu1>0 && mu2>0) { ms[1] = High[nb] + ArrowInterval * Point; ms[4] += 4; } } //+------------------------------------------------------------------+ //| Äèâåðãåíöèè MACD ñèãíàëüíîé ëèíèè | //| Ïàðàìåòðû: | //| nb - íîìåð áàðà | //| ms - ìàññèâ ñèãíàëîâ | //+------------------------------------------------------------------+ void DivergenceMACDSignal(int nb, double& ms[]) { double mu1, mu2, md1, md2; double pu1, pu2, pd1, pd2; double tt[]; int sh; ArrayResize(tt, BarsForCheck); // Çàïîëíåíèå ìàññèâà òî÷åê. for (sh=0; sh<BarsForCheck; sh++) { tt[sh] = iMACD(NULL, 0, FastEMAPeriod, SlowEMAPeriod, MACDSMAPeriod, PRICE_CLOSE, MODE_SIGNAL, nb+sh); } // Îïðåäåëåíèå êëþ÷åâûõ òî÷åê. mu1=0; mu2=0; pu1=0; pu2=0; for (sh=0; sh<BarsForCheck; sh++) { if (tt[sh+1]<tt[sh+2] && tt[sh+2]>tt[sh+3]) { if (mu1!=0 && mu2==0) { mu2 = tt[sh+1]; pu2 = High[nb+sh]; } if (mu1==0 && tt[1]<tt[2] && tt[2]>tt[3]) { mu1 = tt[sh+1]; pu1 = High[nb+sh]; } } } md1=0; md2=0; pd1=0; pd2=0; for (sh=0; sh<BarsForCheck; sh++) { if (tt[sh+1]>tt[sh+2] && tt[sh+2]<tt[sh+3]) { if (md1!=0 && md2==0) { md2 = tt[sh+1]; pd2 = Low[nb+sh]; } if (md1==0 && tt[1]>tt[2] && tt[2]<tt[3]) { md1 = tt[sh+1]; pd1 = Low[nb+sh]; } } } // Ñèãíàë íà ïîêóïêó if (pd1<pd2 && md1>md2 && md1<0 && md2<0) { ms[0] = Low[nb] - ArrowInterval * Point; ms[4] += 5; } // Ñèãíàë íà ïðîäàæó if (pu1>pu2 && mu1<mu2 && mu1>0 && mu2>0) { ms[1] = High[nb] + ArrowInterval * Point; ms[4] += 5; } } //+------------------------------------------------------------------+ void _Comment(int id, string Comm, int x=5, int y=15, int fs=9, color cl=Gray) { if (!IsTesting()) { if (ObjectFind("CommentLabel"+id)==-1) { ObjectCreate("CommentLabel"+id, OBJ_LABEL, 0, 0,0); } ObjectSet("CommentLabel"+id, OBJPROP_XDISTANCE, x); ObjectSet("CommentLabel"+id, OBJPROP_YDISTANCE, y); ObjectSetText("CommentLabel"+id, Comm, fs, "Arial", cl); } } //+------------------------------------------------------------------+ //| Óäàëåíèå ñâîèõ êîììåíòàðèåâ | //| Ïàðàìåòðû: | //| id - èäåíòèôèêàòîð òåêñòîâîé ìåòêè, | //+------------------------------------------------------------------+ void _Comment_Clear(int id) { ObjectDelete("CommentLabel"+id); } //+------------------------------------------------------------------+ //| Âîçâðàùàåò èíòåðâàë óñòàíîâêè ñèãíàëüíûõ óêàçàòåëåé | //+------------------------------------------------------------------+ int GetArrowInterval() { int p = Period(); switch (p) { case 1: return(5); case 5: return(7); case 15: return(10); case 30: return(15); case 60: return(20); case 240: return(30); case 1440: return(80); case 10080: return(150); case 43200: return(250); } } //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ void init() { SetIndexBuffer(0, SigBuy); SetIndexStyle (0, DRAW_ARROW); SetIndexArrow (0, 233); SetIndexEmptyValue(0, EMPTY_VALUE); SetIndexBuffer(1, SigSell); SetIndexStyle (1, DRAW_ARROW); SetIndexArrow (1, 234); SetIndexEmptyValue(1, EMPTY_VALUE); SetIndexBuffer(2, SigExitBuy); SetIndexStyle (2, DRAW_ARROW); SetIndexArrow (2, 251); SetIndexEmptyValue(2, EMPTY_VALUE); SetIndexBuffer(3, SigExitSell); SetIndexStyle (3, DRAW_ARROW); SetIndexArrow (3, 251); SetIndexEmptyValue(3, EMPTY_VALUE); ArrowInterval = GetArrowInterval(); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ void deinit() { _Comment_Clear(1); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ void start() { double ms[5]; int loopbegin, shift, ids; if (NumberOfBars==0) loopbegin = Bars - 1; else loopbegin = NumberOfBars - 1; for (shift=loopbegin; shift>=0; shift--) { ms[0] = EMPTY_VALUE; ms[1] = EMPTY_VALUE; ms[2] = EMPTY_VALUE; ms[3] = EMPTY_VALUE; ms[4] = 0; GetSignals(idIndicator, shift, ms); SigBuy[shift] = ms[0]; SigSell[shift] = ms[1]; SigExitBuy[shift+1] = ms[2]; SigExitSell[shift+1] = ms[3]; if (ms[4]!=0 && ms[4]!=ids) ids = ms[4]; _Comment(1, GetNameSignal(ids), 3, 20); } } //+------------------------------------------------------------------+
Sample
Analysis
Market Information Used:
Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Indicator Curves created:
Indicators Used:
MACD Histogram
Custom Indicators Used:
Order Management characteristics:
Other Features: