Ставь лайки и следи за новостями
Поставь на него ссылку - пусть другие тоже оценят
Оцени его работу в терминале MetaTrader 5
KeyFinder 2.0 - скрипт для MetaTrader 5
- Просмотров:
- 6284
- Рейтинг:
- Опубликован:
- 2015.02.16 16:09
- Обновлен:
- 2016.11.22 07:33
- Нужен робот или индикатор на основе этого кода? Закажите его на бирже фрилансеров Перейти на биржу
Скрипт находит и размечает на графике опорные точки Демарка и указывает их размерность.
Этот скрипт по сути своей несет тот же функционал, что и KeyFinder и внешних отличий вы практически не найдете, за исключением кнопки, удаляющей скрипт и все созданные им объекты с графика.
Рис 1. График фьючерса на индекс РТС с примененным скриптом KeyFinder 2.0
И если внешне и по сути работа скрипта не претерпела изменений, то сам код был переработан существенно.
Для работы скрипта был создан класс 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, например) с файлом самого скрипта.
Жду ваших замечаний, отзывов и предложений. Удачных торгов!
Индикатор ценовых уровней круглых чисел: 00, 20, 50, 80.
Ilan 1.6 Dynamic HTЛегендарный Ilan 1.6 Dynamic относится к серии так называемых "усреднителей". Благодаря своим продвинутым формулам управления капиталом, он позволяет выходить даже из заведомо убыточной позиции в плюс. Теперь Ilan 1.6 Dynamic доступен в исходных кодах для MetaTrader 5.
Анализ рынка по регулятору.
ind_aMUИндикатор указывает на трендовые и боковые (флет) движения цены.