//+------------------------------------------------------------------+
//| Supertrend.mq4 |
//| Copyright © 2005, Jason Robinson (jnrtrading). |
//| http://www.jnrtrading.co.uk |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Jason Robinson (jnrtrading)."
#property link "http://www.jnrtrading.co.uk"
#property strict
//#property indicator_chart_window
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_width1 2
#property indicator_width2 2
extern int History = 750; // История
extern int CCIperiod =50;
extern int ATRperiod =5;
extern int applied_price=5;
extern int SIGNAL_BAR = 2; //Номер бара, на котором будет искаться изменение сигнала //Alen_T
//= 1 - пропускает иногда сигналы (из-за перерисовки)
extern bool B_S_B = true; // Чередование сигналов, иначе все - подряд
extern bool Arr_show = true; // Отображение стрелок
extern int Arr_width = 1; // Размер стрелок
extern string ID = "Supertrend_arrows";// Идентификатор
extern double arrowsUpperGap = 0.5; // Отступ верхних стрелок
extern double arrowsLowerGap = 0.5; // Отступ нижних стрелок
extern color arrowsUpColor = clrRed;// Цвет верхних стрелок
extern color arrowsDnColor = clrLime; // Цвет нижних стрелок
extern int arrowsUpCode = 234; // Код верхних стрелок
extern int arrowsDnCode = 233; // Код нижних стрелок
double TrLine[];
double trend[];
double TrendUp[];
double TrendDown[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
IndicatorBuffers(4);
SetIndexStyle(0, DRAW_HISTOGRAM);
SetIndexBuffer(0, TrendUp);
SetIndexLabel(0,"Trend Up");
SetIndexStyle(1, DRAW_HISTOGRAM);
SetIndexBuffer(1, TrendDown);
SetIndexLabel(1,"Trend Down");
SetIndexBuffer(2, TrLine);
SetIndexBuffer(3, trend);
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
ObjectDelete(ID+"Supertrend_arr_up");
ObjectDelete(ID+"Supertrend_arr_dn");
//----
return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int start()
{
int limit, i;
double cciTrendNow;
int counted_bars = IndicatorCounted();
//---- check for possible errors
if(counted_bars < 0) return(-1);
//---- last counted bar will be recounted
if(counted_bars > 0) counted_bars--;
limit=Bars-counted_bars;
if (limit > History)
{
limit = History;
}
for(i = limit; i >= 0; i--)
{cciTrendNow = iCCI(NULL, 0, CCIperiod, applied_price, i);
if (cciTrendNow >= 0)
{TrLine[i] = NormalizeDouble(Low[i] - iATR(NULL, 0, ATRperiod, i),Digits);
if (TrLine[i] < TrLine[i+1])
{TrLine[i] = TrLine[i+1];
}
}
else if (cciTrendNow <= 0) {
TrLine[i] = NormalizeDouble(High[i] + iATR(NULL, 0, ATRperiod, i),Digits);
if (TrLine[i] > TrLine[i+1]) {
TrLine[i] = TrLine[i+1];
}
}
}
for (i=limit; i>=0; i--)
{
trend[i] = trend[i+1];
if (TrLine[i]> TrLine[i+1]) trend[i] =1;
if (TrLine[i]< TrLine[i+1]) trend[i] =-1;
if (trend[i]>0)
{ TrendUp[i] = TrLine[i];
if (trend[i+1]<0) TrendUp[i+1]=TrLine[i+1];
TrendDown[i] = EMPTY_VALUE;
}
else
if (trend[i]<0)
{
TrendDown[i] = TrLine[i];
if (trend[i+1]>0) TrendDown[i+1]=TrLine[i+1];
TrendUp[i] = EMPTY_VALUE;
}
//-------------------------------------------------------------------+
if(Arr_show)
{
if(TrendUp[i] != EMPTY_VALUE && TrendUp[i+1] == EMPTY_VALUE)
drawArrow(i,"Supertrend_arr_up",arrowsUpColor,arrowsUpCode,Arr_width,false);
else ObjectDelete(ID+"Supertrend_arr_up"+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
if(TrendDown[i] != EMPTY_VALUE && TrendDown[i+1] == EMPTY_VALUE)
drawArrow(i,"Supertrend_arr_dn",arrowsDnColor,arrowsDnCode,Arr_width,true);
else ObjectDelete(ID+"Supertrend_arr_dn"+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS));
}
//-------------------------------------------------------------------+
}
static int PrevSignal = 0;
static datetime PrevTime = 0;
//---- Если баром для анализа выбран не 0-й, нам нет смысла проверять сигнал
//---- несколько раз. Если не начался новый бар, выходим.
if(SIGNAL_BAR > 0 && Time[0] <= PrevTime )
return(0);
//---- Отмечаем, что этот бар проверен
PrevTime = Time[0];
//---- Если предыдущий сигнал был СЕЛЛ или это первый запуск (PrevSignal=0)
if(PrevSignal <= 0 || !B_S_B)
{
if (TrendUp[SIGNAL_BAR]!= EMPTY_VALUE && TrendUp[SIGNAL_BAR+1] == EMPTY_VALUE)
{
PrevSignal = 1;
Alert("Supertrend ",Period()," ",Symbol()," BUY");
// Print("MTF_Supertrend (", Symbol(), ", ", Period(), ") - BUY!!!"); //Вывод в журнал
// Comment("MTF_Supertrend (", Symbol(), ", ", Period(), ") - BUY!!!"); //Вывод на экран
// PlaySound("Alert.wav"); //Проигрывание сигнала
}
}
if(PrevSignal >= 0 || !B_S_B)
{
if (TrendDown[SIGNAL_BAR] != EMPTY_VALUE && TrendDown[SIGNAL_BAR+1] == EMPTY_VALUE)
{
PrevSignal = -1;
Alert("Supertrend ",Period()," ",Symbol()," SELL");
// Print("MTF_Supertrend (", Symbol(), ", ", Period(), ") - SELL!!!");
// Comment("MTF_Supertrend (", Symbol(), ", ", Period(), ") - SELL!!!");
// PlaySound("Alert.wav");
}
}
//----
return(0);
}
//+------------------------------------------------------+
//---------------------------------------------------------------------+
void drawArrow(int i,string N,color theColor,int theCode, int ArrowSize,bool up)
{
string name = ID+N+TimeToStr(Time[i],TIME_DATE|TIME_SECONDS);
double gap = iATR(NULL,0,20,i);
//
//
//
//
//
ObjectCreate(name,OBJ_ARROW,0,Time[i],0);
ObjectSet (name,OBJPROP_ARROWCODE,theCode);
ObjectSet (name,OBJPROP_COLOR,theColor);
ObjectSet (name, OBJPROP_WIDTH,ArrowSize);
if (up)
ObjectSet(name,OBJPROP_PRICE1,Low[i] - arrowsLowerGap * gap);
else ObjectSet(name,OBJPROP_PRICE1,High[i] + arrowsUpperGap * gap);
}
//---------------------------------------------------------------------+