Помощь по кодированию... Как заставить индикатор фильтровать вместо алерта? - страница 2

 
Aaragorn:
Могу ли я сделать это? Просто записать буфериндексы в индикатор и использовать верхние и нижние слова как это, и чтобы он возвращал значения верхних и нижних строк?

Не в индикаторе. В советнике. (Можно сделать это с индикатором, но не использовать тот же индикатор внутри его собственного кода!!!!!)

 
elihayun:
Не в индикаторе. В советнике. (Вы можете сделать это с индикатором, но не использовать тот же индикатор внутри собственного кода!!!!!)

то есть я могу написать индекс буфера в советнике, но как он получит значение из индикатора? Я не имел в виду использование индикатора внутри его собственного кода, это было бы глупо. Простите за мой сбой в общении. Нелегко иногда донести достаточно конкретно, в чем проблема. Это проблема как с кодированием, так и с обсуждением кодирования с другими.

 

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

 
Aaragorn:
Итак, я могу записать индекс буфера в советнике, но как он получает значение из индикатора? Я не имел в виду использование индикатора внутри его собственного кода, это было бы глупо. Простите за мой сбой в общении. Нелегко иногда донести достаточно конкретно, в чем проблема. Это проблема как с кодированием, так и с обсуждением кодирования с другими.

Не беспокойтесь о том, КАК. Пусть Метатрейдер сделает это за вас. Вы просто используйте код для получения нужной вам информации.

Подсказка: Когда вы запустите советника, вы увидите: "Trend Bands loaded succesfully", это означает, что он делает то, что вы хотите.

 
elihayun:
Не беспокойтесь о том, КАК. Пусть Metatrader сделает это за вас. Вы просто используйте код для получения нужной вам информации. Подсказка: Когда вы запустите советник, вы увидите: "Trend Bands loaded succesfully", это означает, что он делает то, что вы хотите.

Мне нравится идея использовать код для получения нужной мне информации, именно это я и пытаюсь узнать. КАК использовать код для получения нужной мне информации.

То есть вы считаете, что лучший способ получить тиковое значение для трендовых полос - это использовать iCustome()? И НЕ писать код внутри советника, как я уже сделал?

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

 
elihayun:
Написание индикатора - это одно, а написание советника - совсем другое. Не смешивайте их. В индикаторах нужно работать и с историей, чтобы правильно ее рисовать. При написании советника у вас есть только текущий тик, и вы должны вычислять значения каждый тик (если вы не хотите потерять сделку). Итак, чтобы получить значения верхней и нижней границы КРУГЛОГО тика, вы можете сделать две вещи
  1. Используйте оригинальный индикатор в качестве пользовательского индикатора
  2. написать логику индикатора внутри вашего эксперта

Первый вариант несложный. Сначала нужно выяснить, какой индекс буфера используется для верхней и нижней линии.

Чтобы найти его, нужно заглянуть в код индикатора.

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

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

//| Trend Bands.mq4 |

//| Dwt5 and adoleh2000 |

//| Copyright © 2005, MetaQuotes Software Corp. |

//| http://www.metaquotes.net |

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

#property copyright "Copyright © 2005, MetaQuotes Software Corp."

#property link "http://www.metaquotes.net"

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

//| Custom indicator initialization function |

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

#property indicator_chart_window

#property indicator_buffers 5

#property indicator_color1 Red

#property indicator_color2 Black

#property indicator_color3 Blue

#property indicator_color4 Red

#property indicator_color5 Blue

double upper[], middle1[], middle2, lower[];

double Xup[], Xdown[];

extern int period = 34;

int init()

{

SetIndexStyle(0,DRAW_LINE,EMPTY,2);

SetIndexShift(0,0);

SetIndexDrawBegin(0,0);

SetIndexBuffer(0,upper);

SetIndexStyle(1,DRAW_LINE,EMPTY,2);

SetIndexShift(1,0);

SetIndexDrawBegin(1,0);

SetIndexBuffer(1,middle1);

SetIndexStyle(2,DRAW_LINE,EMPTY,2);

SetIndexShift(2,0);

SetIndexDrawBegin(2,0);

SetIndexBuffer(2,lower);

SetIndexStyle(3,DRAW_ARROW,EMPTY,2);

SetIndexArrow(3, 162);

SetIndexShift(3,0);

SetIndexDrawBegin(3,0);

SetIndexBuffer(3,Xdown);

SetIndexStyle(4,DRAW_ARROW,EMPTY,2);

SetIndexArrow(4, 162);

SetIndexShift(4,0);

SetIndexDrawBegin(4,0);

SetIndexBuffer(4,Xup);

//---- indicators

//----

return(0);

}

Итак, я вижу 5 буферов... верхний, средний, нижний, верхний и нижний...

Я полагаю, что информация, которая мне нужна, находится в верхнем и нижнем буферах...

 
 
Aaragorn:
Я имел в виду, что это было новое сообщение, а не редактирование предыдущего, работа сайта иногда все еще путает меня...

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

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

Если вы знаете, в каком буфере находится нужная вам информация, неважно, сколько индикаторов в коде.

 
elihayun:
Написание индикатора - это одно, а написание советника - совсем другое. Не смешивайте их. В индикаторах вы должны иметь дело с историей, чтобы правильно ее рисовать. При написании советника у вас есть только текущий тик, и вы должны вычислять значения каждый тик (если вы не хотите потерять сделку). Итак, чтобы получить значения верхней и нижней границы КРУГЛОГО тика, вы можете сделать две вещи
  1. Используйте оригинальный индикатор в качестве пользовательского индикатора
  2. написать логику индикатора внутри вашего эксперта

Первый вариант несложный. Сначала нужно выяснить, какой индекс буфера используется для верхней и нижней линии.

Чтобы найти его, нужно заглянуть в код индикатора

SetIndexBuffer(0,upper);

SetIndexBuffer(1,middle1);

SetIndexBuffer(2,lower);

Как видите, верхняя линия имеет индекс 0, средняя - индекс 1, а нижняя - индекс 2.

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

Я нашел только одну строку

extern int period = 34;

Теперь мы можем использовать индикатор как пользовательский

double UpLevel = iCustome(NULL,0, "Trend Bands", 34, 0, 0);

double LowLevel = iCustome(NULL,0, "Trend Bands", 34, 2, 0);

34 - параметр индикатора

0 - индекс буфера (2 для нижнего)

последний 0 - это сдвиг бара (в советнике нам нужен текущий, поэтому мы используем 0)

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

Надеюсь, это поможет вам продвинуться

Илай

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

double UpLevel = iCustome(NULL,0, "Trend Bands", 34, 0, 0);

double LowLevel = iCustome(NULL,0, "Trend Bands", 34, 2, 0);

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

Так что мне не нужно писать код индикатора внутри советника, просто вызовите его вот так из EA.... и он вернет текущие значения баров линий, которые я могу затем использовать... это прекрасно! ....see Я знал, что кто-то знал, как это сделать! (просто это был не я) ...

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

extern double back = 300 //--которое я могу изменить по своему усмотрению

double UpLevel = iCustome(NULL,0, "Trend Bands", back, 0, 0);

double LowLevel = iCustome(NULL,0, "Trend Bands", back, 2, 0);

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

extern double back = 300 //--который я могу изменить по своему усмотрению

extern double TF = 30 //--который я могу изменить по своему усмотрению

double UpLevel = iCustome(NULL,TF, "Trend Bands", back, 0, 0);

double LowLevel = iCustome(NULL,TF, "Trend Bands", back, 2, 0);

где NULL использует текущий символ,

TF использует указанный мною период баров графика

Trend Bands вызывает индикатор

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

0 или 2 указывает ему, к какому буферу обращаться

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

будет ли это работать?

 
Aaragorn:
Это сработает?

Отлично!!! Вы поняли идею!!!!

Это будет работать идеально. И если вы хотите проверить, что 5M и 15M достигают края в одно и то же время, вы можете получить значения от каждого TF и проверить их вместе.

Но оставим это на потом....

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