У вас не стоит Flash Player
Настройки
#80019 - Thu Oct 13 2016 02:11 PM Как создать блок "запоминаемое значение" ?
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
Здравствуйте!

Прошу помочь с написанием.

По сути, нужны хотя бы блоки "INT", "DOUBLE", "BOOL".

Сейчас, в нод-программировании нет указанных блоков.

Есть только блок "ОбновляемоеЗначение", который, как выяснилось, не сохраняет данные в течение работы скрипта.

Итак, "ОбновляемоеЗначение" хранит некую переменную типа "double".

Этот блок пересчитывается при наступлении некоторых событий ТОЛЬКО НА ЗАДАННОМ ДИАПАЗОНЕ.

Пример:
мне нужно посчитать количество баров сессии, начиная от 10.00 и заканчивая 23.50.
Пересчет происходит по приходу каждого нового бара, поэтому во вход "условие обновления" мы втыкаем Логическую_Формулу (или логическую константу) true.

Во вход обновляемого значения, втыкаем Формулу, вход для которой - это же обновляемое значение. В формуле пишем: ОбновляемоеЗначение+1.

Теперь, по приходу каждого тика, формула будет инкрементировать наше Обновляемое значение.

Теперь, для ускорения работы скрипта, мы ограничиваем количество просматриваемых баров - 10 000 единиц.

Выводим в Окно графика ОбновляемоеЗначение и видим:
конечная точка всегда равна 10 000, а начальная - 0.

Т.е. в блоках не предусмотрена возможность хранения данных.

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

В скрипте, мы проверяем некие условия, и когда эти условия наступают, мы обновляем значение INT или обнуляем до стартового, которое мы передаем в начале.

Пример использования
Нам нужно посчитать количество пересечений цены с Moving Average за месяц.
При этом, для ускорения работы алгоритма, мы установили параметр "МаксБаров" = 500.
То есть, мы, подключившись к реальному инструменту, видим только последние 500 баров в течение дня, и не видим предыдущие данные в течение дня.

С 1 по 12 число, мы, воспользовавшись историческими данными, посчитали, что количество пересечений равно 20 (стартовое значение INT = 20).

Теперь, с каждым наступлением события "пересечение цены и MA", мы берем наш INT и увеличиваем на 1, соединив выход INT с формулой (int+1), выход которой ставим во вход int.

В течение дня, нам пришло 1500 баров.
*На первых 500 барах, было одно пересечение, и наш INT стал равен 21.
*На вторых 500 барах, пересечений не было, наш INT остался равен 21 (в отличие от блока "обновляемое значение", которое здесь посчитало бы количество пересечений, равное 0 и возвращающее стартовое число 20).
*На третьих 500 барах, было 3 пересечения, INT равен 24.

Мы закончили торговую сессию, закрыли программу.
На следующий день, включаем и видим: INT = 20. Теперь, устанавливаем значение 24 и запускаем алгоритм.

При включенной опции "не очищать", на следующий день, наш INT должен хранить значение 24.

_____________________

Вопрос: как написать подобный блок?
Где найти мануалы по написанию блоков?


Отредактировано Atomic (Thu Oct 13 2016 02:44 PM)

Наверх
#80021 - Thu Oct 13 2016 03:13 PM Re: Как создать блок "запоминаемое значение" ? [Re: Atomic]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8133
Я перенес вопрос именно в эту ветку, так как в визуальном редакторе этого не сделать. По сути Вам нужно начальное значение в обновляемом значении. По умолчанию оно 0, если поставить 20, значит ОЗ будет считать от 20.

А вот как сделать непосредственно запрашиваемый блок и возможно ли его сделать без дополнительного какого-то сброса в текстовик подскажут в этой ветке.

Наверх
#80023 - Thu Oct 13 2016 03:22 PM Re: Как создать блок "запоминаемое значение" ? [Re: ViL]
Fresto Offline
journeyman

Registered: Wed Jul 27 2016
Записи: 84
Как сделать такой кубик именно как в визуальном редакторе я не знаю. Но.. есть кубики, которые выдают 1 значение основываясь на входящем значении. Т.е. не потоковые, по типу SMA и т п.. Так вот, сделать 3 выходящих значения, 2 буловский условий ( обнуление и условие выставления значение ), ну и само выставляемое значение, int double и т п. Ну и просто в коде будет тупо условие, если тру, то выставляем новое значение, если false, то выставляем старое значение.. так не получится?

Наверх
#80024 - Thu Oct 13 2016 03:53 PM Re: Как создать блок "запоминаемое значение" ? [Re: Fresto]
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
Vil,

если нулевая точка в терминале сдвигается, блок "Обновляемое значение" производит пересчет.
Т.е. если у нас есть 100 баров (макс баров = 200), и мы в каждом баре делаем инкремент, то последнее значение равно 100.

Но если у нас 1000 баров (макс баров = 200), то последнее значение всегда равно 200.

Другими словами, у каждой сделки есть идентификатор, хранимый и возвращаемый биржей, но "БарСессии" это просто число, всегда равное нулю на первой точке данных.

Freso,

ну вот есть у нас исходящий поток. У нас есть high, low, open, close, time.

Любой индикатор мы строим по этим величинам. Но каждый из этих индикаторов строится от первой точки выбранного диапазона ( [i - МаксБаров] ) до последней точки ( [i] ).

С наступлением нового бара ( [i + 1] ), наша первая точка сдвигается (становится [i+1 - МаксБаров] ).

При этом, данные high, low и т.д. для точки [i - МаксБаров] тупо исчезают.

Вся проблема в том, что все индикаторы с приходом каждого нового бара делают пересчет для интервала от [i-МаксБаров] до [i].

По грамотному, индикаторы не должны вообще пересчитываться на интервале. С приходом нового бара, нам нужно брать не значения high, low выбранного (смещенного) периода - как это сейчас происходит - а тупо брать значения этого же индикатора, т.е. предыдущий расчет.

Проблема в том, что этот предыдущий расчет не сохраняется вообще нигде. Терминал сохраняет только цену (эти самые high, low...).

Это на самом деле очень серьезный косяк данного терминала.


Отредактировано Atomic (Thu Oct 13 2016 03:59 PM)

Наверх
#80025 - Thu Oct 13 2016 04:03 PM Re: Как создать блок "запоминаемое значение" ? [Re: Atomic]
Fresto Offline
journeyman

Registered: Wed Jul 27 2016
Записи: 84
Хм, подожди, так а ты же вызываешь функцию Execute каждый раз с входными данными, но данные в самом классе кубика у тебя ведь никак не привязаны к Execute. В них и может храниться предыдущая информация, нет?

Наверх
#80029 - Thu Oct 13 2016 07:14 PM Re: Как создать блок "запоминаемое значение" ? [Re: Fresto]
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
Fresto,

я уже нашел ответ у русалго.

Короче, есть два типа обработки данных - потоковая (пересчет массива по событию) и событийная (пересчет переменной по событию).

В кубике "ОбновляемоеЗначение" хранится целый массив данных, который пересчитывается в потоковом режиме.

Что происходит, когда приходит новый тик:
обновляемое значение сдвигает первую точку и пересчитывает массив. Т.е. обновляемое значение как бы "скользит" вместе с рынком.

Только стартовые данные никак не привязаны к execute (я их задаю как входящие стартовые значения индикатора), но дальше, когда цена движется, наши стартовые данные должны остаться позади, также, как и предыдущая цена.

Они находятся как бы "out of range" - за пределами нашей видимости.

Прикрепить эти "out of range" данные к старту массива динамически невозможно, точнее, может и возможно, но они должны рассчитываться и храниться отдельным потоком, что в рамках потока на интервале не представляется возможным.

на примере:
у меня настройка МаксБаров = 10 000. В начале дня, я подсовываю своему индикатору "стартовое значение" (для бара №(-1) то есть out of range). Первый бар сессии терминала - бар №0.
Когда приходит бар 10 001, мне нужно перезаписать в переменную "стартовое значение" расчет бара №0, поскольку теперь терминал видит интервал [1;10001]. Но, я не могу получить расчетное значение бара №0 на этом интервале - он "out of range". С другой же стороны, я не могу его записать и на интервале [0;10000], потому что это "стартовое значение" участвует в расчетах массива [0;10000]. То есть в первом случае мы получаем "вне зоны досягаемости", а во втором - бесконечный цикл.

В остальных случаях - если мы вообще не перезаписываем "стартовое значение" - интервал [1;10001] будет все также рассчитан с того же стартового значения, что и интервал [0;10000] и в этом случае, расчетное значение бара №1 для первого и второго интервала будут отличаться, а не должны.
_________________
Я нашел информацию о том, как написать кубик "Запоминаемое Значение"... Придется писать самому.


Отредактировано Atomic (Thu Oct 13 2016 07:28 PM)

Наверх
#80032 - Fri Oct 14 2016 01:09 AM Re: Как создать блок "запоминаемое значение" ? [Re: Atomic]
ViL Offline
TSLab
Carpal Tunnel

Registered: Sun Oct 17 2010
Записи: 8133
Ждем от Вас готового решения.

Наверх
#80034 - Fri Oct 14 2016 10:04 AM Re: Как создать блок "запоминаемое значение" ? [Re: ViL]
uuzzeerr Offline
veteran

Registered: Thu Sep 29 2011
Записи: 1446
я всеже не совсем понял в чем качественное отличие от обновляемого значения?

Наверх
#80036 - Fri Oct 14 2016 11:10 AM Re: Как создать блок "запоминаемое значение" ? [Re: uuzzeerr]
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
Originally Posted By: uuzzeerr
я всеже не совсем понял в чем качественное отличие от обновляемого значения?


обновляемое значение не считает события вне диапазона.

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

Наверх
#80042 - Sat Oct 15 2016 11:55 AM Re: Как создать блок "запоминаемое значение" ? [Re: Atomic]
uuzzeerr Offline
veteran

Registered: Thu Sep 29 2011
Записи: 1446
простыми словами чтото типа глобальнольной переменной?

Наверх
#80044 - Sun Oct 16 2016 02:03 PM Re: Как создать блок "запоминаемое значение" ? [Re: uuzzeerr]
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
Originally Posted By: uuzzeerr
простыми словами чтото типа глобальнольной переменной?


да.

Уже создал, проверил. Это не подходит. Я не могу подсоединить выход переменной ко входу блока "формула" (в которой происходит инкремент нашей переменной), т.к. она принимает во вход массив.

Для того, чтобы эту переменную со временем можно было менять относительно самой себя (т.е. ее выход подключить ко входу), нужен еще один блок - "double to array".

Сейчас, в API есть:

array to array (IStreamHandler), array to value (IValuesHandler).

Value to array нету.

Наверх
#80049 - Mon Oct 17 2016 01:08 PM Re: Как создать блок "запоминаемое значение" ? [Re: Atomic]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
то что вы хотите наворотить в кубиках - имхо не заслуживает траты сил.
У вас по дороге много камней и поваленных дубов.
1) скрипт при старте и остановке обнуляет все переменные вашего скрипта и локальные кэши.
2) при обрыве связи агенты будут рестартованы автоматом. смотрим пункт 1
3) чтобы хранить расчеты за пределами бара 0 вам придется их класть во внешний файл и загружать оттуда каждый раз при проведении расчетов.
4) чтобы файл содержал адекватн информацию вам придется проводить валидацию данных и записывать только новые величины, а разные рестарты и повторы будут часто.
5) при чтении данных из файла вам придется так же синхронизировать текущие ваши бары и данные чтобы отобразить правильно среднее значение.

Как итог: это уже лучше скрипт. с внешним файлом и чтением записью. ну и проверки корректности данных так же.

Можно даже загрузить МНОГО истории, сделать предрасчет на истории и затем на реале будет только дописываться инфа.

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

В общем фантазируйте. Кубики тут не спасут.
_________________________
__


Наверх
#80057 - Mon Oct 17 2016 08:42 PM Re: Как создать блок "запоминаемое значение" ? [Re: ra81]
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
Originally Posted By: ra81
то что вы хотите наворотить в кубиках - имхо не заслуживает траты сил.
У вас по дороге много камней и поваленных дубов.
1) скрипт при старте и остановке обнуляет все переменные вашего скрипта и локальные кэши.
2) при обрыве связи агенты будут рестартованы автоматом. смотрим пункт 1
3) чтобы хранить расчеты за пределами бара 0 вам придется их класть во внешний файл и загружать оттуда каждый раз при проведении расчетов.
4) чтобы файл содержал адекватн информацию вам придется проводить валидацию данных и записывать только новые величины, а разные рестарты и повторы будут часто.
5) при чтении данных из файла вам придется так же синхронизировать текущие ваши бары и данные чтобы отобразить правильно среднее значение.

Как итог: это уже лучше скрипт. с внешним файлом и чтением записью. ну и проверки корректности данных так же.

Можно даже загрузить МНОГО истории, сделать предрасчет на истории и затем на реале будет только дописываться инфа.

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

В общем фантазируйте. Кубики тут не спасут.


Благодарю. Сегодня пришли к такому же решению (писать во внешний файл потоком и с него же выгружать).

С п.1 боролся в течение дня, результат нулевой:
с каждым баром, мой список, хранящий значения индикатора, удаляется, после чего пишется новый. Т.е. делать пуш-поп не вариант frown

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

Спасибо Вам за советы. И за видосы, кстати, тоже.

Наверх
#80060 - Tue Oct 18 2016 05:35 PM Re: Как создать блок "запоминаемое значение" ? [Re: Atomic]
ra81 Offline
Carpal Tunnel

Registered: Thu Sep 27 2012
Записи: 2860
чтобы с каждым баром не делалось, нужно писать только на последнем баре. В общем через кубики это головняк слегка.
_________________________
__


Наверх
#80062 - Tue Oct 18 2016 08:36 PM Re: Как создать блок "запоминаемое значение" ? [Re: ra81]
Atomic Offline
newbie

Registered: Mon Oct 10 2016
Записи: 27
ra81,

по обоим пунктам согласен. Через внешний скрипт надо. В общем, int запоминать уже получается. smile

Написать универсальный интовый кубик возможно, но это очень накладно по времени.

Наверх


Moderator:  ViL, sar