Смотри, как бесплатно скачать роботов
Ищи нас в Telegram!
Ставь лайки и следи за новостями
Интересный скрипт?
Поставь на него ссылку - пусть другие тоже оценят
Понравился скрипт?
Оцени его работу в терминале MetaTrader 5
Скрипты

KeyFinder 2.0 - скрипт для MetaTrader 5

Просмотров:
6180
Рейтинг:
(37)
Опубликован:
2015.02.16 16:09
Обновлен:
2016.11.22 07:33
Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу

Скрипт находит и размечает на графике опорные точки Демарка и указывает их размерность.

Этот скрипт по сути своей несет тот же функционал, что и KeyFinder и внешних отличий вы практически не найдете, за исключением кнопки, удаляющей скрипт и все созданные им объекты с графика.

Рис 1. График фьючерса на индекс РТС с примененным скриптом KeyFinder 2.0

Рис 1. График фьючерса на индекс РТС с примененным скриптом KeyFinder 2.0

И если внешне и по сути работа скрипта не претерпела изменений, то сам код был переработан существенно.

Для работы скрипта был создан класс CKeyFinder.

Рис 2. Класс CKeyFinder

Рис 2. Класс CKeyFinder

Ниже приведен сам код класса. Комментарии к коду я постарался дать как можно более подробные, поэтому, думаю, проблем возникнуть не должно.

//+------------------------------------------------------------------+
//|                                                    KeyFinder.mqh |
//|                                                   Trofimov Pavel |
//|                                               trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
//+------------------------------------------------------------------+
//| Class for KeyFinder 2.0                                          |
//+------------------------------------------------------------------+
class CKeyFinder
  {
private:
   // Переменные класса
   int               MinDimension;  //Минимальная размерность точек
   int               MaxBars;       //Количество обрабатываемых баров
protected:
   // Методы класса для внутреннего использования
   // Определение размерности верхних точек
   int               getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod);
   // Определение размерности нижних точек
   int               getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod);
public:
   // Конструктор класса
                     CKeyFinder();
   // Деструктор класса
                    ~CKeyFinder();
   // Метод-свойство - получения размерности   
   int               GetMinDimension();
   // Метод-свойство - задание размерности
   void              SetMinDimension(int temp_Val);
   // Метод-свойство - получения колличества баров для обработки
   int               GetMaxBars();
   // Метод-свойство - установления колличества баров для обработки
   void              SetMaxBars(int temp_Val);
   // Метод - нахождения верхних опорных точек
   void              FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[]);
   // Метод - нахождения нижних опорных точек
   void              FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[]);
   // Очистка графика от объектов скрипта.
   int               CleanChart();
  };
//+------------------------------------------------------------------+
//|                Определение размерности верхней точки             |
//+------------------------------------------------------------------+
int CKeyFinder::getHighDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)// Методу передаются массив данных типа MqlRates, номер обрабатываемого бара в массиве и максимальный индекс массива
  {
   int k=1;
   while((tmpRates[tmp_i].high>tmpRates[tmp_i+k].high) && (tmpRates[tmp_i].high>tmpRates[tmp_i-k].high) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++;
   if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1;
   return(k);
  };
//+------------------------------------------------------------------+
//|                Определение размерности нижней точки              |
//+------------------------------------------------------------------+
int CKeyFinder::getLowDimension(MqlRates &tmpRates[],int tmp_i,int tmp_iCod)// Методу передаются массив данных типа MqlRates, номер обрабатываемого бара в массиве и максимальный индекс массива
  {
   int k=1;
   while((tmpRates[tmp_i].low<tmpRates[tmp_i+k].low) && (tmpRates[tmp_i].low<tmpRates[tmp_i-k].low) && ((tmp_i+k)<(tmp_iCod)) && ((tmp_i-k)>0)) k++;
   if(((tmp_i+k)==tmp_iCod) || ((tmp_i-k)==0)) k=-1;
   return(k);
  };
//+------------------------------------------------------------------+
//| Method GetMinDimension                                           |
//+------------------------------------------------------------------+
int CKeyFinder::GetMinDimension(){return(MinDimension);};
//+------------------------------------------------------------------+
//| Method SetMinDimension                                           |
//+------------------------------------------------------------------+
void CKeyFinder::SetMinDimension(int temp_Val)
  {
   if(temp_Val>1) MinDimension=temp_Val;
   else
     {
      MessageBox("Задана слишком малая размерность."+"\n"+"Будет использована размерность по умолчанию - 5","Внимание!",MB_OK+MB_ICONWARNING);
      MinDimension=5;
     };
  };
//+------------------------------------------------------------------+
//| Method GetMaxBars                                                |
//+------------------------------------------------------------------+
int CKeyFinder::GetMaxBars() {return(MaxBars);};
//+------------------------------------------------------------------+
//| Method SetMaxBars                                                |
//+------------------------------------------------------------------+
void CKeyFinder::SetMaxBars(int temp_Val)
  {
//проверка доступности истории для установленного количества баров
   int SMaxBars=Bars(Symbol(),0);
   if(SMaxBars<temp_Val)
     {
      temp_Val=SMaxBars;//устанавливаем количество баров столько сколько доступно
      MessageBox("Параметр MaxBars задан слишком большим."+"\n"+"Для расчетов будет использовано "+IntegerToString(temp_Val)+" баров.","Внимание!",MB_OK+MB_ICONWARNING);
     };

//проверка, чтобы количество баров не было слишком маленьким
   if(temp_Val<(2*MinDimension))
     {
      MessageBox("Задано слишком малое количество баров."+"\n"+"Будет использовано количество по умолчанию - 300","Внимание!",MB_OK+MB_ICONWARNING);
      temp_Val=300;
     };
   MaxBars=temp_Val;
  };
//+------------------------------------------------------------------+
//| Method FindKeyPoints - Поиск верхних ключевых точек              |
//+------------------------------------------------------------------+
void CKeyFinder::FindUpKeyPoints(int temp_iCod,MqlRates &temp_rates[])// Методу передаются индекс максимального элемента массива MqlRates и сам массив
  {
   int HD=1;   //инициадизируем размерность точек
   for(int i=temp_iCod-MinDimension; i>(MinDimension-1); i--)//цикл по барам от конечного - MinDimension до нулевого + MinDimension
     {
      HD=getHighDimension(temp_rates,i,temp_iCod);//получаем размерность точек
      if((HD>=MinDimension) || (HD==-1))
        {//создаем марку если попадает под условия MinDimension
         string Ob_Name="KF_Label"+IntegerToString(i);
         if(HD!=-1)
           {
            ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].high);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_LOWER);
            ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(HD));
            ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
           }
         else
           { //Если не можем определить размерность маркируем шариком
            ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].high);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
            ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_BOTTOM);
            ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrRed);
           };
        };
     };
  };
//+------------------------------------------------------------------+
//| Method FindLowKeyPoints - Поиск нижних ключевых точек            |
//+------------------------------------------------------------------+   
void CKeyFinder::FindLowKeyPoints(int temp_iCod,MqlRates &temp_rates[])// Методу передаются индекс максимального элемента массива MqlRates и сам массив
  {
   int LD=1;//инициализируем размерность точек
   bool iCreate;
   for(int i=temp_iCod-MinDimension; i>(MinDimension-1); i--)//цикл по барам от конечного - MinDimension до нулевого + MinDimension
     {
      LD=getLowDimension(temp_rates,i,temp_iCod);
      if((LD>=MinDimension) || (LD==-1))
        {
         string Ob_Name="KF_Label"+IntegerToString(i)+"_1";//Страхуемся от баров где лой и хай могут быть ключевыми точками
         if(LD!=-1)
           {
            iCreate=ObjectCreate(0,Ob_Name,OBJ_TEXT,0,temp_rates[i].time,temp_rates[i].low);
            if(iCreate)
              {
               ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_UPPER);
               ObjectSetString(0,Ob_Name,OBJPROP_TEXT,0,IntegerToString(LD));
               ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
              }
            else Comment("Не могу создать объект");
           }
         else
           {
            iCreate=ObjectCreate(0,Ob_Name,OBJ_ARROW,0,temp_rates[i].time,temp_rates[i].low);
            if(iCreate)
              {
               ObjectSetInteger(0,Ob_Name,OBJPROP_ARROWCODE,0,159);
               ObjectSetInteger(0,Ob_Name,OBJPROP_ANCHOR,0,ANCHOR_TOP);
               ObjectSetInteger(0,Ob_Name,OBJPROP_COLOR,clrGreen);
              }
            else Comment("Не могу создать объект");
           };
        };
     };
  };
//+------------------------------------------------------------------+
//| Method CleanChart - очистка графика от объектов                  |
//+------------------------------------------------------------------+   
int CKeyFinder::CleanChart(void)
  {
   string Label="KF_Label";
   int obj_total=ObjectsTotal(0,0,-1),n=0;
   for(int obj=obj_total-1; obj>=0; obj--) //Очистка объектов, созданных скриптом производится по маске имени
     {
      string objname=ObjectName(0,obj,0,-1);
      if(StringFind(objname,Label)>=0) ObjectDelete(0,objname);
      n++;
     }
   return(n);
  }
//+------------------------------------------------------------------+
//| Конструктор класса                                               |
//+------------------------------------------------------------------+
CKeyFinder::CKeyFinder(){};
//+------------------------------------------------------------------+
//| Деструктор класса                                                |
//+------------------------------------------------------------------+
CKeyFinder::~CKeyFinder(){};
//+---------------------------------------------------------------------+

После того как основная часть кода была переведена в класс, код самого скрипта стал очень компактным.

//+------------------------------------------------------------------+
//|                                                   KeyFinder2.mq5 |
//|                                                   Trofimov Pavel |
//|                                               trofimovpp@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Trofimov Pavel"
#property link      "trofimovpp@mail.ru"
#property version   "2.00"
#property description "Внимание! Данный алгоритм использует в расчетах циклы!"
#property description "Настоятельно рекомендуется задавать для обработки не более 1000 баров!"
#property script_show_inputs
//--- input parameters
input int      MinDimesion=5; //Минимальная размерность точек
input int      MaxBars=300;   //Количество обрабатываемых баров
#include       "KeyFinder.mqh"
#include       <ChartObjects\ChartObjectsTxtControls.mqh>
//+------------------------------------------------------------------+
//| Script variables                                                 |
//+------------------------------------------------------------------+
CKeyFinder           m_keyfinder;      //Объявляем переменную класса СKeyFinder
CChartObjectButton   m_button_close;   //Объявляем переменную класса CChartObjectButton
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//-Инициализация переменных
   MqlRates  rates_array[];
   string Com="\n\n\n";
   int iCod=CopyRates(Symbol(),Period(),0,MaxBars,rates_array);//количество элементов массива MqlRates, которые удалось скопировать
   int sy=10;//позиция кнопки
   if(ChartGetInteger(0,CHART_SHOW_OHLC))
      sy+=16;
//-Задание параметров необходимых для работы класса   
   m_keyfinder.SetMaxBars(MaxBars);
   m_keyfinder.SetMinDimension(MinDimesion);
   m_keyfinder.CleanChart();//Очистка графика от объектов при повтороном применении
   iCod=iCod-1;//Индекс максимального элемента в массиве rates_array[]
   Com+="Работаю...Ждите!";
//-Создание кнопки и задание ее свойств
   m_button_close.Create(0,"ButtonClose",0,10,sy,100,20);
   m_button_close.Description("Close Script");
   m_button_close.Color(Blue);
   m_button_close.FontSize(8);
   Comment(Com);
//-Обработка баров с использованием методов класса CKeyFinder   
   if(iCod>0)
     {
      m_keyfinder.FindUpKeyPoints(iCod,rates_array);//Поиск верхних ключевых точек
      Com+="\nОбработаны верхние точки.\n";
      Comment(Com);
      m_keyfinder.FindLowKeyPoints(iCod,rates_array);//Поиск нижних ключевых точек
      Comment("\n\n\nОбработка завершена");
     }
   else Comment("\n\n\nОтсутствуют бары для обработки!!!");
   m_button_close.State(false);
//-Зацикливаем скрипт до нажатия кнопки
   while(!(m_button_close.State()))
     {
      //--- redraw chart
      ChartRedraw();
      Sleep(250);
     };
//-Очищаем график по нажатию кнопки
   m_keyfinder.CleanChart();
   Comment("");
  }
//+------------------------------------------------------------------+

Ну и под конец, чтобы предупредить возникновение вопросов приведу ряд полезных ссылок и объяснений:

  • Как загрузить код прямо из редактора MetaEditor
  • Чтобы использовать скрипт в MetaTrader 4 необходимо переименовать файл KeyFinder2.mq5 в файл с расширением mq4 и перекомпилировать его в редакторе MetaEditor. Файл KeyFinder.mqh, содержащий код класса должен находиться в одной папке (MQL5\Scripts, например) с файлом самого скрипта.

Жду ваших замечаний, отзывов и предложений. Удачных торгов!


KeyLevels KeyLevels

Индикатор ценовых уровней круглых чисел: 00, 20, 50, 80.

Ilan 1.6 Dynamic HT Ilan 1.6 Dynamic HT

Легендарный Ilan 1.6 Dynamic относится к серии так называемых "усреднителей". Благодаря своим продвинутым формулам управления капиталом, он позволяет выходить даже из заведомо убыточной позиции в плюс. Теперь Ilan 1.6 Dynamic доступен в исходных кодах для MetaTrader 5.

Back to the Future Back to the Future

Анализ рынка по регулятору.

ind_aMU ind_aMU

Индикатор указывает на трендовые и боковые (флет) движения цены.