Скачать MetaTrader 5

У меня повилась такая странная ошибка.

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

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

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

далее при заполнении буфера индикатора простейшим перебором получилось вот так то есть

буфер соданный индикатором почему не стал тайм серией, а получился обычным массивом ...

Rashid Umarov
Админ
12159
Rashid Umarov  
CoreWinTT писал(а)  :


буфер соданный индикатором почему не стал тайм серией, а получился обычным массивом ...

В справке к SetIndexBuffer() явно указано:

Примечание

После связывания динамический массив buffer[]  будет иметь индексацию как в обычных массивах, даже если для связываемого массива будет предварительно установлена индексация как в таймсериях. Если необходимо изменить порядок доступа к элементам индикаторного массива, необходимо применить функцию ArraySetAsSeries() после связывания массива функцией SetIndexBuffer().


Vasily
1261
Vasily  

понял.

то есть изначально насколько я знаю буфер индикатора создаётся как тайм серия, но при каждой связке он опять становиться массивом и нужно всегда использовать в комбинации с ArraySetAsSeries()

буть то копибуфер, либо класический цикл с перебором.

то есть каждый раз необходимо делать такую комбинацию.

   for(int i=0;i<count;i++) RezBuffer1[i] = High[i];
     ArraySetAsSeries(RezBuffer1,true);

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

 к таким действиям можно отнести как заполнение массива функцией

   for(int i=0;i<count;i++) RezBuffer1[i] = Maxx(i);

то есть при заполнении буфера информацией, буть тот неважно либо тайм серией либо массивом, он опять станет массивом.

и всегда нужно ставить связку

ArraySetAsSeries(RezBuffer1,true);

но при обращении к массиву, уже заполненному с обозначением индексации, его не сбивает.

и также я заметил что заполнение статического массива не требует обозначение индексации.

там уже как организовано заполнение так и будет произведена индексация.


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



Rashid Umarov
Админ
12159
Rashid Umarov  
CoreWinTT:
с чем связанно такое ново ведение? насколько я помню по мкл4 выходные буфера являются динамическими тайм сериями и в них четко регламентирована данная политика.

Обратная индексация индикаторных буферов, как это сделано в MQL4, изначально была сделана по традиции, так как на то время было общепринято нумеровать бары задом наперед. Это казалось удобным (и безусловно является удобным и сейчас, если обращаться к барам из экспертов), так как последний незавершенный бар всегда имел нулевой индекс.

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

Vasily
1261
Vasily  

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

думаю данное примечание стоит написать не только к функции к SetIndexBuffer()

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