Guest User

Untitled

a guest
Feb 25th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 34.33 KB | None | 0 0
  1. //+------------------------------------------------------------------+
  2. //| Indicator Arrows.mq5 |
  3. //| Copyright 2015, MetaQuotes Software Corp. |
  4. //| https://www.mql5.com |
  5. //+------------------------------------------------------------------+
  6. #property copyright "Copyright 2015, MetaQuotes Software Corp."
  7. #property link "https://www.mql5.com"
  8. #property version "1.00"
  9. #property description "Indicator Arrows by pipPod"
  10. #property indicator_chart_window
  11. #property indicator_buffers 2
  12. #property indicator_plots 2
  13. //--- plot Arrows
  14. #property indicator_label1 "BuyArrow"
  15. #property indicator_type1 DRAW_ARROW
  16. #property indicator_color1 clrLimeGreen
  17. #property indicator_width1 1
  18. #property indicator_label2 "SellArrow"
  19. #property indicator_type2 DRAW_ARROW
  20. #property indicator_color2 clrFireBrick
  21. #property indicator_width2 1
  22. //---
  23. enum indicators
  24. {
  25. INDICATOR_MA, //Moving Average
  26. INDICATOR_MACD, //Moving Average Convergence/Divergence
  27. INDICATOR_OSMA, //Oscillator of Moving Averages
  28. INDICATOR_STOCHASTIC, //Stochastic Oscillator
  29. INDICATOR_RSI, //Relative Strength Index
  30. INDICATOR_CCI, //Commodity Channel Index
  31. INDICATOR_RVI, //Relative Vigor Index
  32. INDICATOR_ADX, //Average Directional Movement Index
  33. INDICATOR_TRIX, //Triple Exponential Average
  34. INDICATOR_BANDS, //Bollinger Bands
  35. INDICATOR_NONE //No Indicator
  36. };
  37. //---
  38. input indicators Indicator1=INDICATOR_MACD;
  39. input ENUM_TIMEFRAMES TimeFrame1=0;
  40. input indicators Indicator2=INDICATOR_MA;
  41. input ENUM_TIMEFRAMES TimeFrame2=0;
  42. //---Range
  43. input string Range;
  44. input int RangePeriod=14;
  45. //---Moving Average
  46. input string MovingAverage;
  47. input int MAPeriod=5;
  48. input ENUM_MA_METHOD MAMethod=MODE_EMA;
  49. input ENUM_APPLIED_PRICE MAPrice=PRICE_CLOSE;
  50. //---MACD
  51. input string MACD;
  52. input int FastMACD=12;
  53. input int SlowMACD=26;
  54. input int SignalMACD=9;
  55. input ENUM_APPLIED_PRICE MACDPrice=PRICE_CLOSE;
  56. //---OsMA
  57. input string OsMA;
  58. input int FastOsMA=12;
  59. input int SlowOsMA=26;
  60. input int SignalOsMA=9;
  61. input ENUM_APPLIED_PRICE OsMAPrice=PRICE_CLOSE;
  62. input int OsMASignal=9;
  63. //---Stoch
  64. input string Stochastic;
  65. input int Kperiod=8;
  66. input int Dperiod=3;
  67. input int Slowing=3;
  68. input ENUM_MA_METHOD StochMAMethod=MODE_SMA;
  69. input ENUM_STO_PRICE PriceField=STO_LOWHIGH;
  70. //---RSI
  71. input string RSI;
  72. input int RSIPeriod=8;
  73. input int RSISignal=5;
  74. input ENUM_APPLIED_PRICE RSIPrice=PRICE_CLOSE;
  75. //---CCI
  76. input string CCI;
  77. input int CCIPeriod=14;
  78. input ENUM_APPLIED_PRICE CCIPrice=PRICE_CLOSE;
  79. //---RVI
  80. input string RVI;
  81. input int RVIPeriod=10;
  82. //---ADX
  83. input string ADX;
  84. input int ADXPeriod=14;
  85. input ENUM_APPLIED_PRICE ADXPrice=PRICE_CLOSE;
  86. //---TriX
  87. input string TriX;
  88. input int TriXPeriod=14;
  89. input int TrixSignal=9;
  90. input ENUM_APPLIED_PRICE TriXPrice=PRICE_CLOSE;
  91. //---Bands
  92. input string Bands;
  93. input int BBPeriod=20; //Bands Period
  94. input double BBDev=2.0; //Bands Deviation
  95. input ENUM_APPLIED_PRICE BBPrice=PRICE_CLOSE; //Bands Price
  96. input string _;//---
  97. //---Alerts
  98. input bool AlertsOn = true,
  99. AlertsMessage = true,
  100. AlertsEmail = true,
  101. AlertsSound = true;
  102. //---
  103. int indicator1,
  104. indicator2;
  105. //---
  106. double Buy[];
  107. double Sell[];
  108. //---
  109. long chartID = ChartID();
  110. #define LabelBox "LabelBox"
  111. #define Label1 "Label1"
  112. #define Label2 "Label2"
  113. #define Label3 "Label3"
  114. #define Label4 "Label4"
  115. string label1 = "Spread ",
  116. label2 = "Range";
  117. //---
  118. int doubleToPip;
  119. double pipToDouble;
  120. //---
  121. int rangeHandle,
  122. indHandle1,
  123. indHandle2;
  124. //---
  125. MqlTick tick;
  126. //+------------------------------------------------------------------+
  127. //| Custom indicator initialization function |
  128. //+------------------------------------------------------------------+
  129. int OnInit()
  130. {
  131. IndicatorSetString(INDICATOR_SHORTNAME,"Indicator Arrows");
  132. //--- set points & digits
  133. IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
  134. if(_Digits==2 || _Digits==3)
  135. doubleToPip = 100;
  136. else
  137. doubleToPip = 10000;
  138.  
  139. if(_Digits==2 || _Digits==4)
  140. pipToDouble = _Point;
  141. else
  142. pipToDouble = _Point*10;
  143. //---create label rectangle and labels
  144. string label3,
  145. label4;
  146. int xStart=7;
  147. int yStart=80;
  148. int yIncrement=14;
  149. int ySize=40;
  150. int ySizeInc=15;
  151. ObjectCreate(chartID,LabelBox,OBJ_RECTANGLE_LABEL,0,0,0);
  152. ObjectSetInteger(chartID,LabelBox,OBJPROP_XDISTANCE,3);
  153. ObjectSetInteger(chartID,LabelBox,OBJPROP_YDISTANCE,75);
  154. ObjectSetInteger(chartID,LabelBox,OBJPROP_XSIZE,135);
  155. ObjectSetInteger(chartID,LabelBox,OBJPROP_YSIZE,ySize);
  156. ObjectSetInteger(chartID,LabelBox,OBJPROP_BGCOLOR,clrBlack);
  157. ObjectSetInteger(chartID,LabelBox,OBJPROP_BORDER_TYPE,BORDER_FLAT);
  158.  
  159. ObjectCreate(chartID,Label1,OBJ_LABEL,0,0,0);
  160. ObjectSetInteger(chartID,Label1,OBJPROP_XDISTANCE,xStart);
  161. ObjectSetInteger(chartID,Label1,OBJPROP_YDISTANCE,yStart);
  162. ObjectSetString(chartID,Label1,OBJPROP_FONT,"Arial Bold");
  163. ObjectSetInteger(chartID,Label1,OBJPROP_FONTSIZE,10);
  164. ObjectSetInteger(chartID,Label1,OBJPROP_COLOR,clrFireBrick);
  165.  
  166. ObjectCreate(chartID,Label2,OBJ_LABEL,0,0,0);
  167. ObjectSetInteger(chartID,Label2,OBJPROP_XDISTANCE,xStart);
  168. ObjectSetInteger(chartID,Label2,OBJPROP_YDISTANCE,yStart+=yIncrement);
  169. ObjectSetString(chartID,Label2,OBJPROP_FONT,"Arial Bold");
  170. ObjectSetInteger(chartID,Label2,OBJPROP_FONTSIZE,10);
  171. ObjectSetInteger(chartID,Label2,OBJPROP_COLOR,clrYellow);
  172. //---
  173. string timeFrame1 = StringSubstr(EnumToString(TimeFrame1),7)+" ";
  174. string timeFrame2 = StringSubstr(EnumToString(TimeFrame2),7)+" ";
  175. if(timeFrame1=="CURRENT ")
  176. timeFrame1 = "";
  177. if(timeFrame2=="CURRENT ")
  178. timeFrame2 = "";
  179. //---
  180. rangeHandle = iATR(NULL,0,RangePeriod);
  181. if(rangeHandle==INVALID_HANDLE)
  182. return(INIT_FAILED);
  183. indHandle1 = INVALID_HANDLE;
  184. indHandle2 = INVALID_HANDLE;
  185. if(Indicator1==INDICATOR_NONE)
  186. Alert("Indicator1 can't be 'No Indicator'");
  187. switch(Indicator1)
  188. {
  189. case INDICATOR_MA:
  190. label3 = StringFormat("iMA %s %s (%d)",timeFrame1,
  191. StringSubstr(EnumToString(MAMethod),5),MAPeriod);
  192. indHandle1 = iMA(_Symbol,TimeFrame1,MAPeriod,0,MAMethod,MAPrice);
  193. break;
  194. case INDICATOR_MACD:
  195. label3 = StringFormat("iMACD %s (%d,%d,%d)",timeFrame1,
  196. FastMACD,SlowMACD,SignalMACD);
  197. indHandle1 = iMACD(_Symbol,TimeFrame1,FastMACD,SlowMACD,SignalMACD,MACDPrice);
  198. break;
  199. case INDICATOR_OSMA:
  200. label3 = StringFormat("iOsMA %s (%d,%d,%d)",timeFrame1,
  201. FastOsMA,SlowOsMA,SignalOsMA);
  202. indHandle1 = iOsMA(_Symbol,TimeFrame1,FastOsMA,SlowOsMA,SignalOsMA,OsMAPrice);
  203. break;
  204. case INDICATOR_STOCHASTIC:
  205. label3 = StringFormat("iStoch %s (%d,%d,%d) %s",timeFrame1,
  206. Kperiod,Dperiod,Slowing,
  207. StringSubstr(EnumToString(StochMAMethod),5));
  208. indHandle1 = iStochastic(_Symbol,TimeFrame1,Kperiod,Dperiod,Slowing,StochMAMethod,PriceField);
  209. break;
  210. case INDICATOR_RSI:
  211. label3 = StringFormat("iRSI %s (%d,%d)",timeFrame1,
  212. RSIPeriod,RSISignal);
  213. indHandle1 = iRSI(_Symbol,TimeFrame1,RSIPeriod,RSIPrice);
  214. break;
  215. case INDICATOR_CCI:
  216. label3 = StringFormat("iCCI %s (%d)",timeFrame1,
  217. CCIPeriod);
  218. indHandle1 = iCCI(_Symbol,TimeFrame1,CCIPeriod,CCIPrice);
  219. break;
  220. case INDICATOR_RVI:
  221. label3 = StringFormat("iRVI %s (%d)",timeFrame1,
  222. RVIPeriod);
  223. indHandle1 = iRVI(_Symbol,TimeFrame1,RVIPeriod);
  224. break;
  225. case INDICATOR_ADX:
  226. label3 = StringFormat("iADX %s (%d)",timeFrame1,
  227. ADXPeriod);
  228. indHandle1 = iADX(_Symbol,TimeFrame1,ADXPeriod);
  229. break;
  230. case INDICATOR_TRIX:
  231. label3 = StringFormat("iTriX %s (%d)",timeFrame1,
  232. TriXPeriod);
  233. indHandle1 = iTriX(_Symbol,TimeFrame1,TriXPeriod,TriXPrice);
  234. break;
  235. case INDICATOR_BANDS:
  236. label3 = StringFormat("iBands %s (%d,%2.1f)",timeFrame1,
  237. BBPeriod,BBDev);
  238. indHandle1 = iBands(_Symbol,TimeFrame1,BBPeriod,0,BBDev,BBPrice);
  239. }
  240. if(indHandle1==INVALID_HANDLE)
  241. return(INIT_FAILED);
  242. ObjectSetInteger(chartID,LabelBox,OBJPROP_YSIZE,ySize+=ySizeInc);
  243. ObjectCreate(chartID,Label3, OBJ_LABEL,0,0,0);
  244. ObjectSetInteger(chartID,Label3,OBJPROP_CORNER,0);
  245. ObjectSetInteger(chartID,Label3,OBJPROP_XDISTANCE,xStart);
  246. ObjectSetInteger(chartID,Label3,OBJPROP_YDISTANCE,yStart+=yIncrement);
  247. ObjectSetString(chartID,Label3,OBJPROP_TEXT,label3);
  248. ObjectSetString(chartID,Label3,OBJPROP_FONT,"Arial Bold");
  249. ObjectSetInteger(chartID,Label3,OBJPROP_FONTSIZE,10);
  250. ObjectSetInteger(chartID,Label3,OBJPROP_COLOR,clrLimeGreen);
  251. //---
  252. if(Indicator2!=INDICATOR_NONE)
  253. {
  254. switch(Indicator2)
  255. {
  256. case INDICATOR_MA:
  257. label4 = StringFormat("iMA %s %s (%d)",timeFrame2,
  258. StringSubstr(EnumToString(MAMethod),5),MAPeriod);
  259. indHandle2 = iMA(_Symbol,TimeFrame2,MAPeriod,0,MAMethod,MAPrice);
  260. break;
  261. case INDICATOR_MACD:
  262. label4 = StringFormat("iMACD %s (%d,%d,%d)",timeFrame2,
  263. FastMACD,SlowMACD,SignalMACD);
  264. indHandle2 = iMACD(_Symbol,TimeFrame2,FastMACD,SlowMACD,SignalMACD,MACDPrice);
  265. break;
  266. case INDICATOR_OSMA:
  267. label4 = StringFormat("iOsMA %s (%d,%d,%d)",timeFrame2,
  268. FastOsMA,SlowOsMA,SignalOsMA);
  269. indHandle2 = iOsMA(_Symbol,TimeFrame2,FastOsMA,SlowOsMA,SignalOsMA,OsMAPrice);
  270. break;
  271. case INDICATOR_STOCHASTIC:
  272. label4 = StringFormat("iStoch %s (%d,%d,%d) %s",timeFrame2,
  273. Kperiod,Dperiod,Slowing,
  274. StringSubstr(EnumToString(StochMAMethod),5));
  275. indHandle2 = iStochastic(_Symbol,TimeFrame2,Kperiod,Dperiod,Slowing,StochMAMethod,PriceField);
  276. break;
  277. case INDICATOR_RSI:
  278. label4 = StringFormat("iRSI %s (%d,%d)",timeFrame2,
  279. RSIPeriod,RSISignal);
  280. indHandle2 = iRSI(_Symbol,TimeFrame2,RSIPeriod,RSIPrice);
  281. break;
  282. case INDICATOR_CCI:
  283. label4 = StringFormat("iCCI %s (%d)",timeFrame2,
  284. CCIPeriod);
  285. indHandle2 = iCCI(_Symbol,TimeFrame2,CCIPeriod,CCIPrice);
  286. break;
  287. case INDICATOR_RVI:
  288. label4 = StringFormat("iRVI %s (%d)",timeFrame2,
  289. RVIPeriod);
  290. indHandle2 = iRVI(_Symbol,TimeFrame2,RVIPeriod);
  291. break;
  292. case INDICATOR_ADX:
  293. label4 = StringFormat("iADX %s (%d)",timeFrame2,
  294. ADXPeriod);
  295. indHandle2 = iADX(_Symbol,TimeFrame2,ADXPeriod);
  296. break;
  297. case INDICATOR_TRIX:
  298. label4 = StringFormat("iTriX %s (%d)",timeFrame2,
  299. TriXPeriod);
  300. indHandle2 = iTriX(_Symbol,TimeFrame2,TriXPeriod,TriXPrice);
  301. break;
  302. case INDICATOR_BANDS:
  303. label4 = StringFormat("iBands %s (%d,%2.1f)",timeFrame2,
  304. BBPeriod,BBDev);
  305. indHandle2 = iBands(_Symbol,TimeFrame2,BBPeriod,0,BBDev,BBPrice);
  306. }
  307. if(indHandle2==INVALID_HANDLE)
  308. return(INIT_FAILED);
  309. ObjectSetInteger(chartID,LabelBox,OBJPROP_YSIZE,ySize+=ySizeInc);
  310. ObjectCreate(chartID,Label4,OBJ_LABEL,0,0,0);
  311. ObjectSetInteger(chartID,Label4,OBJPROP_CORNER, 0);
  312. ObjectSetInteger(chartID,Label4,OBJPROP_XDISTANCE,xStart);
  313. ObjectSetInteger(chartID,Label4,OBJPROP_YDISTANCE,yStart+=yIncrement);
  314. ObjectSetString(chartID,Label4,OBJPROP_TEXT,label4);
  315. ObjectSetString(chartID,Label4,OBJPROP_FONT,"Arial Bold");
  316. ObjectSetInteger(chartID,Label4,OBJPROP_FONTSIZE,10);
  317. ObjectSetInteger(chartID,Label4,OBJPROP_COLOR,clrLimeGreen);
  318. }
  319. //--- indicator buffers mapping
  320. SetIndexBuffer(0,Buy,INDICATOR_DATA);
  321. ArraySetAsSeries(Buy,true);
  322. PlotIndexSetString(0,PLOT_LABEL,"BuyArrow");
  323. PlotIndexSetInteger(0,PLOT_ARROW,233);
  324. PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);
  325. SetIndexBuffer(1,Sell,INDICATOR_DATA);
  326. ArraySetAsSeries(Sell,true);
  327. PlotIndexSetString(1,PLOT_LABEL,"SellArrow");
  328. PlotIndexSetInteger(1,PLOT_ARROW,234);
  329. PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);
  330. //---
  331. return(INIT_SUCCEEDED);
  332. }
  333. //---
  334. enum ENUM_SIGNAL
  335. {
  336. SIGNAL_NONE,
  337. SIGNAL_BUY,
  338. SIGNAL_SELL
  339. };
  340. //+------------------------------------------------------------------+
  341. //| Custom indicator iteration function |
  342. //+------------------------------------------------------------------+
  343. int OnCalculate(const int rates_total,
  344. const int prev_calculated,
  345. const datetime &time[],
  346. const double &open[],
  347. const double &high[],
  348. const double &low[],
  349. const double &close[],
  350. const long &tick_volume[],
  351. const long &volume[],
  352. const int &spread[])
  353. {
  354. //---
  355. if(rates_total<100)
  356. return(0);
  357. //---
  358. ArraySetAsSeries(time,true);
  359. ArraySetAsSeries(high,true);
  360. ArraySetAsSeries(low,true);
  361. //---
  362. if(SymbolInfoTick(_Symbol,tick))
  363. ObjectSetString(chartID,Label1,OBJPROP_TEXT,label1 +
  364. DoubleToString((tick.ask-tick.bid)*doubleToPip,1));
  365. static datetime prevTime;
  366. if(prev_calculated>0 && time[0]!=prevTime)
  367. {
  368. prevTime = time[0];
  369. ObjectSetString(chartID,Label2,OBJPROP_TEXT,label2 +
  370. StringFormat("(%d) %4.1f",RangePeriod,Range(0)*doubleToPip));
  371. }
  372. int i,limit;
  373. //---
  374. limit = rates_total - prev_calculated;
  375. if(prev_calculated==0)
  376. {
  377. limit = (int)ChartGetInteger(chartID,CHART_VISIBLE_BARS)+100;
  378. PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,rates_total-limit);
  379. PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,rates_total-limit);
  380. }
  381. //---
  382. for(i=limit;i>=0 && !IsStopped();i--)
  383. {
  384. static datetime Time[1];
  385. if(CopyTime(_Symbol,TimeFrame1,time[i],1,Time)!=1)
  386. return(0);
  387. const datetime time1 = Time[0];
  388. switch(Indicator1)
  389. {
  390. case INDICATOR_MA:
  391. {
  392. static double MoAv[1];
  393. static double High[1];
  394. static double Low[1];
  395. static double Close[1];
  396. if(CopyBuffer(indHandle1,0,time1,1,MoAv)!=1)
  397. return(0);
  398. if(CopyHigh(_Symbol,TimeFrame1,time1,1,High)!=1)
  399. return(0);
  400. if(CopyLow(_Symbol,TimeFrame1,time1,1,Low)!=1)
  401. return(0);
  402. if(CopyClose(_Symbol,TimeFrame1,time1,1,Close)!=1)
  403. return(0);
  404. indicator1 = iMA(MoAv,High,Low,Close);
  405. break;
  406. }
  407. case INDICATOR_MACD:
  408. {
  409. static double Macd[2];
  410. static double Sign[2];
  411. if(CopyBuffer(indHandle1,0,time1,2,Macd)!=2)
  412. return(0);
  413. if(CopyBuffer(indHandle1,1,time1,2,Sign)!=2)
  414. return(0);
  415. indicator1 = iMACD(Macd,Sign);
  416. break;
  417. }
  418. case INDICATOR_OSMA:
  419. {
  420. static double OsMa[];
  421. if(ArraySize(OsMa)!=OsMASignal+1)
  422. ArrayResize(OsMa,OsMASignal+1);
  423. if(CopyBuffer(indHandle1,0,time1,OsMASignal+1,OsMa)!=OsMASignal+1)
  424. return(0);
  425. indicator1 = iOsMA(OsMa);
  426. break;
  427. }
  428. case INDICATOR_STOCHASTIC:
  429. {
  430. static double Stoc[2];
  431. static double Sign[2];
  432. if(CopyBuffer(indHandle1,0,time1,2,Stoc)!=2)
  433. return(0);
  434. if(CopyBuffer(indHandle1,1,time1,2,Sign)!=2)
  435. return(0);
  436. indicator1 = iStochastic(Stoc,Sign);
  437. break;
  438. }
  439. case INDICATOR_RSI:
  440. {
  441. static double Rsi[];
  442. if(ArraySize(Rsi)!=RSISignal+1)
  443. ArrayResize(Rsi,RSISignal+1);
  444. if(CopyBuffer(indHandle1,0,time1,RSISignal+1,Rsi)!=RSISignal+1)
  445. return(0);
  446. indicator1 = iRSI(Rsi);
  447. break;
  448. }
  449. case INDICATOR_CCI:
  450. {
  451. static double Cci[2];
  452. if(CopyBuffer(indHandle1,0,time1,2,Cci)!=2)
  453. return(0);
  454. indicator1 = iCCI(Cci);
  455. break;
  456. }
  457. case INDICATOR_RVI:
  458. {
  459. static double Rvi[2];
  460. static double Sig[2];
  461. if(CopyBuffer(indHandle1,0,time1,2,Rvi)!=2)
  462. return(0);
  463. if(CopyBuffer(indHandle1,1,time1,2,Sig)!=2)
  464. return(0);
  465. indicator1 = iRVI(Rvi,Sig);
  466. break;
  467. }
  468. case INDICATOR_ADX:
  469. {
  470. static double Adx[1];
  471. static double Pdi[2];
  472. static double Mdi[2];
  473. if(CopyBuffer(indHandle1,0,time1,1,Adx)!=1)
  474. return(0);
  475. if(CopyBuffer(indHandle1,1,time1,2,Pdi)!=2)
  476. return(0);
  477. if(CopyBuffer(indHandle1,2,time1,2,Mdi)!=2)
  478. return(0);
  479. indicator1 = iADX(Adx,Pdi,Mdi);
  480. break;
  481. }
  482. case INDICATOR_TRIX:
  483. {
  484. static double Trix[];
  485. if(ArraySize(Trix)!=TrixSignal+1)
  486. ArrayResize(Trix,TrixSignal+1);
  487. if(CopyBuffer(indHandle1,0,time1,TrixSignal+1,Trix)!=TrixSignal+1)
  488. return(0);
  489. indicator1 = iTriX(Trix);
  490. break;
  491. }
  492. case INDICATOR_BANDS:
  493. {
  494. static double Middle[1];
  495. static double Upper[1];
  496. static double Lower[1];
  497. static double High[1];
  498. static double Low[1];
  499. static double Close[1];
  500. if(CopyBuffer(indHandle1,0,time1,1,Middle)!=1)
  501. return(0);
  502. if(CopyBuffer(indHandle1,1,time1,1,Upper)!=1)
  503. return(0);
  504. if(CopyBuffer(indHandle1,2,time1,1,Lower)!=1)
  505. return(0);
  506. if(CopyHigh(_Symbol,TimeFrame1,time1,1,High)!=1)
  507. return(0);
  508. if(CopyLow(_Symbol,TimeFrame1,time1,1,Low)!=1)
  509. return(0);
  510. if(CopyClose(_Symbol,TimeFrame1,time1,1,Close)!=1)
  511. return(0);
  512. indicator1 = iBands(Middle,Upper,Lower,High,Low,Close);
  513. break;
  514. }
  515. }
  516.  
  517. if(Indicator2!=INDICATOR_NONE)
  518. {
  519. if(CopyTime(_Symbol,TimeFrame2,time[i],1,Time)!=1)
  520. return(0);
  521. const datetime time2 = Time[0];
  522. switch(Indicator2)
  523. {
  524. case INDICATOR_MA:
  525. {
  526. static double MoAv[1];
  527. static double High[1];
  528. static double Low[1];
  529. static double Close[1];
  530. if(CopyBuffer(indHandle2,0,time2,1,MoAv)!=1)
  531. return(0);
  532. if(CopyHigh(_Symbol,TimeFrame2,time2,1,High)!=1)
  533. return(0);
  534. if(CopyLow(_Symbol,TimeFrame2,time2,1,Low)!=1)
  535. return(0);
  536. if(CopyClose(_Symbol,TimeFrame2,time2,1,Close)!=1)
  537. return(0);
  538. indicator2 = iMA(MoAv,High,Low,Close);
  539. break;
  540. }
  541. case INDICATOR_MACD:
  542. {
  543. static double Macd[2];
  544. static double Sign[2];
  545. if(CopyBuffer(indHandle2,0,time2,2,Macd)!=2)
  546. return(0);
  547. if(CopyBuffer(indHandle2,1,time2,2,Sign)!=2)
  548. return(0);
  549. indicator2 = iMACD(Macd,Sign);
  550. break;
  551. }
  552. case INDICATOR_OSMA:
  553. {
  554. static double OsMa[];
  555. if(ArraySize(OsMa)!=OsMASignal+1)
  556. ArrayResize(OsMa,OsMASignal+1);
  557. if(CopyBuffer(indHandle2,0,time2,OsMASignal+1,OsMa)!=OsMASignal+1)
  558. return(0);
  559. indicator2 = iOsMA(OsMa);
  560. break;
  561. }
  562. case INDICATOR_STOCHASTIC:
  563. {
  564. static double Stoc[2];
  565. static double Sign[2];
  566. if(CopyBuffer(indHandle2,0,time2,2,Stoc)!=2)
  567. return(0);
  568. if(CopyBuffer(indHandle2,1,time2,2,Sign)!=2)
  569. return(0);
  570. indicator2 = iStochastic(Stoc,Sign);
  571. break;
  572. }
  573. case INDICATOR_RSI:
  574. {
  575. static double Rsi[];
  576. if(ArraySize(Rsi)!=RSISignal+1)
  577. ArrayResize(Rsi,RSISignal+1);
  578. if(CopyBuffer(indHandle2,0,time2,RSISignal+1,Rsi)!=RSISignal+1)
  579. return(0);
  580. indicator2 = iRSI(Rsi);
  581. break;
  582. }
  583. case INDICATOR_CCI:
  584. {
  585. static double Cci[2];
  586. if(CopyBuffer(indHandle2,0,time2,2,Cci)!=2)
  587. return(0);
  588. indicator2 = iCCI(Cci);
  589. break;
  590. }
  591. case INDICATOR_RVI:
  592. {
  593. static double Rvi[2];
  594. static double Sig[2];
  595. if(CopyBuffer(indHandle2,0,time2,2,Rvi)!=2)
  596. return(0);
  597. if(CopyBuffer(indHandle2,1,time2,2,Sig)!=2)
  598. return(0);
  599. indicator2 = iRVI(Rvi,Sig);
  600. break;
  601. }
  602. case INDICATOR_ADX:
  603. {
  604. static double Adx[1];
  605. static double Pdi[2];
  606. static double Mdi[2];
  607. if(CopyBuffer(indHandle2,0,time2,1,Adx)!=1)
  608. return(0);
  609. if(CopyBuffer(indHandle2,1,time2,2,Pdi)!=2)
  610. return(0);
  611. if(CopyBuffer(indHandle2,2,time2,2,Mdi)!=2)
  612. return(0);
  613. indicator2 = iADX(Adx,Pdi,Mdi);
  614. break;
  615. }
  616. case INDICATOR_TRIX:
  617. {
  618. static double Trix[];
  619. if(ArraySize(Trix)!=TrixSignal+1)
  620. ArrayResize(Trix,TrixSignal+1);
  621. if(CopyBuffer(indHandle2,0,time2,TrixSignal+1,Trix)!=TrixSignal+1)
  622. return(0);
  623. indicator2 = iTriX(Trix);
  624. break;
  625. }
  626. case INDICATOR_BANDS:
  627. {
  628. static double Middle[1];
  629. static double Upper[1];
  630. static double Lower[1];
  631. static double High[1];
  632. static double Low[1];
  633. static double Close[1];
  634. if(CopyBuffer(indHandle2,0,time2,1,Middle)!=1)
  635. return(0);
  636. if(CopyBuffer(indHandle2,1,time2,1,Upper)!=1)
  637. return(0);
  638. if(CopyBuffer(indHandle2,2,time2,1,Lower)!=1)
  639. return(0);
  640. if(CopyHigh(_Symbol,TimeFrame2,time2,1,High)!=1)
  641. return(0);
  642. if(CopyLow(_Symbol,TimeFrame2,time2,1,Low)!=1)
  643. return(0);
  644. if(CopyClose(_Symbol,TimeFrame2,time2,1,Close)!=1)
  645. return(0);
  646. indicator2 = iBands(Middle,Upper,Lower,High,Low,Close);
  647. break;
  648. }
  649. }
  650. }
  651.  
  652. if(Indicator2==INDICATOR_NONE)
  653. {
  654. if(indicator1==SIGNAL_BUY)
  655. {
  656. Buy[i] = low[i] - Range(i);
  657. if(AlertsOn && prev_calculated>0)
  658. AlertsHandle(time[0],SIGNAL_BUY);
  659. Sell[i] = 0;
  660. }
  661. else if(indicator1==SIGNAL_SELL)
  662. {
  663. Sell[i] = high[i] + Range(i);
  664. if(AlertsOn && prev_calculated>0)
  665. AlertsHandle(time[0],SIGNAL_SELL);
  666. Buy[i] = 0;
  667. }
  668. else
  669. {
  670. Buy[i] = 0;
  671. Sell[i]= 0;
  672. }
  673. }
  674. else
  675. {
  676. if(indicator1==SIGNAL_BUY && indicator2==SIGNAL_BUY)
  677. {
  678. Buy[i] = low[i] - Range(i);
  679. if(AlertsOn && prev_calculated>0)
  680. AlertsHandle(time[0],SIGNAL_BUY);
  681. Sell[i] = 0;
  682. }
  683. else if(indicator1==SIGNAL_SELL && indicator2==SIGNAL_SELL)
  684. {
  685. Sell[i] = high[i] + Range(i);
  686. if(AlertsOn && prev_calculated>0)
  687. AlertsHandle(time[0],SIGNAL_SELL);
  688. Buy[i] = 0;
  689. }
  690. else
  691. {
  692. Buy[i] = 0;
  693. Sell[i]= 0;
  694. }
  695. }
  696. }
  697. //--- return value of prev_calculated for next call
  698. return(rates_total);
  699. }
  700. //+------------------------------------------------------------------+
  701. //| Custom indicator initialization function |
  702. //+------------------------------------------------------------------+
  703. void OnDeinit(const int reason)
  704. {
  705. //---check & delete labels
  706. if(ObjectFind(0,LabelBox)!=-1)
  707. ObjectDelete(0,LabelBox);
  708. if(ObjectFind(0,Label1)!=-1)
  709. ObjectDelete(0,Label1);
  710. if(ObjectFind(0,Label2)!=-1)
  711. ObjectDelete(0,Label2);
  712. if(ObjectFind(0,Label3)!=-1)
  713. ObjectDelete(0,Label3);
  714. if(ObjectFind(0,Label4)!=-1)
  715. ObjectDelete(0,Label4);
  716. IndicatorRelease(rangeHandle);
  717. IndicatorRelease(indHandle1);
  718. IndicatorRelease(indHandle2);
  719. return;
  720. }
  721. //+------------------------------------------------------------------+
  722. //| Average Range |
  723. //+------------------------------------------------------------------+
  724. double Range(int idx)
  725. {
  726. static double range[1];
  727. if(CopyBuffer(rangeHandle,0,idx+1,1,range)!=1)
  728. return(0.0);
  729. double avgRange = range[0];
  730. return(avgRange);
  731. }
  732. //+------------------------------------------------------------------+
  733. //| Moving Average |
  734. //+------------------------------------------------------------------+
  735. int iMA(const double &moav[],
  736. const double &high[],
  737. const double &low[],
  738. const double &close[])
  739. {
  740. int signal=SIGNAL_NONE;
  741. if(close[0]>moav[0] && low[0]<moav[0])
  742. signal=SIGNAL_BUY;
  743. if(close[0]<moav[0] && high[0]>moav[0])
  744. signal=SIGNAL_SELL;
  745. //---
  746. return(signal);
  747. }
  748. //+------------------------------------------------------------------+
  749. //| Moving Average Convergence/Divergence |
  750. //+------------------------------------------------------------------+
  751. int iMACD(const double &macd[],
  752. const double &sign[])
  753. {
  754. double currMacd = macd[1];
  755. double prevMacd = macd[0];
  756. double currSign = sign[1];
  757. double prevSign = sign[0];
  758. //---
  759. int signal=SIGNAL_NONE;
  760. if(currMacd>currSign && prevMacd<prevSign)
  761. signal=SIGNAL_BUY;
  762. if(currMacd<currSign && prevMacd>prevSign)
  763. signal=SIGNAL_SELL;
  764. //---
  765. return(signal);
  766. }
  767. //+------------------------------------------------------------------+
  768. //| Oscillator of Moving Averages |
  769. //+------------------------------------------------------------------+
  770. int iOsMA(const double &osma[])
  771. {
  772. ArraySetAsSeries(osma,true);
  773. double sum1 = 0.0;
  774. double sum2 = 0.0;
  775. for(int i=0,j=1;i<OsMASignal;i++,j++)
  776. {
  777. sum1 += osma[i];
  778. sum2 += osma[j];
  779. }
  780. double currOsma = osma[0];
  781. double prevOsma = osma[1];
  782. double currSign = sum1 / OsMASignal;
  783. double prevSign = sum2 / OsMASignal;
  784. //---
  785. int signal=SIGNAL_NONE;
  786. if(currOsma>currSign && prevOsma<prevSign)
  787. signal=SIGNAL_BUY;
  788. if(currOsma<currSign && prevOsma>prevSign)
  789. signal=SIGNAL_SELL;
  790. //---
  791. return(signal);
  792. }
  793. //+------------------------------------------------------------------+
  794. //| Stochastic Oscillator |
  795. //+------------------------------------------------------------------+
  796. int iStochastic(const double &stoc[],
  797. const double &sign[])
  798. {
  799. double currStoc = stoc[1];
  800. double prevStoc = stoc[0];
  801. double currSign = sign[1];
  802. double prevSign = sign[0];
  803. //---
  804. int signal=SIGNAL_NONE;
  805. if(currStoc>currSign && prevStoc<prevSign)
  806. signal=SIGNAL_BUY;
  807. if(currStoc<currSign && prevStoc>prevSign)
  808. signal=SIGNAL_SELL;
  809. //---
  810. return(signal);
  811. }
  812. //+------------------------------------------------------------------+
  813. //| Relative Strength Index |
  814. //+------------------------------------------------------------------+
  815. int iRSI(const double &rsi[])
  816. {
  817. ArraySetAsSeries(rsi,true);
  818. double sum1 = 0.0;
  819. double sum2 = 0.0;
  820. for(int i=0,j=1;i<RSISignal;i++,j++)
  821. {
  822. sum1 += rsi[i];
  823. sum2 += rsi[j];
  824. }
  825. double currRsi = rsi[0];
  826. double prevRsi = rsi[1];
  827. double currSig = sum1 / RSISignal;
  828. double prevSig = sum2 / RSISignal;
  829. //---
  830. int signal=SIGNAL_NONE;
  831. if(currRsi>currSig && prevRsi<prevSig)
  832. signal=SIGNAL_BUY;
  833. if(currRsi<currSig && prevRsi>prevSig)
  834. signal=SIGNAL_SELL;
  835. //---
  836. return(signal);
  837. }
  838. //+------------------------------------------------------------------+
  839. //| Commodity Channel Index |
  840. //+------------------------------------------------------------------+
  841. int iCCI(const double &cci[])
  842. {
  843. double currCci = cci[1];
  844. double prevCci = cci[0];
  845. double level[3] = {-100,0,100};
  846. //---
  847. int signal=SIGNAL_NONE;
  848. for(int i=0;i<3;i++)
  849. {
  850. if(currCci>level[i] && prevCci<=level[i])
  851. {
  852. signal=SIGNAL_BUY;
  853. break;
  854. }
  855. if(currCci<level[i] && prevCci>=level[i])
  856. {
  857. signal=SIGNAL_SELL;
  858. break;
  859. }
  860. }
  861. //---
  862. return(signal);
  863. }
  864. //+------------------------------------------------------------------+
  865. //| Relative Vigor Index |
  866. //+------------------------------------------------------------------+
  867. int iRVI(const double &rvi[],
  868. const double &sig[])
  869. {
  870. double currRvi = rvi[1];
  871. double prevRvi = rvi[0];
  872. double currSig = sig[1];
  873. double prevSig = sig[0];
  874. //---
  875. int signal=SIGNAL_NONE;
  876. if(currRvi>currSig && prevRvi<prevSig)
  877. signal=SIGNAL_BUY;
  878. if(currRvi<currSig && prevRvi>prevSig)
  879. signal=SIGNAL_SELL;
  880. //---
  881. return(signal);
  882. }
  883. //+------------------------------------------------------------------+
  884. //| Average Directional Movement Index |
  885. //+------------------------------------------------------------------+
  886. int iADX(const double &Adx[],
  887. const double &pdi[],
  888. const double &mdi[])
  889. {
  890. bool adx = Adx[0] < 25;
  891. double currPdi = pdi[1];
  892. double prevPdi = pdi[0];
  893. double currMdi = mdi[1];
  894. double prevMdi = mdi[0];
  895. //---
  896. int signal=SIGNAL_NONE;
  897. if(adx && currPdi>currMdi && prevPdi<prevMdi)
  898. signal=SIGNAL_BUY;
  899. if(adx && currPdi<currMdi && prevPdi>prevMdi)
  900. signal=SIGNAL_SELL;
  901. //---
  902. return(signal);
  903. }
  904. //+------------------------------------------------------------------+
  905. //| Triple Exponential Moving Averages |
  906. //+------------------------------------------------------------------+
  907. int iTriX(const double &trix[])
  908. {
  909. ArraySetAsSeries(trix,true);
  910. double sum1 = 0.0;
  911. double sum2 = 0.0;
  912. for(int i=0,j=1;i<TrixSignal;i++,j++)
  913. {
  914. sum1 += trix[i];
  915. sum2 += trix[j];
  916. }
  917. double currTrix = trix[0];
  918. double prevTrix = trix[1];
  919. double currSign = sum1 / TrixSignal;
  920. double prevSign = sum2 / TrixSignal;
  921. //---
  922. int signal=SIGNAL_NONE;
  923. if(currTrix>currSign && prevTrix<prevSign)
  924. signal=SIGNAL_BUY;
  925. if(currTrix<currSign && prevTrix>prevSign)
  926. signal=SIGNAL_SELL;
  927.  
  928. //---
  929. return(signal);
  930. }
  931. //+------------------------------------------------------------------+
  932. //| Bollinger Bands |
  933. //+------------------------------------------------------------------+
  934. int iBands(const double &midle[],
  935. const double &upper[],
  936. const double &lower[],
  937. const double &high[],
  938. const double &low[],
  939. const double &close[])
  940. {
  941. int signal=SIGNAL_NONE;
  942. if((low[0]<lower[0] && close[0]>lower[0]) ||
  943. (low[0]<midle[0] && close[0]>midle[0]))
  944. signal=SIGNAL_BUY;
  945. if((high[0]>upper[0] && close[0]<upper[0]) ||
  946. (high[0]>midle[0] && close[0]<midle[0]))
  947. signal=SIGNAL_SELL;
  948. //---
  949. return(signal);
  950. }
  951. //+------------------------------------------------------------------+
  952. //| Alerts Handle |
  953. //+------------------------------------------------------------------+
  954. void AlertsHandle(const datetime &time,
  955. const ENUM_SIGNAL alert_type)
  956. {
  957. static datetime timeCurr;
  958. static ENUM_SIGNAL typeCurr;
  959. string alertMessage;
  960. double price = 0.0;
  961. if(SymbolInfoTick(_Symbol,tick))
  962. price = tick.bid;
  963.  
  964. bool AlertDelay() {
  965. static datetime last_time;
  966. if (TimeCurrent()-last_time<60) { // delay for 60 seconds
  967. return(false);
  968. } else {
  969. last_time=TimeCurrent();
  970. return(true);
  971. }
  972. }
  973.  
  974. if (AlertDelay()) Alert("AlertsMessage");
  975.  
  976. if(timeCurr!=time || typeCurr!=alert_type)
  977. {
  978. timeCurr = time;
  979. typeCurr = alert_type;
  980. alertMessage = StringFormat("%s @ %s %s @ %s",_Symbol,TimeToString(TimeLocal(),TIME_SECONDS),
  981. StringSubstr(EnumToString(alert_type),7),DoubleToString(price,_Digits));
  982. if(AlertsMessage)
  983. SendNotification(alertMessage);
  984. if(AlertsEmail)
  985. SendMail(_Symbol+" Arrow Alert",alertMessage);
  986. if(AlertsSound)
  987. PlaySound("alert2.wav");
  988. }
  989. }
  990. //+------------------------------------------------------------------+
Add Comment
Please, Sign In to add comment