MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5

Библиотека исходного кода - эксперты, индикаторы и скрипты

Возникли проблемы и есть вопросы по написанию торговых стратегий? На форуме тебе помогут
Авторизуйтесь или зарегистрируйтесь, чтобы добавить новый код

Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят

Понравился скрипт?
Оцени его работу в терминале MetaTrader 5

2013.05.28 06:18
Pattern_v_1_01

Pattern_v_1_01 - индикатор для MetaTrader 4

Просмотров:
3450
Рейтинг:
//+------------------------------------------------------------------+
//|                             Copyright © 2010                     |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Gold
#property indicator_color2 LightBlue
//---- input parameters
extern int        BarsBefore=2;        // Баров до...
extern int        BarsAfter=2;         // Баров после
extern int        Width=2;             // Размер значка
extern int        BarsToProcess=100;   // Количество баров для поиска
//---- buffers
double FractUpBuffer1[];
double FractDnBuffer2[];
string sy, Prefix, NameIND;
int    tf;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
{
//---- indicators
   SetIndexStyle(0,DRAW_ARROW,EMPTY,0);
   SetIndexBuffer(0,FractUpBuffer1);
   SetIndexArrow(0,119);
   SetIndexLabel(0,"Fractal Up");
   SetIndexEmptyValue(0,0.0);
   
   SetIndexStyle(1,DRAW_ARROW,EMPTY,0);
   SetIndexBuffer(1,FractDnBuffer2);
   SetIndexArrow(1,119);
   SetIndexLabel(1,"Fractal Dn");
   SetIndexEmptyValue(1,0.0);
//----
   NameIND="Pattern_v1_01";
   IndicatorShortName(NameIND+"_"+GetNameTF(Period()));
   Prefix=NameIND+"_"+GetNameTF(Period());    // Префикс для имён объектов
   sy=Symbol();
   tf=Period();
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
{
// -------- Блок удаления всех объектов, построенных на графике --------
   string Name_Del[1]; 
   int Quant_Del=0;                    
   int Quant_Objects=ObjectsTotal();   
   int LenPref=StringLen(Prefix);
   ArrayResize(Name_Del,Quant_Objects);
   for(int k=0; k<Quant_Objects; k++) {
      string Obj_Name=ObjectName(k);   
      string Head=StringSubstr(Obj_Name,0,LenPref);
      if (Head==Prefix) {                              
         Quant_Del+=1;        
         Name_Del[Quant_Del-1]=Obj_Name;
         }
     }
   for(int i=0; i<Quant_Del; i++)    
      ObjectDelete(Name_Del[i]); 
// ----- Конец блока удаления всех объектов, построенных на графике -----
   return(0);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start() {
   int   counted_bars=IndicatorCounted();
   int   i, k, j, limit;
//----
   if(counted_bars>0)      counted_bars--;
   limit=Bars-counted_bars;
   if(limit>BarsToProcess) limit=BarsToProcess;
   
//   if (limit>0) 
      FindUpFractals(BarsBefore, BarsAfter);
      FindDnFractals(BarsBefore, BarsAfter);
   
//----
   return(0);
}
//==============================================================================
// --------------------------------- Функции ----------------------------------+
//==============================================================================
int FindDnFractals(int nl, int nr) {
   int      i, k, nb;
   double   fractal;
   datetime tm;
   string   nm;
   bool     fl, fr;
   int delta=SetDistance(Period());
   for (i=BarsToProcess; i>0; i--) {
      fl=false;
      FractDnBuffer2[i]=0;
      if (Open[i]<Close[i]) {                   
         for (k=1; k<=nl; k++) {
            if (Open[i+k]>Close[i+k]) fl=true;
            else { fl=false; break; }
            }
         if (!fl || Open[i+nl+1]>Close[i+nl+1]) continue;
         fr=false;
         for (k=0; k<nr; k++) {
            if (Open[i-k]<Close[i-k]) fr=true;
            else { fr=false; break; }
            }
         if (!fr || Open[i-nr]<Close[i-nr] || iBarShift(sy,tf,Time[i-nr])==0) continue;
         if (Low[i]<Low[i+1]) { fractal=Low[i]; nb=i; tm=Time[i];}
         else { fractal=Low[i+1]; nb=i+1; tm=Time[i+1]; }
         FractDnBuffer2[nb]=fractal;
         nm=Prefix+"_Down_Fractal_"+nl+"/"+nr+"_"+TimeToStr(tm);
         fractal=MathMin(Low[i], Low[i+1]);
         SetArrow(218, LightBlue, nm, tm, fractal-delta*Point, Width);
         WindowRedraw();
         }
      }
   return(0);
}   
//+----------------------------------------------------------------------------+
int FindUpFractals(int nl, int nr) {
   int      i, k, nb;
   double   fractal;
   datetime tm;
   string   nm;
   bool     fl, fr;
   int delta=SetDistance(Period());
   for (i=BarsToProcess; i>0; i--) {
      fl=false;
      FractUpBuffer1[i]=0;
      if (Open[i]>Close[i]) {                   
         for (k=1; k<=nl; k++) {
            if (Open[i+k]<Close[i+k]) fl=true;
            else { fl=false; break; }
            }
         if (!fl || Open[i+nl+1]<Close[i+nl+1]) continue;
         fr=false;
         for (k=0; k<nr; k++) {
            if (Open[i-k]>Close[i-k]) fr=true;
            else { fr=false; break; }
            }
         if (!fr || Open[i-nr]>Close[i-nr] || iBarShift(sy,tf,Time[i-nr])==0) continue;
         if (High[i]>High[i+1]) { fractal=High[i]; nb=i; tm=Time[i];}
         else { fractal=High[i+1]; nb=i+1; tm=Time[i+1]; }
         FractUpBuffer1[nb]=fractal;
         nm=Prefix+"_Up_Fractal_"+nl+"/"+nr+"_"+TimeToStr(tm);
         fractal=MathMax(High[i], High[i+1]);
         SetArrow(217, PaleGoldenrod, nm, tm, fractal+4*delta*Point, Width);
         WindowRedraw();
         }
      }
   return(0);
}   
//+----------------------------------------------------------------------------+
string GetNameTF(int TimeFrame=0) {
   switch (TimeFrame) {
      case PERIOD_M1:  return("M1");
      case PERIOD_M5:  return("M5");
      case PERIOD_M15: return("M15");
      case PERIOD_M30: return("M30");
      case PERIOD_H1:  return("H1");
      case PERIOD_H4:  return("H4");
      case PERIOD_D1:  return("Daily");
      case PERIOD_W1:  return("Weekly");
      case PERIOD_MN1: return("Monthly");
      default:         return("UnknownPeriod");
      }
}
//+----------------------------------------------------------------------------+
int SetDistance(int TimeFrame) {
   switch (TimeFrame) {
      case PERIOD_M1:  return(1);
      case PERIOD_M5:  return(1);
      case PERIOD_M15: return(2);
      case PERIOD_M30: return(3);
      case PERIOD_H1:  return(4);
      case PERIOD_H4:  return(4);
      case PERIOD_D1:  return(4);
      case PERIOD_W1:  return(4);
      case PERIOD_MN1: return(4);
      default:         return(0);
      }
}
//+----------------------------------------------------------------------------+
void SetArrow(int cd, color cl, string nm, datetime t1=0, double p1=0, int sz=0) {
   if (ObjectFind(nm)<0) ObjectCreate(nm, OBJ_ARROW, 0, 0, 0);
   ObjectSet(nm, OBJPROP_TIME1    , t1);
   ObjectSet(nm, OBJPROP_PRICE1   , p1);
   ObjectSet(nm, OBJPROP_ARROWCODE, cd);
   ObjectSet(nm, OBJPROP_COLOR    , cl);
   ObjectSet(nm, OBJPROP_WIDTH    , sz);
}
//+----------------------------------------------------------------------------+

 Выше исходный код индикатора.

Суть в комбинации баров. Настройки могут быть следующими:

Вверх - Бай:
  • Бычьи = 0, Значение
  • Медвежьи = 0, Значение
  • Цвет
  • Толщина линии
Вниз - Селл:
  • Медвежьи = 0, Значение
  • Бычьи = 0, Значение
  • Цвет
  • Толщина линии

Например, 1 бар вверх и 2 вниз, 1 вверх и 3 вниз, далее 1/4, 1/5, 1/6, 1/7 и т.д. для Селл. Для Бай - 1 бар вниз и 2 бара вверх, 1 вниз и 3 вверх, дальше 1/4, 1/5 и т.д.

Например, возьмем комбинацию баров 3 вверх и 7 вниз ( 3/7 сокращенно ) для Селл. Берем значение наивысшей цены 3-его бара и наинизшую цену 7-ого бара и рисуем фрактал.

Дальше можно написать советник по этому индикатору и проверить результат.