Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления - страница 19

 
fxsaber #:

Входными данными индикатора являются только эти ценовые массивы и одно число.

И больше ничего! Индикаторы не работают с Copy-функциями (и их производными) и Bars-функциями. Если кто-то решил использовать эти функции на свое усмотрение, то они к индикатору никакого отношения не имеют. Это как в советнике их использовать или запрашивать данные с чужого символа/периода.

Не наделяйте индикаторы функционалом, которого в нем не должно быть. Для индикатора есть только данные из шапки OnCalculate. При выполнении Copy-функций они понятия не имеют (и не должны), из какой программы вы их вызываете. Их поведение всегда одинаковое, откуда бы вы их не вызвали.

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

 
Alexey Viktorov #:

Я и читаю с самого начала. Вчера ещё начал читать. И перед тем как написать о Copy*** проверил, значения не нулевые без ошибки. Потому и спрашиваю, а что важнее получить значение видимого или доступного бара?

Можно и так получить нормальное значение

Не спорю даже. Но я в цикле просчитываю бары, доступные индикатору на данный момент, исходя из значения rates_total.

Зачем мне данные одного конкретного бара.

Вопрос можно и с другой стороны поставить. Для чего индикатор просчитывает бары, которые даже не показываются на графике? Пусть тогда и режется rates_total с приходом каждого нового бара, и показывает всегда одно и тоже значение, скажем 10000. Но ведь нет, нельзя!. Как тогда индикатор отследит появление нового бара?! Но ведь решили обрезать вдруг отображение графика по MAXBARS, и ничего лучше не придумали, как запретить функциям видеть глубже в историю, чем MAXBARS. Но на индикаторе так просто не обрежешь, и функцию iBars(...) тоже видимо не изменишь по тем же причинам. Поэтому и оставили это половинчатое решение, по сути своей неправильное.

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

 
Andrey Kaunov #:

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

Нигде не указано это, как и то, что Вами придумана гарантированность этих функций.

Например, на M1-чарте в индикаторе можете подождать, когда придет тик XX:XX:59 (конец минуты), и сделать Sleep на несколько секунд (приход цен нового бара).

Так вот Copy-функции будут выдавать данные только что сформированного бара. А вот индикатор (массивы + rates_total) не будет иметь понятия об этом: rates_total и массивы не изменятся до выхода из OnCalculate.


Т.е. получите, что Copy-функции и Bars имеют актуальную информацию, а входные индикатора - нет.


Вызов Copy-функции - это запуск сторонней микро-программы, которая обращается в текущую БД-котировок Терминала, берет оттуда данные и возвращает результат. Эта микро-программа не знает, из какой MQL-программы был инициирован ее вызов. Поскольку это сторонняя микропрограмма, то ее вызов всегда дорогой - занимает много времени.


Индикаторы никакими микропрограммами не оперируют. На входе только заранее подготовленные ценовые массивы и rates_total.

 
fxsaber #:

Нигде не указано это, как и то, что Вами придумана гарантированность этих функций.

Например, на M1-чарте в индикаторе можете подождать, когда придет тик XX:XX:59 (конец минуты), и сделать Sleep на несколько секунд (приход цен нового бара).

...

Sleep в индикаторах не работает. Какие же вы все молодцы. Один код в две строчки прочитать не может, другой Sleep ставит в индикатор.

 
Andrey Kaunov #:

Sleep в индикаторах не работает. Какие же вы все молодцы. Один код в две строчки прочитать не может, другой Sleep ставит в индикатор.

Контекст читайте.

fxsaber #:

сделать Sleep на несколько секунд (приход цен нового бара).

Плевать, каким техническим средством дожидаться нового бара.


Не без изъянов Документация, но лучше, чем ничего.

 
fxsaber #:

Т.е. получите, что Copy-функции и Bars имеют актуальную информацию, а входные индикатора - нет.


Вызов Copy-функции - это запуск сторонней микро-программы, которая обращается в текущую БД-котировок Терминала, берет оттуда данные и возвращает результат. Эта микро-программа не знает, из какой MQL-программы был инициирован ее вызов. Поскольку это сторонняя микропрограмма, то ее вызов всегда дорогой - занимает много времени.


Индикаторы никакими микропрограммами не оперируют. На входе только заранее подготовленные ценовые массивы и rates_total.

Я понимаю вас, и представляю в общих чертах принципы работы индикатора и функций. Но может мне и потребуется актуальная информация. Я уж не беру в расчёт ситуацию, когда нужно переписать индикатор 4-й версии с использованием этих функций.

Вопроса бы вообще не возникло, если бы в документации к функции iTime(...) и прочих было такое же примечание, как к Copy функциям.


 
Andrey Kaunov #:

Вопроса бы вообще не возникло, если бы в документации к функции iTime(...) и прочих было такое же примечание, как к Copy функциям.

CopyTime
CopyOpen
CopyHigh
CopyLow
CopyClose
CopyTickVolume
CopyRealVolume
CopySpread

iClose
iHigh
iLow
iOpen
iTime
iTickVolume
iRealVolume
iVolume
iSpread

Все эти функции (микропрограммы) содержат внутри себя вызов CopyRates. А потому имеют ровно те же ограничения, что и основная функция.

 
Andrey Kaunov #:

Не спорю даже. Но я в цикле просчитываю бары, доступные индикатору на данный момент, исходя из значения rates_total.

Зачем мне данные одного конкретного бара.

Вопрос можно и с другой стороны поставить. Для чего индикатор просчитывает бары, которые даже не показываются на графике? Пусть тогда и режется rates_total с приходом каждого нового бара, и показывает всегда одно и тоже значение, скажем 10000. Но ведь нет, нельзя!. Как тогда индикатор отследит появление нового бара?! Но ведь решили обрезать вдруг отображение графика по MAXBARS, и ничего лучше не придумали, как запретить функциям видеть глубже в историю, чем MAXBARS. Но на индикаторе так просто не обрежешь, и функцию iBars(...) тоже видимо не изменишь по тем же причинам. Поэтому и оставили это половинчатое решение, по сути своей неправильное.

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

Ничего не запретили. Пользуйтесь функциями Copy***

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Новая версия платформы MetaTrader 5 build 3550: улучшения и исправления

Alexey Viktorov, 2023.02.07 12:19

А зачем больше MAXBARS?

Получает количество баров равное rates_total

    datetime ctime[];
    int copyTime = CopyTime(_Symbol, PERIOD_CURRENT, 0, INT_MAX, ctime);

а потом в цикле перебирайте массив… И зачем вам в индикаторе функции iTime() и ей подобные когда есть все массивы. Если нужны данные другого периода, так и надо обсуждать это, а не PERIOD_CURRENT

Ну не достаёт функция iTime куда нам надо… и флаг ей в руки, есть другие возможности.

Всё, на этом я покидаю это обсуждение. Удачи вам.

 
Alexey Viktorov #:

Ничего не запретили. Пользуйтесь функциями Copy***

а потом в цикле перебирайте массив… И зачем вам в индикаторе функции iTime() и ей подобные когда есть все массивы. Если нужны данные другого периода, так и надо обсуждать это, а не PERIOD_CURRENT

Ну не достаёт функция iTime куда нам надо… и флаг ей в руки, есть другие возможности.

Всё, на этом я покидаю это обсуждение. Удачи вам.

Алексей, почитайте документацию к функции Copy***, постом выше выложил скрин примечания. 

Объясните мне, некоторые люди вообще читают форум, или просто так пишут, лишь бы написать чего...

fxsaber #:

Все эти функции (микропрограммы) содержат внутри себя вызов CopyRates. А потому имеют ровно те же ограничения, что и основная функция.

Я прочитал вас. Уже так примерно и понял. Что-ж, будем отталкиваться от реалий. Видимо там виднее, как лучше было сделать.
 
fxsaber #:

Вызов Copy-функции - это запуск сторонней микро-программы, которая обращается в текущую БД-котировок Терминала, берет оттуда данные и возвращает результат. Эта микро-программа не знает, из какой MQL-программы был инициирован ее вызов. Поскольку это сторонняя микропрограмма, то ее вызов всегда дорогой - занимает много времени.

Это касается и Symbollnfo-функций.