English 中文 Español Deutsch 日本語 Português
Графическое управление внешними параметрами индикаторов

Графическое управление внешними параметрами индикаторов

MetaTrader 4Примеры | 26 мая 2009, 06:17
4 624 12
Vladimir
Vladimir

Введение

Сколько раз вам приходится переключать или настраивать внешние параметры индикаторов? Наверное, многим приходила мысль вынести эти параметры на график, чтобы мышкой перетащить значок или указатель, с целью упрощения процедуры настройки индикатора. Возможности языка MQL4 позволяют осуществить вывод настроек индикатора на экран.


Графическое управление параметрами

Первое, что нам будет необходимо, – это узнать, какие переменные есть у нашего индикатора и какие мы будем изменять. Для этого открываем свойства индикатора и записываем наименования тех параметров, которые потребуют изменения в процессе работы.

Для примера используем индикатор ZigZag стандартной поставки метатрейдера. В свойствах выберем названия переменных.

Параметры индикатора

  • ExtDepth=12
  • ExtDeviation=5
  • ExtBackstep=3

Далее создаем в нашем будущем устройстве управления переменные и массивы, с помощью которых мы будем изменять значения параметров индикатора.

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

// Первоначальные значения индикатора
int               ExtDepth=12;
int               ExtDeviation=5;
int               ExtBackstep=3;
//---- indicator buffers
double            ZigzagBuffer[];
double            HighMapBuffer[];
double            LowMapBuffer[];
// Массив переменных параметров индикатора
string            ArrExt[3,3]    ={"12","21","34", "5","8","21", "3","13","34"};
// Массивы указателей
string            Array_Index[]={"Dep -> ","Dev -> ","Back ->"};
int               Coordinats_IndexUp[]={65,160,260};
int               Coordinats_Index[]  ={35,130,230};
int               Coordinats_IndexDn[]={5, 100,200};
// Цвет для блоков параметров и указателей
color             Color_[]={Blue,Green,Red};

Я думаю на этом этапе вопросов не возникнет.

"Dep -> ","Dev -> ","Back ->"

это соответственно ExtDepth, ЕxtDeviation и ExtBackstep. В таком виде будут отображены указатели на графике.

Для каждого параметра используем по три переменных значения

string            ArrExtDepth[]    ={"12","15","20"};
string            ArrExtDeviation[]={"5",  "8","21"};
string            ArrExtBackstep[] ={"3", "13","34"};

которые запакуем, для удобства в трехмерный массив:

string            ArrExt[3,3]    ={"12","21","34", "5","8","21", "3","13","34"};

3, 5, 12 - это стандартные величины, указанные по умолчанию в параметрах стандартного "Зиг-Зага".

Остальные величины приведены для примера. Они будут использованы в качестве переменных параметров для управления индикатором.

Учитывая то, что "рисовать" придется много, выделим в отдельный блок функцию создания и перемещения объектов:

void Obj_CreateMove_Text (int CreateMove, string Name, int Type, string Number,  color text_color, 
                          int DistX, int DistY)
   {
      if (CreateMove==0)
      ObjectCreate(Name,Type,0,0,0);
      ObjectSetText(Name,Number,10,"Arial",text_color);
      ObjectSet(Name,101,3);
      ObjectSet(Name, 102, DistX);
      ObjectSet(Name, 103, DistY);
   }

Для удобства управления и компактности кода все координаты графических объектов заносим в массивы. Это уже продемонстрировано выше (см. в начале статьи).

Теперь "нарисуем" в окне графика все объекты.

Правая часть графика у нас менее загружена, поэтому переменные выводим вертикально по правой границе окна. Для каждого параметра используем свой указатель, для чего сами переменные параметра и цвет указателя к этим переменным сделаем одного цвета.

Таким образом нам необходимо создать три указателя и три переменных значения к каждому параметру.

Создаем на экране значки параметров индикатора. Выводим числовые значения переменных этих параметров. И рядом для каждого блока параметров создаем соответствующие указатели.

// Строим объекты
   for( ii=0;ii<3;ii++)
      for( i=0;i<3;i++)
      Obj_CreateMove_Text (0, Array_Index[ii]+i, 23, (ArrExt[ii,i]), Color_[ii], 5, Coordinats_IndexDn[ii]+30*i);
      for( i=0;i<3;i++)
      Obj_CreateMove_Text (0, "Index"+Array_Index[i], 23, (Array_Index[i]),   Color_[i], 25, Coordinats_Index[i]);


Рисунок 1

Теперь нам остается создать сам блок обработки действий пользователя при перемещении соответствующего указателя.

У нас есть точки привязки наших значков к графику. В соответствии с этим мы поочередно считываем параметры указателей и определяем логику поведения программы.

// Считываем координаты указателей на графике
      for( i=0;i<3;i++)
           {
            Coordinats[i]=ObjectGet("Index"+Array_Index[i],OBJPROP_YDISTANCE);
               if (Coordinats[i]==0)//Если за переделами графика, то устанавливаем заново
                  Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Coordinats_IndexDn[i]);
           }    

Полученные значения мы запомнили. Теперь нам необходимо проанализировать их место на графике и относительно этого произвести необходимые операции. Для анализа используем фактическое местоположение указателей. За точку отсчета берем три базовых значения каждого указателя относительно значений используемых параметров. Если указатель перемещен выше верхнего параметра своей группы, то такое местоположение указателя будет считаться перемещением вверх, т.е. на самый верхний параметр. Если указатель перемещен ниже нижнего значения параметра, то он соответственно должен быть перемещен к нижнему значению параметра. Если указатель находится между верхним и нижним параметром, значит фиксируем средний параметр. Для сравнения используем вертикальную шкалу, т.е. параметр

OBJPROP_YDISTANCE

из

ObjectGet()
// Анализируем местоположение указателей
      for( i=0;i<3;i++)
         {
            if (Coordinats[i]>Coordinats_IndexUp[i]) 
                  {Move[i] = Coordinats_IndexUp[i]; index[i]=2;}// Указатель вверху
            if (Coordinats[i]>Coordinats_IndexDn[i]  && 
                Coordinats[i]<Coordinats_IndexUp[i])
                  {Move[i] = Coordinats_Index[i];   index[i]=1;}// Указатель в средине
            if (Coordinats[i]<Coordinats_IndexDn[i]) 
                  {Move[i] = Coordinats_IndexDn[i]; index[i]=0;}// Указатель внизу
            if (Move[i]!=0)

Далее мы выравниваем те объекты, которые перемещались.

Запоминаем новые параметры для построения Зиг-Зага.

Индикатор строим по параметрам, установленным с помощью графического управления.

// В зависимости от расположения объектов - перемещаем и выравниваем их
            Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Move[i]);    
// Запоминаем параметры Зигзага
            switch (i)   
               {
                case 0:  ExtDepth =     StrToInteger(ArrExt[0,index[i]]);  break;
                case 1:  ExtDeviation = StrToInteger(ArrExt[1,index[i]]);  break;
                case 2:  ExtBackstep =  StrToInteger(ArrExt[2,index[i]]);  break;                  
               }/**/
          }
 // Передаем параметры в пользовательский индикатор и из полученных значений строим Зиг-Заг
     for(i=300;i>0;i--)
            {
               ZigzagBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
               HighMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,1,i);
               LowMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,2,i);
            }

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


Рисунок 2


Рисунок 3


Рисунок 4

Окончательный код будет выглядеть следующим образом.

//+------------------------------------------------------------------+
//|                                         management_indicator.mq4 |
//|                                  Copyright © 2009, WWW.FIBOOK.RU |
//|                                             http://www.fibook.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, WWW.FIBOOK.RU"
#property link      "http://www.fibook.ru"

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
// Первоначальные значения индикатора
int               ExtDepth=12;
int               ExtDeviation=5;
int               ExtBackstep=3;
//---- indicator buffers
double            ZigzagBuffer[];
double            HighMapBuffer[];
double            LowMapBuffer[];
// Массив переменных параметров индикатора
string            ArrExt[3,3]    ={"12","21","34", "5","8","21", "3","13","34"};
// Массивы указателей
string            Array_Index[]={"Dep -> ","Dev -> ","Back ->"};
int               Coordinats_IndexUp[]={65,160,260};
int               Coordinats_Index[]  ={35,130,230};
int               Coordinats_IndexDn[]={5, 100,200};
// Цвет для блоков параметров и указателей
color             Color_[]={Blue,Green,Red};
// Переменные для расчетов
int               i,ii;
int               index[3];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(3);
//---- drawing settings
   SetIndexStyle(0,DRAW_SECTION);
//---- indicator buffers mapping
   SetIndexBuffer(0,ZigzagBuffer);
   SetIndexBuffer(1,HighMapBuffer);
   SetIndexBuffer(2,LowMapBuffer);
   SetIndexEmptyValue(0,0.0);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
int  Coordinats[3];
int  Move[3];
// Проверяем наличие объектов указателей на графике
   if (ObjectGet("IndexDep -> ",OBJPROP_YDISTANCE)<1||
       ObjectGet("IndexDev -> ",OBJPROP_YDISTANCE)<1||
       ObjectGet("IndexBack ->",OBJPROP_YDISTANCE)<1)
// Если их нет, то строим объекты
               {
      for( ii=0;ii<3;ii++)
       for( i=0;i<3;i++)
        Obj_CreateMove_Text (0, Array_Index[ii]+i, 23, ArrExt[ii,i], Color_[ii], 5, Coordinats_IndexDn[ii]+30*i);
       for( i=0;i<3;i++)
        Obj_CreateMove_Text (0, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Coordinats_IndexDn[i]);
               }
// Считываем координаты указателей на графике
      for( i=0;i<3;i++)
           {
            Coordinats[i]=ObjectGet("Index"+Array_Index[i],OBJPROP_YDISTANCE);
               if (Coordinats[i]==0)//Если за переделами графика, то устанавливаем заново
                  Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Coordinats_IndexDn[i]);
           }    
// Анализируем местоположение указателей
      for( i=0;i<3;i++)
         {
            if (Coordinats[i]>Coordinats_IndexUp[i]) 
                  {Move[i] = Coordinats_IndexUp[i]; index[i]=2;}// Указатель вверху
            if (Coordinats[i]>Coordinats_IndexDn[i]  && 
                Coordinats[i]<Coordinats_IndexUp[i])
                  {Move[i] = Coordinats_Index[i];   index[i]=1;}// Указатель в средине
            if (Coordinats[i]<Coordinats_IndexDn[i]) 
                  {Move[i] = Coordinats_IndexDn[i]; index[i]=0;}// Указатель внизу
            if (Move[i]!=0)
// В зависимости от расположения объектов - перемещаем и выравниваем их
            Obj_CreateMove_Text (1, "Index"+Array_Index[i], 23, Array_Index[i], Color_[i], 25, Move[i]);    
// Запоминаем параметры Зигзага
            switch (i)   
               {
                case 0:  ExtDepth =     StrToInteger(ArrExt[0,index[i]]);  break;
                case 1:  ExtDeviation = StrToInteger(ArrExt[1,index[i]]);  break;
                case 2:  ExtBackstep =  StrToInteger(ArrExt[2,index[i]]);  break;                  
               }/**/
          }
 // Передаем параметры в пользовательский индикатор и из полученных значений строим Зиг-Заг
     for(i=300;i>0;i--)
            {
               ZigzagBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,i);
               HighMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,1,i);
               LowMapBuffer[i]=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,2,i);
            }
Comment ("ExtDepth =",ExtDepth,", ExtDeviation =",ExtDeviation,", ExtBackstep =",ExtBackstep);        
//----
   return(0);
  }
// Функция построения и перемещения графических объектов
void Obj_CreateMove_Text (int CreateMove, string Name, int Type, string Number,  color text_color, int DistX, int DistY)
   {
      if (CreateMove==0)
      ObjectCreate(Name,Type,0,0,0);
      ObjectSetText(Name,Number,10,"Arial",text_color);
      ObjectSet(Name,101,3);
      ObjectSet(Name, 102, DistX);
      ObjectSet(Name, 103, DistY);
   }


//+------------------------------------------------------------------+


Заключение

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

Последние комментарии | Перейти к обсуждению на форуме трейдеров (12)
Vladimir
Vladimir | 3 июн. 2009 в 08:31
nen:

Красиво.

А если список параметров большой, то разбиваем параметры на группы.

И таким же образом сначала вызываем список групп. Потом, выбрав название группы, можно вызвать список параметров, входящих в группу.

Но есть одно Но. Списки допустимых значений параметров не всегда заранее известны. Бывает нужно выбрать свое, не заложенное в программу, значение параметра.

Для этого необходимо предусмотреть окно ввода значения параметра.

Графическое управление в языке MQL - удобное средство расширяющее возможности и оперативность для работы.

Добавил окно ввода параметров зиг-зага.

Vladimir
Vladimir | 3 июн. 2009 в 08:54
Semapc:

ВОТ чушь!!!!!

Можно даже плагиатом назвать. У Сергея Ковалёва управление "Автографа" на этом принципе построено.
У меня комплекс "AIASM" так уже три года управляется.
Но решил отказаться от этого способа. Больно он тяжёлый. Слишком много параметров. 3500 параметров.

Решил делать форму свою под Windows. И передавать параметры в советник через Mapping



Вы хоть немного хоть зарабатываете??? Посмотришь на монстров индикаторов и страшно становиться!!!!!!!!!!! Как можно торговать? У меня все проще до минимализма, мне не нужны все эти индикаторы.....тем болеее такогоООООО формата..... линии тренда "Правильные" определяю сам по логическим принципам, и точки входа-это уже система! Живите проще! Зачем так заморачиваться, петушиться!!! Действительно что нужно.... так это КИМовские советники!!!! Вот к примеру я бы хотел чтобы был советник который бы переводил в безубыток позицию при достижении (-11) пунктов! НО нет такого!!!!!!! К примеру.... но и это не беда!!!! Ребята будьте проще....работайте!!!!

Здесь же все просто.

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

А потом, возможно нашел в нем что то себе привлекательное.

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

Когда же торговать в таком случае?

Все как всегда. Сначала мы усложняем себе жизнь, потом разгребаем все это, а затем удивляемся тому, что все было так просто.

В справочнике по языку MQL не было указано, что графические операторы может использовать только Сергей Ковалев в своей программе.

А вот поделиться своим знанием с другими, считаю правильным.

Это как из заработанного надо немного отдать. Тогда и прибудет тебе еще.

Кто то отдает деньги, кто то знание, кто то внимание. Нужно уметь делиться, тогда и "лоси" забудут дорогу в твой дом.

Удачного всем трейда.

Vadim Zhunko
Vadim Zhunko | 3 июн. 2009 в 09:26
Vladlv:

Здесь же все просто.

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

А потом, возможно нашел в нем что то себе привлекательное.

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

Когда же торговать в таком случае?

Все как всегда. Сначала мы усложняем себе жизнь, потом разгребаем все это, а затем удивляемся тому, что все было так просто.

В справочнике по языку MQL не было указано, что графические операторы может использовать только Сергей Ковалев в своей программе.

А вот поделиться своим знанием с другими, считаю правильным.

Это как из заработанного надо немного отдать. Тогда и прибудет тебе еще.

Кто то отдает деньги, кто то знание, кто то внимание. Нужно уметь делиться, тогда и "лоси" забудут дорогу в твой дом.

Удачного всем трейда.

Ну, конечно, просто!!! :-)))

Вам МТ4 не мешает торговать с его количеством параметров? :-))

Хотя, у Вас времени на торговлю нет... Понимаю... Зарабатывать на написании статей проще...

А сколько программ MQL4 в копилку положили, бескорыстный Вы наш?

Vladimir
Vladimir | 4 июн. 2009 в 08:46
Zhunko:

Ну, конечно, просто!!! :-)))

Вам МТ4 не мешает торговать с его количеством параметров? :-))

Хотя, у Вас времени на торговлю нет... Понимаю... Зарабатывать на написании статей проще...

А сколько программ MQL4 в копилку положили, бескорыстный Вы наш?

Сколько же все таки обид у человека скопилось(((((

МТ мне не мешает торговать. Правильно провести трендовые линии и фибо уровни позволяет. И позволяет что то из ручной разметки автоматизировать. Достаточно. Мне интересно это состояние - быть в рынке.

Я уважаю любой труд. И труд тех кто пишет статьи тоже. Если есть что сказать - говорю.

Кстати, чтобы заработать 1К$ нужно написать 20 статей. А двадцать статей это двадцать идей.

Я лучше это сделаю на Форексе. И эмоционально на Форексе лучше.

А в копилку "положит" Scriptor то, что посчитает полезным.

Кому нужно, те знают. Пользуйтесь поиском.

И давайте далее по теме статьи. Говорите, если есть что сказать.

Любая конструктивная критика принимается. Любые замечания по теме - принимаются.

А для болтовни есть соответствующие темы на форумах.


Удачного тренда и положительных эмоций

Vadim Zhunko
Vadim Zhunko | 15 июн. 2009 в 23:03
Vladlv:

Сколько же все таки обид у человека скопилось(((((

МТ мне не мешает торговать. Правильно провести трендовые линии и фибо уровни позволяет. И позволяет что то из ручной разметки автоматизировать. Достаточно. Мне интересно это состояние - быть в рынке.

Я уважаю любой труд. И труд тех кто пишет статьи тоже. Если есть что сказать - говорю.

Кстати, чтобы заработать 1К$ нужно написать 20 статей. А двадцать статей это двадцать идей.

Я лучше это сделаю на Форексе. И эмоционально на Форексе лучше.

А в копилку "положит" Scriptor то, что посчитает полезным.

Кому нужно, те знают. Пользуйтесь поиском.

И давайте далее по теме статьи. Говорите, если есть что сказать.

Любая конструктивная критика принимается. Любые замечания по теме - принимаются.

А для болтовни есть соответствующие темы на форумах.

Удачного тренда и положительных эмоций

Весьма удивлён реакцией...

Почему Вам не дают покоя мои успехи? И почему Вы мне навязываете какие-то Ваши обиды? В тексте нигде о них не упоминал... Чудно... Чудные бурные фантазии...

Для Вас какой-то Скриптор авторитет? Так доверте ему сделки Ваши открывать :-)) Когда-нибудь надо начинать своей головой жить.

Ваши пассажи не по теме.

Всего лишь, хотел до автора статьи донести мысль о необходимости в статье упомнить предыдущие опыты по этой теме. Это принято, вообще-то...

Тем более, что Сергей Ковалёв выложил свой грандиозный проект в исходниках, бесплатно и очень давно. Все кому надо ознакомились.

Получается, что эта статья является плагиатом идеи. Говоря по Вашему - пользуйтесь поиском. Если умеете :-)))

Файл Lite_EXPERT2.mqh - функциональный конструктор экспертописателя Файл Lite_EXPERT2.mqh - функциональный конструктор экспертописателя
Эта статья является продолжением цикла статей "Эксперты на основе популярных торговых систем и алхимия оптимизации торгового робота". В ней автор знакомит читателей с более универсальной библиотекой функций файла Lite_EXPERT2.mqh
Тестирование экспертов на нестандартных таймфреймах Тестирование экспертов на нестандартных таймфреймах
Это не только просто, это очень просто. Тестирование Советников на нестандартных периодах возможно! Для этого всего лишь достаточно заменить данные стандартного таймфрейма данными нестандартного таймфрейма. Более того, возможно даже тестировать экспертов, пользующихся данными нескольких нестандартных периодов.
Визуальная оптимизация прибыльности индикаторов и сигналов Визуальная оптимизация прибыльности индикаторов и сигналов
Эта работа – продолжение и развитие моей предыдущей статьи "Визуальное тестирование прибыльности индикаторов и сигналов". Добавив немного интерактивности в процесс изменения параметров и изменив цели исследования, удалось получить новый инструмент, который не просто показывает, какие будут результаты торговли по используемым сигналам, но и позволит, передвигая виртуальные ползунки-регуляторы значений параметров сигналов на основном графике, сразу же получить и раскладку по сделкам, и график изменения баланса, и конечный результат торговли.
К вопросу об управлении капиталом К вопросу об управлении капиталом
В статье рассмотрены некоторые аспекты, возникающие при использовании различных систем управления капиталом, применительно к ФОРЕКС. Приведены данные экспериментов с моделью процесса торговли, в которой при совершении торговых сделок используются разные методы управления капиталом (Money Management - ММ).