Индикаторный вопрос - страница 4

 
SDC:

Или, может быть, что-то вроде этого?

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

Это и ваше сообщение о внешних bools натолкнуло меня на некоторые другие идеи, спасибо.

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

Спасибо, это даст мне кучу новых идей.
 
SDC:


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

в вашем исходном коде:

Последний параметр 1 - это значение macd, которое было на баре 1 графика, баре, предшествующем текущему бару, который индексируется как бар 0

.

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

Вам нужно индексировать macd на тот же барный индекс, что и каждый бар, поэтому, например, на баре 500 вам нужно следующее

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

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

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

Верно, у меня это получилось.

Однако при добавлении кодов типа if(val1 > 0 && faster > slower) это не работало, если объявлять быстрее и медленнее вне цикла.

AHHHHH Я понял, так как сдвиг является (i), тогда мне нужно, чтобы он был внутри цикла OOOOPPPS LOL
 
Agent86:
Почему for(int i = Bars-1 ? <----------------------- Бары индексируются как массивы, первый бар=0, а не 1. Так что последний бар - это Bars-1;

И почему это лучше, чем for(int i = Bars ?? <----- см. выше.

Пожалуйста, подскажите, спасибо.


Также:

Я предполагаю, что это относится ко всем, а не только к индикаторам / пользовательским индикаторам?<--- то, что мы с WHRoeder: обсуждали, это довольно общие вопросы. Ничего конкретного. Мы просто говорили друг с другом об объявлении переменных, их назначении и т.д., в том числе и в циклах.

 
diostar:

Также:


for(int i=Bars; i>=0; i--) вот код, который я использовал

for(int i=Bars-1; i>=0: i--) - это предложенный код.

Я думал, что Bars = количество баров на текущем графике? По крайней мере, согласно словарю.

Так что --i, как я понял, отсчитывается от самого высокого номера бара, например, 1002 или что-то в этом роде, и отсчитывает --i до фактического -1.
Потому что пока i>=0, он должен отсчитывать до -1, прежде чем станет ложным. Если бы i было 0 или больше, то оно было бы истинным и зацикливалось бы в последний раз, пока не достигло бы -1.

По крайней мере, так я думал, что это работает? Может я ошибаюсь?

Если i=0 и ++i и считать вверх, то я думал, что он будет считать до конца до последнего бара.

Но в этом случае Bars-1, о котором вы говорите, на самом деле не все закрытые бары, а включает Bar[0], который еще не закрыт или что-то еще?

Я не совсем понимаю разницу между Bars-1 и Bars. Имеет ли это какое-то отношение к текущему бару 0, который не учитывается, когда просто ссылаются на Bars?

Пожалуйста, подскажите Спасибо


 

Да, это так, потому что у вас есть бар 0, поэтому Bars дает вам количество баров на графике, включая бар 0.

поэтому рассмотрим крошечный график, на нем всего 2 бара, bar[0] и bar[1].

Bars дает вам количество баров, поэтому Bars == 2

Если вы хотите, чтобы ваш индикатор начинал работать с последнего бара на графике.

Вы можете попробовать i=Bars.

Как мы знаем, Bars = 2, но нет бара с индексом bar[2], последний бар - Bar[1].

поэтому вам нужно сделать i=Bars-1

 
Agent86:
for(int i=Bars; i>=0; i--) это код, который я использовал<--- скажем, для Close[i], это считает от close[Bars] до close[0]. Когда i=Bars, существует ли close[i]?

for(int i=Bars-1; i>=0: i--) предлагается<--- скажем, для, например, Close[i], это отсчитывает от close[Bars-1] вниз до close[0]. Когда i=Bars-1, существует ли close[i]?

Я думал, что Bars = количество баров на текущем графике? По крайней мере, согласно словарю. <---ok

Итак, --i, как я понял, отсчитывается от номера самого высокого бара, например 1002 или что-то в этом роде, и отсчитывается --i до фактически -1 Существуют ли close[1002], close[-1]?
Потому что если i>=0, то он должен отсчитывать до фактического -1, прежде чем станет ложным. Если бы оно было 0 или больше, то оно было бы истинным и зацикливалось бы в последний раз, пока не достигло бы -1 <---- в close[-1], оно вернуло бы 0. Не false.

По крайней мере, так я думал, что это работает? Может я ошибаюсь? <--- см. ниже ссылку.

Если i=0 и ++i и считать вверх, то я думал, что он будет считать до конца до последнего бара. <--- он будет послушно это делать.

Но в этом случае Bars-1, о котором вы говорите, на самом деле не будет всеми закрытыми барами, а фактически включает Bar[0], который еще не закрыт или что-то еще? <--- в этом случае цена закрытия будет возвращать текущую цену Bid тика.

Я не совсем понимаю разницу между Bars-1 и Bars. Имеет ли это какое-то отношение к текущему бару 0, который не учитывается при простом обращении к Bars ?

Пожалуйста, подскажите.





double Close[]
Массив серий, содержащий цены закрытия для каждого бара текущего графика.

Элементы массива серии индексируются в обратном порядке, т.е. от последнего к первому. Текущий бар, который является последним в массиве, индексируется как 0. Самый старый бар, первый на графике, индексируется как Bars-1.
 
Понятно, я почему-то думал, что буфер обрабатывает эту тему немного по-другому, потому что технически я даже не объявлял количество элементов в массиве, так что я думал, что буфер уже работает над этим.

В любом случае, я понял это и это имеет смысл, спасибо.

 
Agent86:
Понятно, я почему-то думал, что буфер обрабатывает эту тему немного иначе, потому что технически я даже не объявлял количество элементов в массиве, поэтому я думал, что буфер и так это делает.

В любом случае, я понял это и это имеет смысл, спасибо.



Что??? Я не понимал, что вы на самом деле относите все это к индикаторным буферам. Теперь, когда я понял, прочитайте эти ссылки, взятые из: https://www.mql5.com/en/articles/1500

(1) индикаторные буферы и пользовательские массивы - они и одинаковы, и РАЗЛИЧНЫ. & Причина, по которой индикаторные буферы не определяются размером пользователя, не имеет ничего общего с тем, что это уже отработано. см. ниже ссылку:

double ExtMapBuffer1[];

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

(2) индикаторные буферы на выходе и на входе (буфер данных выше) могут выглядеть одинаково, но быть разными.

SetIndexBuffer(0,ExtMapBuffer1);

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


Видите, все работает. Теперь давайте посмотрим, что делает код:

for(int i=0;i<Bars;i++)

Мы используем цикл for, чтобы пройти по всем элементам буфера данных. Поскольку каждому элементу буфера соответствует определенный бар, мы используем цикл, начиная с нулевого бара (последнего доступного) и заканчивая первым доступным, который последовательно на один меньше переменной Bars (поскольку мы считаем бары от нуля).

{
   ExtMapBuffer1[i]=MathRand()%1001;
}

На каждой итерации счетчик увеличивается на единицу, и мы переходим от последнего доступного бара к первому , одновременно присваивая каждому элементу буфера (который соответствует определенному бару) случайное число от 0 до 1000. Если вам трудно понять, как определенный элемент буфера соответствует определенному бару, попробуйте изменить цикл следующим образом и посмотрите результат в терминале:

for(int i=0;i<Bars;i++)
{
   ExtMapBuffer1[i]=i;
}



 
diostar:

double Close[]
Массив серии, содержащий цены закрытия для каждого бара текущего графика.

Элементы массива серии индексируются в обратном порядке, т.е. от последнего к первому. Текущий бар, который является последним в массиве, индексируется как 0. Самый старый бар, первый на графике, индексируется как Bars-1.

Хорошо, теперь я думаю, что понимаю, спасибо.
 
Спасибо всем

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

Так как счетчик отсчитывает 1-- кажется, что использование этого метода не подходит для обращения к любым объектам массива для использования в торговле, если только я не обращаюсь только к определенному shift[i], в этом случае мне придется придумать, как конкретно обращаться только к тем элементам массива, которые я хочу использовать для торгового сигнала, расположенного только на этих определенных барах.

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

Так что теперь, я думаю, мне предстоит узнать, как обращаться к различным элементам массива в любом индикаторе, чтобы ссылаться на эти значения/время/бары и т.д.

Спасибо всем за помощь, и это даст мне много пищи для размышлений о том, как я могу создать iCustom индикаторы и сделать их полезными в советнике.