Обсуждение статьи "Пример индикатора, строящего линии поддержки и сопротивления"

 

Опубликована статья Пример индикатора, строящего линии поддержки и сопротивления:

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

Обратите внимание на индикаторы на основе скользящих средних. В числе первых мы назовем, конечно же, Moving Average, далее — Bollinger Bands и Envelopes, которые входят в стандартный набор терминала. Эти индикаторы как будто созданы показывать уровни поддержки и сопротивления на графике. Открываем свойства индикатора на вкладке "Уровни" и прописываем там пару уровней со знаком минус и пару — со знаком плюс. Получим примерно такое изображение:

Автор: Andrey Kisselyov

 

А рисование наклонных уровней с другой стороны сможете реализовать?

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

 
Alexandr Gavrilin:

А рисование наклонных уровней с другой стороны сможете реализовать?

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

добрый день.
да конечно, это не так сложно как кажется.
 

Грамотные ребята подскажите пожалуйста, как в MQL5 найти максимальный хай и лоу за выставленное количество баров

К примеру на mql4 там все просто делается

_High   = NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar,0)), Digits); // вычисление наибольшей цены хай за последнии CanalBar 
_Low    = NormalizeDouble(iLow (Symb,PERIOD_CURRENT,iLowest (Symb,PERIOD_CURRENT,MODE_LOW, CanalBar,0)), Digits); // вычисление наименьшей цены лоу за последнии CanalBar
   

тут просто берем то что нашли и отрисовываем на графике линию.

А вот как найти хай лоу за кол-во баров в mql5 голову сломал. iHighest и iLowest 

в простом понимании тут нет как я понял.

Буду благодарен если поможете, а если будет пример кода то вообще шикарно

спасибо.

 
Konstantin Seredkin:

Грамотные ребята подскажите пожалуйста, как в MQL5 найти максимальный хай и лоу за выставленное количество баров

К примеру на mql4 там все просто делается

тут просто берем то что нашли и отрисовываем на графике линию.

А вот как найти хай лоу за кол-во баров в mql5 голову сломал. iHighest и iLowest 

в простом понимании тут нет как я понял.

Буду благодарен если поможете, а если будет пример кода то вообще шикарно


_High   = NormalizeDouble(high[ArrayMaximum(high, 0, CanalBar)], Digits); // вычисление наибольшей цены хай за последнии CanalBar 

где high - массив хай цены баров

если это индикатор, то он вам в OnCalculation приходит,
если это в эксперте, то запрашивайте через CopyHigh

не забывайте ArraySetAsSeries true


спасибо.

 

СПС

 
Konstantin Seredkin:

Грамотные ребята подскажите пожалуйста, как в MQL5 найти максимальный хай и лоу за выставленное количество баров

К примеру на mql4 там все просто делается

тут просто берем то что нашли и отрисовываем на графике линию.

А вот как найти хай лоу за кол-во баров в mql5 голову сломал. iHighest и iLowest 

в простом понимании тут нет как я понял.

Буду благодарен если поможете, а если будет пример кода то вообще шикарно

спасибо.

во первых по вашему коду. я бы сделал проще, исходя из того что вы запрашиваете максимум на текущем графике, приведу пример для вершин, для впадин все практически так же.
вы путаете команды общего запроса ко всем данным, с командами запроса к текущим данным, что в данном случае лишнее.
//для текущих данных(доступ к текущим данным из любого советника или индикатора) будет
   _High=NormalizeDouble(High[iHighest(Symb,_Period,MODE_HIGH,CanalBar)],_Digits);

//для общих данных(доступ из любого советника или индикатора к любым данным в базе) будет 
   _High=NormalizeDouble(iHigh(Symb,PERIOD_CURRENT,iHighest(Symb,PERIOD_CURRENT,MODE_HIGH,CanalBar)),MarketInfo(Symb,MODE_DIGITS));

а теперь по коду в мт5.

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(Symb,PERIOD_CURRENT,0,CanalBar,high);
   _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(Symb,SYMBOL_DIGITS));
   ArrayFree(high);

в данном случае приведен доступ к любым данным в базе данных для любого символа из любого индикатора или советника.
не нужно мудрить на счет направления индексации, так как нам нужен только максимум, не важно где он находиться.
команда ArrayMaximum() (согласно справке) возвращает нужное значение учитывая направление индексации массива.

с/у.

P.S. я бы не нормализовывал цену, это лишнее, если конечно вы не строите пипсовщика, который ловит 1 Point со сделки.

 
Andrey Kisselyov:
во первых по вашему коду. я бы сделал проще, исходя из того что вы запрашиваете максимум на текущем графике, приведу пример для вершин, для впадин все практически так же.
вы путаете команды общего запроса ко всем данным, с командами запроса к текущим данным, что в данном случае лишнее.

а теперь по коду в мт5.

в данном случае приведен доступ к любым данным в базе данных для любого символа из любого индикатора или советника.
не нужно мудрить на счет направления индексации, так как нам нужен только максимум, не важно где он находиться.
команда ArrayMaximum() (согласно справке) возвращает нужное значение учитывая направление индексации массива.

с/у.

P.S. я бы не нормализовывал цену, это лишнее, если конечно вы не строите пипсовщика, который ловит 1 Point со сделки.


Отлично, с этим со всем разобрался

Теперь вот вопрос в другом

Реализация такая

input int CanalBar  = 200; // Кол-во баров для расчета

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   double high[];
   ArrayResize(high,CanalBar);
   CopyHigh(_Symbol,PERIOD_CURRENT,0,CanalBar,high);
   double _High=NormalizeDouble(high[ArrayMaximum(high)],SymbolInfoInteger(_Symbol,SYMBOL_DIGITS));
   ArrayFree(high);
   
   
   HLineCreate(0,"HIGH",0,_High,"",clrBlue,1,1); // Нарисуем линию на графике.

  }
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
//| На основе:                                                       |
//| Справочник MQL5 / Стандартные константы, перечисления и структуры|
//| / Константы объектов  / Типы объектов / OBJ_HLINE                |
//+------------------------------------------------------------------+
bool HLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="HLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 double                price=0,           // цена линии
                 const string          toolTip="\n",      // текст всплывающей подсказки
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             line_width=1,      // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0,         // приоритет на нажатие мышью
                 const int             timeFrames=OBJ_ALL_PERIODS)//отображение объекта на различных периодах
  {
//--- сбросим значение ошибки
   ResetLastError();
//--- создадим горизонтальную линию
   if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
     {
      Print(LINE_NUMBER,__FUNCTION__,
            ": failed to create a horizontal line! Error code = ",GetLastError());
      return(false);
     }
//--- установим текст всплывающей подсказки
   ObSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- установим цвет линии  
   ObSetIntegerColor(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObSetIntegerLineStyle(chart_ID,name,style);
//--- установим толщину линии
   ObSetIntegerInt(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObSetIntegerBool(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObSetIntegerBool(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObSetIntegerBool(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObSetIntegerLong(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- установка видимости объекта на различных таймфреймах  
   ObSetIntegerInt(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
//--- успешное выполнение
   return(true);
  }


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

 
Konstantin Seredkin:

Отлично, с этим со всем разобрался

Теперь вот вопрос в другом

Реализация такая


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

Попробуйте так:

void HLineCreate(const long            chart_ID=0,        // ID графика
                 const string          name="HLine",      // имя линии
                 const int             sub_window=0,      // номер подокна
                 double                price=0,           // цена линии
                 const string          toolTip="\n",      // текст всплывающей подсказки
                 const color           clr=clrRed,        // цвет линии
                 const ENUM_LINE_STYLE style=STYLE_SOLID, // стиль линии
                 const int             line_width=1,      // толщина линии
                 const bool            back=false,        // на заднем плане
                 const bool            selection=true,    // выделить для перемещений
                 const bool            hidden=true,       // скрыт в списке объектов
                 const long            z_order=0,         // приоритет на нажатие мышью
                 const int             timeFrames=OBJ_ALL_PERIODS)//отображение объекта на различных периодах
  {
  if(ObjectFind(chart_ID, name)<0) {
//--- создадим горизонтальную линию
   ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price);
//--- установим текст всплывающей подсказки
   ObjectSetString(chart_ID,name,OBJPROP_TOOLTIP,toolTip);
//--- установим цвет линии  
   ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль отображения линии
   ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линии
   ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,line_width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
   ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- установка видимости объекта на различных таймфреймах  
   ObjectSetInteger(chart_ID,name,OBJPROP_TIMEFRAMES,timeFrames);
     }
//--- установим способ привязки
   ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
  }
 
Konstantin Seredkin:

Отлично, с этим со всем разобрался

Теперь вот вопрос в другом

Реализация такая


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

команда
if(!ObjectCreate(chart_ID,name,OBJ_HLINE,sub_window,0,price))
если уже существует объект с таким именем не реализуется, как следствие ваша цена, на уже существующей линии не измениться.
как вам правильно сказали, это нужно делать командой

ObjectSetDouble(chart_ID,name,OBJPROP_PRICE,price);
и еще одно замечание, старайтесь не лезть в классы и другие премудрости, если есть возможность написать проще, используя команды прямого доступа.
применяйте только те команды, которые необходимы,  не нужно при каждом обращении перебирать все параметры линии ведь вам нужно изменить только цену линии.

с уважением.
 

Спасибо ребята, разобрался теперь.

Причина обращения: