//+------------------------------------------------------------------+ //| sAccelerator.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" //---- indicator settings #property indicator_separate_window #property indicator_buffers 3 #property indicator_color1 Black #property indicator_color2 Green #property indicator_color3 Red //---- indicator buffers double ExtBuffer0[]; double ExtBuffer1[]; double ExtBuffer2[]; double ExtBuffer3[]; double ExtBuffer4[]; // Номер бара, по которому будет искаться сигнал #define SIGNAL_BAR 1 //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { //---- 2 additional buffers are used for counting. IndicatorBuffers(5); //---- drawing settings SetIndexStyle(0, DRAW_NONE); SetIndexStyle(1, DRAW_HISTOGRAM); SetIndexStyle(2, DRAW_HISTOGRAM); IndicatorDigits(Digits + 2); SetIndexDrawBegin(0, 38); SetIndexDrawBegin(1, 38); SetIndexDrawBegin(2, 38); //---- 4 indicator buffers mapping SetIndexBuffer(0, ExtBuffer0); SetIndexBuffer(1, ExtBuffer1); SetIndexBuffer(2, ExtBuffer2); SetIndexBuffer(3, ExtBuffer3); SetIndexBuffer(4, ExtBuffer4); //---- name for DataWindow and indicator subwindow label IndicatorShortName("sAC"); SetIndexLabel(1, NULL); SetIndexLabel(2, NULL); //---- initialization done return(0); } //+------------------------------------------------------------------+ //| Accelerator/Decelerator Oscillator | //+------------------------------------------------------------------+ int start() { int limit; int counted_bars = IndicatorCounted(); double prev, current; //---- last counted bar will be recounted if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; //---- macd counted in the 1-st additional buffer for(int i = 0; i < limit; i++) ExtBuffer3[i] = iMA(NULL, 0, 5, 0, MODE_SMA, PRICE_MEDIAN, i) - iMA(NULL, 0, 34, 0, MODE_SMA, PRICE_MEDIAN, i); //---- signal line counted in the 2-nd additional buffer for(i = 0; i < limit; i++) ExtBuffer4[i] = iMAOnArray(ExtBuffer3, Bars, 5, 0, MODE_SMA, i); //---- dispatch values between 2 buffers bool up = true; for(i = limit - 1; i >= 0; i--) { current = ExtBuffer3[i] - ExtBuffer4[i]; prev = ExtBuffer3[i+1] - ExtBuffer4[i+1]; if(current > prev) up = true; if(current < prev) up = false; if(!up) { ExtBuffer2[i] = current; ExtBuffer1[i] = 0.0; } else { ExtBuffer1[i] = current; ExtBuffer2[i] = 0.0; } ExtBuffer0[i] = current; } //---- done //---- Статические переменные, в которых хранятся //---- время последнего бара и направление последнего сигнала static int PrevSignal = 0, PrevTime = 0; //---- Если баром для анализа выбран не 0-й, нам нет смысла проверять сигнал //---- несколько раз. Если не начался новый бар, выходим. if(SIGNAL_BAR > 0 && Time[0] <= PrevTime ) return(0); //---- Отмечаем, что этот бар проверен PrevTime = Time[0]; //---- Если предыдущий сигнал был СЕЛЛ или это первый запуск (PrevSignal=0) if(PrevSignal <= 0) { if(ExtBuffer0[SIGNAL_BAR] - ExtBuffer0[SIGNAL_BAR+1] > 0 && ExtBuffer0[SIGNAL_BAR+2] - ExtBuffer0[SIGNAL_BAR+1] > 0 ) { PrevSignal = 1; Alert("sAC (", Symbol(), ", ", Period(), ") - BUY!!!"); } } if(PrevSignal >= 0) { if(ExtBuffer0[SIGNAL_BAR+1] - ExtBuffer0[SIGNAL_BAR] > 0 && ExtBuffer0[SIGNAL_BAR+1] - ExtBuffer0[SIGNAL_BAR+2] > 0) { PrevSignal = -1; Alert("sAC (", Symbol(), ", ", Period(), ") - SELL!!!"); } } return(0); } //+------------------------------------------------------------------+