Нужна помощь MQL5 #property indicator_level

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ivan Stepanenko
151
Ivan Stepanenko  

Ребята всем спасибо кто заинтересовался вопросом.

А в двойне спасибо тот кто смог помочь.

Вопрос такой.
Сушествуют функцыи Get и Set В других языках. Set  Отпровляем параметры а Get Получаем. Как пользоватса Get в MQL5?

Второй вопрос попроще если кто сталкивался.
#property indicator_level1 30  - Задал параметр. При Загрузки индикатора на график. Мне его ресует.
В коде програме функцыей ColorBuffer[] изменяю линию на другой цвет если линия опускаетса ниже данного параметра.

И тут родилась проблема. Если захожу в индикатор и меняю данный параметр на другой даже при загрузке индикатора линия уровня ресуетса там где надо а сам индикатор расчитывает всё по тому параметру что установлен раньше тобиж #property indicator_level1 30

Каким образом я должен обращятса к данному уровню чтоб можно было потом его менять в ходе исполнение программы?

- Уже испробывал провирять параметр. И заново пересчитывать всю цепь индикатора.
Всеравно не хочет перерисовыватса как мне нужно!

Помогите добрые знатаки!
Кто чем может :)
Alexey Viktorov
37654
Alexey Viktorov  


Комментарии нужны?

Ihor Herasko
25401
Ihor Herasko  
Ivan Stepanenko:

Ребята всем спасибо кто заинтересовался вопросом.

А в двойне спасибо тот кто смог помочь.

Вопрос такой.

Сушествуют функцыи Get и Set В других языках. Set  Отпровляем параметры а Get Получаем. Как пользоватса Get в MQL5?

Да вроде Вы сами ответили на вопрос. Get-функция получает значение какого-либо свойства (объекта, графика и т. д.).

Например:

ObjectGetString(0, sName, OBJPROP_TEXT);

означает получить текст, который отображается объектом, имя которого указано в переменной sName.

Второй вопрос попроще если кто сталкивался.

#property indicator_level1 30  - Задал параметр. При Загрузки индикатора на график. Мне его ресует.
В коде програме функцыей ColorBuffer[] изменяю линию на другой цвет если линия опускаетса ниже данного параметра.

И тут родилась проблема. Если захожу в индикатор и меняю данный параметр на другой даже при загрузке индикатора линия уровня ресуетса там где надо а сам индикатор расчитывает всё по тому параметру что установлен раньше тобиж #property indicator_level1 30

Каким образом я должен обращятса к данному уровню чтоб можно было потом его менять в ходе исполнение программы?

- Уже испробывал провирять параметр. И заново пересчитывать всю цепь индикатора.
Всеравно не хочет перерисовыватса как мне нужно!

Помогите добрые знатаки!
Кто чем может :)
Когда пользователь изменяет соответствующий уровень, то это не приводит к изменению значения директивы компилятора. Поэтому - никак.
Alexey Viktorov
37654
Alexey Viktorov  

Игорь, мы оба неправы. Я не сразу понял задачу...

Кроме директивы #property установить уровень индикатора можно функцией

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,20);

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

Тестовый вариант

#property indicator_separate_window
#property indicator_buffers     1
#property indicator_type1       DRAW_LINE
#property indicator_plots       1
#property indicator_color1      clrGreenYellow
#property indicator_level1      0
#property indicator_levelcolor  clrPurple

input double level = 0.6;
double buf[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf, INDICATOR_DATA);
   IndicatorSetDouble(INDICATOR_LEVELVALUE, 0, level);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int i = 0, limit = prev_calculated == 0 ? 0 : rates_total-1;
    for(i = limit; i < rates_total; i++)
     {
      buf[i] = i%2;
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
Ivan Stepanenko
151
Ivan Stepanenko  
Alexey Viktorov:

Игорь, мы оба неправы. Я не сразу понял задачу...

Кроме директивы #property установить уровень индикатора можно функцией

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

Тестовый вариант

Да вы правы что можно использовать параметр input. Я тоже об этом думал.

Но тогда получаетса каша так как вы можете выстовить уровень в 2 местах в input. # properity кто из них будет превалировать над кем дело запуска програмы.

В первый момент #properity а после старта в OnCalculate будет превалировать input.


Но после этого если мы меняем в настройках уровень. Так как input превалирует. Он обратно его изменит на своё значение или опять не перерисует индикатор. Это взвисимости как написать логику индикатора!


А я хочю решить эти 2 проблемы. Решение простое.

Просто считывать в нутри исполнение уровень заданный в индикаторе (Alexey Viktorovна) картинке вы показываете, С каких параметров я хочю считывать параметры в момент вычисления самого индикатора!



Ihor Herasko:

Да вроде Вы сами ответили на вопрос. Get-функция получает значение какого-либо свойства (объекта, графика и т. д.).

Например:

означает получить текст, который отображается объектом, имя которого указано в переменной sName.

Когда пользователь изменяет соответствующий уровень, то это не приводит к изменению значения директивы компилятора. Поэтому - никак.

(Ihor Herasko)
Уровни не создаютса как обекты с текстовым названием по крайне мере я не так их понимаю. Тобиж чтоб их искать по названию String Сперва нужно задать имя уровню чтоб его найти.
Если изначально небыло задано имя то уровень как таково будет потерян или не найден!

Вот по тому и спрашиваыю как можно считывать уровни в нутри вычисления при том чтоб уже параметр #properity который задали с начала не влиял на процес работы индикатора!

Тогда как считывать директиву уровня при том после того как компилятор выполнин вычисление?

Alexey Viktorov
37654
Alexey Viktorov  
Ivan Stepanenko:

Да вы правы что можно использовать параметр input. Я тоже об этом думал.

Но тогда получаетса каша так как вы можете выстовить уровень в 2 местах в input. # properity кто из них будет превалировать над кем дело запуска програмы.

В первый момент #properity а после старта в OnCalculate будет превалировать input.


Но после этого если мы меняем в настройках уровень. Так как input превалирует. Он обратно его изменит на своё значение или опять не перерисует индикатор. Это взвисимости как написать логику индикатора!


А я хочю решить эти 2 проблемы. Решение простое.

Просто считывать в нутри исполнение уровень заданный в индикаторе (Alexey Viktorov) на картинке вы показываете, С каких параметров я хочю считывать параметры в момент вычисления самого индикатора!

Проследите последовательность выполнения кода.

  1. Выполняется #property
  2. Выполняется всё что написано в OnInit()
  3. и далее...

Отсюда вывод: Вызывая свойства индикатора и меняя значение уровня в закладке "Уровни" вы ничего не добьётесь, так-как выполнение IndicatorSetDouble(INDICATOR_LEVELVALUE, level); будет последним и пока не измените значение входного параметра level уровень не изменится.

Когда-то я встречал, что для таких случаев делали уровни горизонтальными линиями, но это в далёком прошлом.


Я вот чего не понимаю: Почему вместо того, чтобы взять готовый код, проверить, покрутить его и так и эдак, вы вступаете в обсуждение? Вы считаете что все тут чаще просто пишут не проверенные варианты советов?

Ivan Stepanenko
151
Ivan Stepanenko  
Alexey Viktorov:

Проследите последовательность выполнения кода.

  1. Выполняется #property
  2. Выполняется всё что написано в OnInit()
  3. и далее...

Отсюда вывод: Вызывая свойства индикатора и меняя значение уровня в закладке "Уровни" вы ничего не добьётесь, так-как выполнение IndicatorSetDouble(INDICATOR_LEVELVALUE, level); будет последним и пока не измените значение входного параметра level уровень не изменится.

Когда-то я встречал, что для таких случаев делали уровни горизонтальными линиями, но это в далёком прошлом.


Я вот чего не понимаю: Почему вместо того, чтобы взять готовый код, проверить, покрутить его и так и эдак, вы вступаете в обсуждение? Вы считаете что все тут чаще просто пишут не проверенные варианты советов?

Я вобщето ищю функцыю или как здесь это можно реализовать.

Вроде всё проста считать параметр уровня.

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

rostic98
5
rostic98  
Ребята всем привет, нужна ваша помощь...может кто знает или может узнать что за шаблон это и как вообще его найти ?
https://ibb.co/b69xYx
Screen shot 3
Screen shot 3
  • ibb.co
Изображение Screen shot 3 расположенное в imgbb.com
Ivan Stepanenko
151
Ivan Stepanenko  
rostic98:
Ребята всем привет, нужна ваша помощь...может кто знает или может узнать что за шаблон это и как вообще его найти ?
https://ibb.co/b69xYx

Это не шаблон.

А индикатор.

Похож на индикатор уровней потдержки и сопротевления.

Artyom Trishkin
Модератор
123300
Artyom Trishkin  
Ivan Stepanenko:

Я вобщето ищю функцыю или как здесь это можно реализовать.

Вроде всё проста считать параметр уровня.

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

Вам уже отвечали на вопрос.

Вот эта строчка, прописанная в OnInit() изменит самый первый уровень индикатора на значение, записанное в переменной new_value_0:

IndicatorSetDouble(INDICATOR_LEVELVALUE,0,new_value_0);

Вот эта строчка, изменит второй уровень индикатора на значение переменной new_value_1:

IndicatorSetDouble(INDICATOR_LEVELVALUE,1,new_value_1);

... и т.д.

Alexey Viktorov
37654
Alexey Viktorov  
Artyom Trishkin:

Вам уже отвечали на вопрос.

Вот эта строчка, прописанная в OnInit() изменит самый первый уровень индикатора на значение, записанное в переменной new_value_0:

Вот эта строчка, изменит второй уровень индикатора на значение переменной new_value_1:

... и т.д.

Похоже что ему не нужно решение вопроса, а нужно просто охаять и МТ и MQL потому, что нет возможности прочесть параметр заданный в #property

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий