Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?
Октября 07, 2024, 06:26:18 pm
Начало Помощь Поиск Войти Регистрация
Новости:

Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Ошибка при записи в файл тиковых данных « предыдущая тема следующая тема »
Страниц: [1] 2 Печать
Автор Тема: Ошибка при записи в файл тиковых данных  (Прочитано 9202 раз)
dmitry_pf
Newbie
*
Сообщений: 8


Просмотр профиля Email
« : Июля 16, 2013, 12:34:46 pm »

Здравствуйте!

На основе примера из документации Transaq написал скрипт ATF сохранения данных в файл:

Code: [Select]
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, где сохранен график с данным скриптом (в тиковом интервале), ошибку выдает всегда
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #1 : Июля 17, 2013, 05:06:39 am »

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;
}
Записан
dmitry_pf
Newbie
*
Сообщений: 8


Просмотр профиля Email
« Ответ #2 : Июля 17, 2013, 09:28:09 am »

Если сначала график ставим в режим тиков, а потом добавляем скрипт – работает.

Но, если закрыть терминал, то при следующем открытии в сохраняемом файле появляется 0, и выдается та же самая ошибка: line 14: “Попытка вызвать метод от переменной, не являющейся объектом”

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

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

Версия программы Transaq Trader 5.05.305.07, rev. 51, ATF 1.18 (Финам)

Почему именно по тиковым графикам при перезапуске терминала возникает ошибка “Попытка вызвать метод от переменной, не являющейся объектом”?
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #3 : Июля 17, 2013, 10:44:25 am »

Для тиковых графиков не существует как такового понятия свечки, у них нет "open" - только close, а соответственно картина построения графика совсем кардинально другая, у тика и хай и лоу и опен - один и тот же, ...но да ладно....самое главное что он (тик) имеет "аморфное" какое - то представление только в онлайне.

А стало быть когда вы запускаете терминал - обращали внимание что на графике истории нет, на тиках, ровно так же как и новая сессия,... - эффект тот же. 

Далее, загрузился терминал, или там сессия началась,....кто идет первым в бой ? Конечно же Init(), а она работает только когда есть самая первая свечка графика, именно для нее.  А у нас что ? Пустота,....а что инит делает - конечно же она в первую очередь создает файл - в который мы будем писать цифры,...ну и..
Как говорится ради пустого места инит даже и палец о палец не ударит , а соответственно файл не создаст,....а тут Calc() сразу после прет(писать цифру),...и файлик требует, который не создан, вот и получается " пишем что- то не зная куда,... оперируем чем - то не зная чем".

А когда вы устанавливаете скрипт на новый график, то в любом случае хоть один тик и прошел, графически он есть - вот для него как раз Init() и вызывается. Тогда все по плану нормально работает.


 
Записан
dmitry_pf
Newbie
*
Сообщений: 8


Просмотр профиля Email
« Ответ #4 : Июля 17, 2013, 11:14:00 am »

Поставил close – та же самая ошибка
но за замечание по close – спасибо!

Действительно, при запуске терминала, на графике сначала «Нет данных», потом подгружаются данные и возникает ошибка “Попытка вызвать метод от переменной, не являющейся объектом”

Но файл-то создается! Значит Init() отрабатывает…
Потом в этом файле записывается 0

Как же он тогда без “первой свечки “ создает файл?
Но в целом, сбой, наверно, из за временного отсутствия первой свечки происходит…

Можно ли это предусмотреть как-то программно, а не каждый раз переустанавливать скрипт вручную?

А есть ли в ATF обработчик ошибок? (типа как в VBA  “On Error GoTo”)
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #5 : Июля 17, 2013, 01:46:03 pm »

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

Ваша проблема "0" - в самом очевидном, я это тоже просмотрел сначала.

var price; - у вас это глобальная переменная. Помните что с ними происходит ? они сохраняют свои значения после перехода на новый тик. соответственно когда срабатывает калк - значение не сохранено и получается что записывается то - что было раньше в переменной, а это по умолчанию ноль.
А сохранится оно - только тогда, когда придет новый тик, ...причем вы будете думать что сохраняете второй тик - уже на втором тике, а сохранять будете всего лишь старый первый, который сохранился как раз при переходе ко второму тику и второму вызову калк.

Вот такие пироги.

Решение: static price;  - первое .

Второе, Запуск индикатора как в примере tradingallowed, через какие- нибудь условия.

Ну и на самом деле отказаться от тиков ))))) - это в глобальном плане.


 
Записан
dmitry_pf
Newbie
*
Сообщений: 8


Просмотр профиля Email
« Ответ #6 : Июля 17, 2013, 02:53:01 pm »

пробовал поставить static price, ошибка все равно возникала

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

Code: [Select]
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, а затем уже цены по каждому тику
правда выгрузка в файл стала очень медленной за счет того, что при каждом тике выполняется:
 
Code: [Select]
f = new_object("file");
  f.waopen(filename);

но зато код стал рабочий!

Спасибо за подсказки!)
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #7 : Июля 17, 2013, 03:51:48 pm »

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()
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #8 : Июля 17, 2013, 04:01:03 pm »

function init()
{
   setInitCandles(1); 

   f = new_object("file");
   f.wopen(filename);
   f.close();
   flag = 1;
 
}

Не проверял - но должно помочь.
Записан
dmitry_pf
Newbie
*
Сообщений: 8


Просмотр профиля Email
« Ответ #9 : Июля 17, 2013, 05:14:38 pm »

попробовал
function init()
{
   setInitCandles(1); 
   f = new_object("file");
   f.wopen(filename);
     
}
при перезапуске скрипта выгружает данные без первой свечи, при перезапуске терминала выдает прежнюю ошибку

isHistoryCalculated() всегда дает значение false

onHistoryCalculated() ни разу не вызвалась… и сразу непонятно, куда ее прикручивать… в документации скудная информация…
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #10 : Июля 18, 2013, 05:02:16 am »

при перезапуске терминала грохаются все объекты, созданные файлы,...а вот инит не срабатывает снова, так уж устроено.  Я бы вам посоветовал галочку поставить "Переподключаться к серверу" в начале - когда логинитесь в транзаке, тогда терминал вообще можно не вырубать и переменные слетать не будут.
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #11 : Июля 22, 2013, 06:54:49 pm »

White Noise, в каком смысле при перезагрузке "всё грохает, а init больше не срабатывает"? Если что-то убивается при перезагрузке, то потом рассчет начинается с самого начала еще раз.
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #12 : Июля 23, 2013, 05:46:39 am »

Абсолютно согласен, расчет идет но тут - же работает именно Calc(), которая заполняет массивы линий по истории, и далее потом по тикам уже в режиме реального времени. А Init() ? может я тесты не правильно проводил. но у меня она не срабатывала на новом запуске терминала при предустановленных индикаторах и сохраненной конфигурации окон. 
Записан
Heller
Разработчики
Hero Member
*****
Сообщений: 1277


Просмотр профиля Email
« Ответ #13 : Июля 24, 2013, 09:36:42 am »

Скорее всего как-то не так тест проводили. init() вызывается всегда первым делом, без нее никак. Она даже вызывается если просто период сменить, например, или докачать историю.
Записан
White Noise
Full Member
***
Сообщений: 164


White Noise

ICQ Messenger - 411196569
Просмотр профиля Email
« Ответ #14 : Июля 24, 2013, 01:08:19 pm »

А на тиковых графиках ?
Записан
Страниц: [1] 2 Печать 
Transaq  |  СБО "Transaq"  |  Подсистема ATF  |  Topic: Ошибка при записи в файл тиковых данных « предыдущая тема следующая тема »
Перейти в:  


Войти

Powered by MySQL Powered by PHP Powered by SMF 2.0.10 | SMF © 2006-2008, Simple Machines LLC Valid XHTML 1.0! Valid CSS!