Transaq
СБО "Transaq" => Подсистема ATF => Topic started by: dmitry_pf on Июля 16, 2013, 12:34:46 pm
-
Здравствуйте!
На основе примера из документации Transaq написал скрипт ATF сохранения данных в файл:
extern "string" filename = "export.txt";
var f;
var price;
function init()
{
f = new_object("file");
f.wopen(filename);
}
function calc()
{
price = open;
f.writeLn(price);
line[0] = 0;
}
Добавил на график. На всех интервалах нормально работает, данные сохраняются в файл и добавляются новые. При переключении интервалов, например с 5 мин. на 1 мин., данные в файле тоже обновляются.
Но при переключении на тиковый интервал выдает ошибку:
line 14: Попытка вызвать метод от переменной, не являющейся объектом
В представленном выше скрипте line 14 - это: f.writeLn(price)
В самом файле появляется только одна запись: 0
Что можно подправить в скипте, чтобы при тиковом интервале тоже осуществлялась запись в файл?
p.s. Иногда ошибку не выдает, но в файле все равно только одна запись: 0
При открытии Transaq, где сохранен график с данным скриптом (в тиковом интервале), ошибку выдает всегда
-
1. Сначала пустой график ставим в режим тиков.
2. устанавливаем скрипт:
extern "string" filename = "export.txt";
var f;
var price;
function init()
{
f = new_object("file");
f.wopen(filename);
}
function calc()
{
price = close;
f.writeLn(price);
line[0] = 0;
}
-
Если сначала график ставим в режим тиков, а потом добавляем скрипт – работает.
Но, если закрыть терминал, то при следующем открытии в сохраняемом файле появляется 0, и выдается та же самая ошибка: line 14: “Попытка вызвать метод от переменной, не являющейся объектом”
И это только по тиковому режиму, по остальным интервалам после перезапуска терминала ошибки не возникает!
Также возникает ошибка (в тиковом режиме) в начале каждой сессии!
Чтобы опять началось сохранение в файл тиков, надо опять переустанавливать скрипт.
Это не совсем удобно: при каждом перезапуске программы, переустанавливать скрипты по всем тиковым графикам.
Версия программы Transaq Trader 5.05.305.07, rev. 51, ATF 1.18 (Финам)
Почему именно по тиковым графикам при перезапуске терминала возникает ошибка “Попытка вызвать метод от переменной, не являющейся объектом”?
-
Для тиковых графиков не существует как такового понятия свечки, у них нет "open" - только close, а соответственно картина построения графика совсем кардинально другая, у тика и хай и лоу и опен - один и тот же, ...но да ладно....самое главное что он (тик) имеет "аморфное" какое - то представление только в онлайне.
А стало быть когда вы запускаете терминал - обращали внимание что на графике истории нет, на тиках, ровно так же как и новая сессия,... - эффект тот же.
Далее, загрузился терминал, или там сессия началась,....кто идет первым в бой ? Конечно же Init(), а она работает только когда есть самая первая свечка графика, именно для нее. А у нас что ? Пустота,....а что инит делает - конечно же она в первую очередь создает файл - в который мы будем писать цифры,...ну и..
Как говорится ради пустого места инит даже и палец о палец не ударит , а соответственно файл не создаст,....а тут Calc() сразу после прет(писать цифру),...и файлик требует, который не создан, вот и получается " пишем что- то не зная куда,... оперируем чем - то не зная чем".
А когда вы устанавливаете скрипт на новый график, то в любом случае хоть один тик и прошел, графически он есть - вот для него как раз Init() и вызывается. Тогда все по плану нормально работает.
-
Поставил close – та же самая ошибка
но за замечание по close – спасибо!
Действительно, при запуске терминала, на графике сначала «Нет данных», потом подгружаются данные и возникает ошибка “Попытка вызвать метод от переменной, не являющейся объектом”
Но файл-то создается! Значит Init() отрабатывает…
Потом в этом файле записывается 0
Как же он тогда без “первой свечки “ создает файл?
Но в целом, сбой, наверно, из за временного отсутствия первой свечки происходит…
Можно ли это предусмотреть как-то программно, а не каждый раз переустанавливать скрипт вручную?
А есть ли в ATF обработчик ошибок? (типа как в VBA “On Error GoTo”)
-
Ошибки могут быть разные - тысячи. поэтому их здесь учесть все невозможно, и для каждой функцию придумать тоже нет.
Ваша проблема "0" - в самом очевидном, я это тоже просмотрел сначала.
var price; - у вас это глобальная переменная. Помните что с ними происходит ? они сохраняют свои значения после перехода на новый тик. соответственно когда срабатывает калк - значение не сохранено и получается что записывается то - что было раньше в переменной, а это по умолчанию ноль.
А сохранится оно - только тогда, когда придет новый тик, ...причем вы будете думать что сохраняете второй тик - уже на втором тике, а сохранять будете всего лишь старый первый, который сохранился как раз при переходе ко второму тику и второму вызову калк.
Вот такие пироги.
Решение: static price; - первое .
Второе, Запуск индикатора как в примере tradingallowed, через какие- нибудь условия.
Ну и на самом деле отказаться от тиков ))))) - это в глобальном плане.
-
пробовал поставить static price, ошибка все равно возникала
добавил в код условия, ошибка появляться перестала, выгрузка в файл теперь начинается и после запуска терминала
extern "string" filename = "export.txt";
var f;
var price;
var flag;
function init()
{
if (flag !=1)
{
f = new_object("file");
f.wopen(filename);
f.close();
flag = 1;
}
}
function calc()
{
price = close;
f = new_object("file");
f.waopen(filename);
f.writeLn(price);
f.close();
line[0] = 0;
}
сначала в выгружаемый файл добавляется 0, а затем уже цены по каждому тику
правда выгрузка в файл стала очень медленной за счет того, что при каждом тике выполняется:
f = new_object("file");
f.waopen(filename);
но зато код стал рабочий!
Спасибо за подсказки!)
-
function init()
{
if (flag !=1)
{
f = new_object("file");
f.wopen(filename);
f.close();
flag = 1;
}
}
Init всего один раз в любом случае вызывается,...поэтому флаг по сути тут не нужен, ..
т.е. она как запускается он все равно удовлетворяет условиям (flag !=1) так как он с начала = 0, ...
соответственно даже если бы вы его не задали = 1 - все равно бы работало в том же режиме.
function init()
{
f = new_object("file");
f.wopen(filename);
f.close();
flag = 1;
}
Я про условия говорил в Calc(), что типо запускаться только через несколько секунд после загрузки инита,....или там функции : isHistoryCalculated(), onHistoryCalculated() и подобные, что используются в Init()
-
function init()
{
setInitCandles(1);
f = new_object("file");
f.wopen(filename);
f.close();
flag = 1;
}
Не проверял - но должно помочь.
-
попробовал
function init()
{
setInitCandles(1);
f = new_object("file");
f.wopen(filename);
}
при перезапуске скрипта выгружает данные без первой свечи, при перезапуске терминала выдает прежнюю ошибку
isHistoryCalculated() всегда дает значение false
onHistoryCalculated() ни разу не вызвалась… и сразу непонятно, куда ее прикручивать… в документации скудная информация…
-
при перезапуске терминала грохаются все объекты, созданные файлы,...а вот инит не срабатывает снова, так уж устроено. Я бы вам посоветовал галочку поставить "Переподключаться к серверу" в начале - когда логинитесь в транзаке, тогда терминал вообще можно не вырубать и переменные слетать не будут.
-
White Noise, в каком смысле при перезагрузке "всё грохает, а init больше не срабатывает"? Если что-то убивается при перезагрузке, то потом рассчет начинается с самого начала еще раз.
-
Абсолютно согласен, расчет идет но тут - же работает именно Calc(), которая заполняет массивы линий по истории, и далее потом по тикам уже в режиме реального времени. А Init() ? может я тесты не правильно проводил. но у меня она не срабатывала на новом запуске терминала при предустановленных индикаторах и сохраненной конфигурации окон.
-
Скорее всего как-то не так тест проводили. init() вызывается всегда первым делом, без нее никак. Она даже вызывается если просто период сменить, например, или докачать историю.
-
А на тиковых графиках ?
-
я то про тиковые говорил именно про ситуацию когда история не сохраняется,....как раз на тиковых и init и calc запускаются одновременно на первый тик, только пришедший ,...а если истории нет, то так и получается , что calc говорит что объект не создан.