Сдвигающийся с каждым тиком буфер - страница 2

 
Georgiy Merts:

Я про индикатор ничего не говорил.

А здесь идет речь про индикаторные буферы.

 
fxsaber:

А здесь идет речь про индикаторные буферы.

По-твоему копирование всего индикаторного буффера - это хорошая практика ?

 
Georgiy Merts:

По-твоему копирование всего индикаторного буффера - это хорошая практика ?

Единственно правильная. Ускорение возможно достичь только в комбинации с PLOT_SHIFT.

Реализация на одном только PLOT_SHIFT работать не будет.

 
fxsaber:

Единственно правильная. Ускорение возможно достичь только в комбинации с PLOT_SHIFT.

Реализация на одном только PLOT_SHIFT работать не будет.

Ну так правильно - сдвинуть отрисовку c помощью PLOT_SHIFT, и дополнить только последнее значение. Зачем копировать все ?

Я чего-то, видимо, не знаю ? Какие-то хитрости, что надо копировать все ???

 
Georgiy Merts:

Ну так правильно - сдвинуть отрисовку c помощью PLOT_SHIFT, и дополнить только последнее значение. Зачем копировать все ?

Я чего-то, видимо, не знаю ? Какие-то хитрости, что надо копировать все ???

За сдвиг значений в индикаторных буферах отвечает терминал и ни как не регулируется индикатором. А терминал связывает количество элементов индикаторного буфера с количеством баров, т.е. 1 элемент индикаторного буфера на 1 бар. То что и описывает топик-стартер, у него отображается новый элемент только на новом баре. Фактически, в индикаторном буфере он видит цены закрытия вместо тиков. Для отображения тиков ему и надо организовывать смещение элементов в массиве на каждом тике. Но тут надо учесть 2 момента:

  1. Нельзя напрямую использовать ArrayCopy, так как в помощи по функции указано "Если копируется массив сам в себя, то результат неопределен." Т.е. нужно либо самому организовывать цикл, либо использовать промежуточный массив.
  2. Так как индикаторный буфер увеличивается с появлением нового бара, то нужно отслеживать этот момент. И при появлении нового бара, а следовательно и нового пустого элемента буфера не производить лишнее смещение элементов, а просто заполнить новый элемент.

 
Georgiy Merts:

По-твоему копирование всего индикаторного буффера - это хорошая практика ?

Копировать весь индикаторный буфер не имеет смысла, достаточно крайние 100-1000 элементов.
Остальные, всё равно, не видны на экране.

А тики хранить в отдельном массиве.

 
Dmitriy Gizlyk:

За сдвиг значений в индикаторных буферах отвечает терминал и ни как не регулируется индикатором. А терминал связывает количество элементов индикаторного буфера с количеством баров, т.е. 1 элемент индикаторного буфера на 1 бар. То что и описывает топик-стартер, у него отображается новый элемент только на новом баре. Фактически, в индикаторном буфере он видит цены закрытия вместо тиков. Для отображения тиков ему и надо организовывать смещение элементов в массиве на каждом тике. Но тут надо учесть 2 момента:

  1. Нельзя напрямую использовать ArrayCopy, так как в помощи по функции указано "Если копируется массив сам в себя, то результат неопределен." Т.е. нужно либо самому организовывать цикл, либо использовать промежуточный массив.
  2. Так как индикаторный буфер увеличивается с появлением нового бара, то нужно отслеживать этот момент. И при появлении нового бара, а следовательно и нового пустого элемента буфера не производить лишнее смещение элементов, а просто заполнить новый элемент.

Или я читал с закрытыми глазами, или вообще не читал. Но копируется абсолютно без проблем. Проверено на практике.

 
Alexey Viktorov:

Или я читал с закрытыми глазами, или вообще не читал. Но копируется абсолютно без проблем. Проверено на практике.

я тоже проверял - работает и в последнем билде МТ и 4 года назад работало без проблем

но как показывает практика... если разработчики среды программирования акцентируют внимание на "Если копируется массив сам в себя, то результат неопределен.", то они оставляют за собой право в последующих билдах МТ не гарантировать корректную работу ArrayCopy() при копировании "сам в себя"

т.е. это не документированная особенность ArrayCopy();

.....

я несколько лет не занимался mql, с удивлением обнаружил, что оценить скорость работы участков программы с помощью GetTickCount() сейчас невозможно - каждый запуск одного и того же тестового скрипта выдает разные результаты (то больше то меньше, хоть и скрипт может выполняться по несколько минут и по несколько миллионов-миллионов итераций) - подозреваю,что разработчики переписали МТ4 чуть ли не с нуля и  теперь терминал реально не тормозит, видимо дело в кэшировании

так вот, по моим наблюдениям сейчас (в новых билдах МТ) совершенно нет разницы, что использовать встроенные ф-ции ArrayCopy(); или организовать самостоятельно поэлементный сдвиг массива в цикле

 
Igor Makanu:

они оставляют за собой право в последующих билдах МТ не гарантировать корректную работу

Разработчики не будут ничего менять!

 
Igor Makanu:


 "Если копируется массив сам в себя, то результат неопределен.", 

"результат неопределен" не из-за того что могут что-то изменить, а из-за того что он действительно не может быть определён)

как укажете параметры - так и скопируется что-то, куда-то...