Transaq

СБО "Transaq" => Подсистема ATF => Topic started by: ddd323 on 09.07.2012, 21:46:39

Title: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 09.07.2012, 21:46:39
Блин, да еще 1.15 сделали в Финами обязательным обновлением... У меня все скрипты перестали работать.  :'( Я xml архивом не пользуюсь, сам с файлами работаю. Открываю файл на чтение в ините, потом закрываю, потом октрываю на wopen и пишу по мере работы скрипта. В частности есть запись в этот файл и в самом конец инита. (В общем все как у вас в тестово м примере на вики "Сохранение данных в файл" + запись в файл в конце инита). В 1.8 все нормально работало.
А теперь похоже file.close() перестало работать. В чем проявляется:
1)  при запуске скрипта - по прежнему скрипт при запуске выполняет инит 2-3 раза (старый глюк, я надеялся в 1.15 исправился. для справки у меня 3 графика с автозапускаемыми скриптами), так вот при чтении из файла с переменными при втором запуске инита (при первом запуске - он мне все  переменные нормально заполняет) мне заполняет переменные пустыми местами. Вывод запись в файл в конце инита не состоялась корректно. Возможно потому, что файл плохо закрылся или "недооткрылся". Проверяем эту гипотезу:
2) пытался это лечить следующим образом (ниже кусок инита):
file.ropen();  // это было в изначальном скрипте
чтение переменных из файла;  // это было в изначальном скрипте
file.close();  // это было в изначальном скрипте
while(file.isopen()) {file_log.writeLn(getFormattedDateTime(getServerTime())+": не успело закрыть");}
file.wopen();  // это было в изначальном скрипте
запись переменных в файл // это было в изначальном скрипте
file.close();
В результате транзак при запуске графики не открывает - там пустые места а в лог - в другой открытый файл  (file_log) пишет "не успело закрыть". я пару минут, пока она мне в файл 100 МБ накатало подождал. В общем не успело оно за 2 минуты файл закрыть...
В общем получается, что файл действительно не закрывается после чтения

Но увы не все так просто. Если закомментарить while - После 3-го запуска инита вызывается (быстрее чем через 2 минуты) onNewCandle , в конце которого тоже стоит сохранение в файл, а в начале (при первом запуске onNewCandle ) file.wopen(). И при этом, правда с глюками (переменные==0 не сохраняет, не смотря на использование as_string(переменная)) сохранение работает.
Т.е. - есть альтернативная гипотеза - при втором/третье вызове инита некорректно работает file.ropen из-за слишком быстрого подряд вызова. Но почему не работает - может потому что file.close(), которое в конце инита не успевает исполниться, или вообще не работает?  ;)
Ибо, если его file.close() из конца инита убрать, т.е. когда file.close() точно не работает - наблюдаются те же эффекты.
И опять же в 1.8 то же выполнение инита 3 раза подряд не мешало корректно работать и открывать файл на чтение, даже несмотря на то, что он был в состоянии "открыт на запись" (file.close() в конце инита не было) перед вторым и третьим запуском инита.

Проверяйте file.close и в любом случае исправляйте тройной вызов инита.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: mega_traider on 10.07.2012, 09:03:47
Вчера принудительно обновился мой Transaq до:
Transaq 5.05.303.02, rev.51, ATF 1.15

У меня тоже перестали работать мои индикаторы.
Например, в окне вывода ATF пишется ошибка:
Indicator, line 43: Встретился нечисловой параметр в арифметическом выражении
При этом в строчке 43 стоит оператор else{
Title: Re: При переходе с 1.8 на 1.15
Post by: Андерс on 10.07.2012, 09:36:23
   Установил на два компа. На первом всё нормально, на втором те же индикаторы не работают. Windows XP. Позвонил +78002004400 (доб.2222) : 1)обновление принудительное, отката не будет; 2) Когда будут исправления - неизвестно.
   Вот тебе и обновление - за что боролись на то и напоролись...

Ещё косяк: графики в офлайне не открываются.
Title: Re: При переходе с 1.8 на 1.15 перестали работать индикаторы
Post by: mega_traider on 10.07.2012, 17:23:53
Вчера принудительно обновился мой Transaq до:
Transaq 5.05.303.02, rev.51, ATF 1.15

У меня тоже перестали работать мои индикаторы.
Например, в окне вывода ATF пишется ошибка:
Indicator, line 43: Встретился нечисловой параметр в арифметическом выражении
При этом в строчке 43 стоит оператор else{

Частично разобрался в чем дело.
Во-первых. Ошибку показывает не на той строчке, то есть если в логе пишется строка 23, то надо смотреть строку 20, т.е сдвиг на 3 строки почему-то. У меня в коде ошибок нет, это выяснилось в ходе экспериментов.
Во-вторых, перестали работать те индикаторы, в которых имеется конструкция else if, если ее заменить на if, то работает, но логика немного меняется. Сделал просто в качестве эксперимента, чтобы докопаться до истины. Странно, почему вдруг перестало работать. Косяк явно где-то в софте.


П.С:
А вообще, странная нумерация. Я сначала подумал, что это даунгрейд, поскольку 1.15 меньше, чем 1.8 (1.80). По логике либо ATF должна быть уже 2.0, либо тогда предыдущая версия должна была быть 1.08.
Title: Re: При переходе с 1.8 на 1.15 перестали работать индикаторы
Post by: Heller on 10.07.2012, 19:00:15
Quote
else if, если ее заменить на if, то работает, но логика немного меняется. Сделал просто в качестве эксперимента, чтобы докопаться до истины. Странно, почему вдруг перестало работать. Косяк явно где-то в софте.
Можете привести конкретный пример кода, где конструкция else if не работает?

Quote
П.С:
А вообще, странная нумерация. Я сначала подумал, что это даунгрейд, поскольку 1.15 меньше, чем 1.8 (1.80). По логике либо ATF должна быть уже 2.0, либо тогда предыдущая версия должна была быть 1.08.
Да, с этим согласны, недодумали. В дальнейшем исправимся.


Насчет file.close() будем смотреть, пока не ясно.
Title: Re: При переходе с 1.8 на 1.15 перестали работать индикаторы
Post by: mega_traider on 10.07.2012, 20:03:30
Quote
else if, если ее заменить на if, то работает, но логика немного меняется. Сделал просто в качестве эксперимента, чтобы докопаться до истины. Странно, почему вдруг перестало работать. Косяк явно где-то в софте.
Можете привести конкретный пример кода, где конструкция else if не работает?
Легко :)
Берем пример из документации (Impulse System) и заменяем второй if на else if. После такой замены скрипт на экран ничего не выводит.
Code: [Select]
#line 0 nodraw
#line 1 nodraw
#line 2 hist
 
extern ma_period = 13;
extern macd1 = 12;
extern macd2 = 26;
extern macd_signal = 9;
 
function init()
{
   setInitCandles(1);
   setBounds(2, 1, 0);
}
 
function calc()
{
    line[0] = MovAvg(ind_ema, ma_period, pt_close);
    line[1] = IndRef("macdhistogram", macd1, macd2, macd_signal,
      ind_ema, ind_ema, ind_ema, pt_close)[0];
 
   if (line[0] > line[0][-1] && line[1] > line[1][-1]) {
      line[2] = 1;
   }
   else if (line[0] < line[0][-1] && line[1] < line[1][-1]) {
      line[2] = -1;
   }
}
Title: Re: При переходе с 1.8 на 1.15
Post by: Андерс on 11.07.2012, 06:00:04
...на втором те же индикаторы не работают.Ещё косяк: графики в офлайне не открываются.
  Ошибку исправил, заменив везде "&&" на "and".
  Графики в офлайне не открываются. Выдаёт сообщение:" Произошла неизвестная ошибка.  Обратитесь в службу тех. поддержки". Обращаюсь.
Title: Re: При переходе с 1.8 на 1.15 перестали работать индикаторы
Post by: alxand on 11.07.2012, 14:45:42
mega_traider, спасибо! Сам бы не за что не догнал, что ошибка из-за else if.
Title: Re: При переходе с 1.8 на 1.15 перестали работать индикаторы
Post by: mega_traider on 11.07.2012, 15:26:02
mega_traider, спасибо! Сам бы не за что не догнал, что ошибка из-за else if.
Пожалуйста.
Только вот понять бы еще почему. Но здесь уже только разработчики смогут сказать, в чем дело.
Без else if обойтись, конечно, можно, используя if, но придется флаги лепить, чего делать не хочется.
Самая засада в том, что обновление принудительное и использовать предыдущую версию нельзя :(
Ждем ответа от разработчиков.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 11.07.2012, 23:38:04
Для справки скрипт, который демонстрирует сабжевые глюки (file.close и тройной запуск инита) не содержит ни одного "else if"
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 13.07.2012, 12:37:36
Heller, воспроизвелись сабжевые глюки или тестовые примеры нужны?
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 18.07.2012, 11:26:56
Извиняюсь, что долго отвечал - было много багфиксинга.

В том числе насколько могу судить поправлено все перечисленное в этой ветке, за исключением проблем с оффлайновой работой Интре - эту ошибку не удалось воспроизвести.

Скоро в Финаме будет глобальное обновление клиентов - можно подождать его, либо написать на support@transaq.ru и в индивидуальном порядке попросить новую сборку.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Shubert on 20.07.2012, 03:05:59
Скоро в Финаме будет глобальное обновление клиентов - можно подождать его, либо написать на support@transaq.ru и в индивидуальном порядке попросить новую сборку.

А клиентам "не Финама"  можно надеяться на обновление или оно специфичное и только для Финама?
Title: Re: При переходе с 1.8 на 1.15
Post by: falcone on 21.07.2012, 09:03:15
... графики в офлайне не открываются.
  Ошибку исправил, удалив папку cache2.
[/quote]
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: klimov on 23.07.2012, 09:30:58
А клиентам "не Финама"  можно надеяться на обновление или оно специфичное и только для Финама?
Нет, данное обновление не является специфичным только для Финам
Напишите мне в личку Вашего брокера
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 01.08.2012, 12:41:26
С неделю назад у Финама появилась304.01. Это то самое глобальное обновление? else if и file.close там исправлено? тройной запуск инита например нет.  правда теперь не 3 а 2 раза инит срабатывает при запуске скрипта
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 01.08.2012, 14:25:44
Да, ошибки закрыты. Многократный вызов инита буде еще править.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: nxz on 02.08.2012, 18:43:47
Да, ошибки закрыты. Многократный вызов инита буде еще править.

Зато слетели все конфигурации >:(
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 03.08.2012, 12:32:41
В каком смысле слетели? В чем это выражается?
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: nxz on 03.08.2012, 12:38:23
До обновления в окнах графика были индикаторы, скрипт с роботом и прочие.
После обновления, графики есть, а индикаторы, линии и робот пропали.
При этом конфигурацию я не сохранял и не менял, дата у файлов недельной давности.
Пытаюсь загрузить конфигурацию, указываю какой файл выбрать и ничего не происходит.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: nxz on 03.08.2012, 20:00:16
и пропали все скрипты
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 13.02.2013, 23:51:48
Уважаемые разработчики, перешел пару дней на последнюю финамовскую версию с ATF 1.18, т.е. на 5.05.305.0.7

При запуске скрипта - по прежнему скрипт при запуске выполняет инит 2 раза ( для справки у меня 3 графика с автозапускаемыми скриптами).
Т.е. этот мегастарый глюк Вы пока победить не смогли...
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 14.02.2013, 10:16:38
ddd323, да, пока не победили. Но сейчас появились идеи как можно победить, так что в ATF 1.20 уже скорее всего победим.

Пока кстати можно бороться с багом штатными средствами - например, используя функцию onStopIndicator выполнять какую-то чистку/освобождение ресурсов. Перед тем как индикатор пересчитается, она будет позвана в любом случае.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 14.02.2013, 10:47:09
ddd323, а вообще в чем именно возникает проблема с этой функцией init? Её многократный вызов связан с тем, что по приходу каждой порции истории скрипт пересчитывается заново, и на самом деле это не init много раз вызывается, а сам скрипт может рассчитываться несколько раз сначала.

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

Вы можете описать конкретнее к каким именно негативным последствиям в вашем коде приводит такое поведение? Возможно это можно решить как-то по-другому?
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 14.02.2013, 23:18:11
Да нет никаких проблем. Были бы - давно уже бы громко ругался  ;)
Только лишние строчки во вспомогательных логах, да необходимость периодически обдумывать после очередных дописок в инит, что будет, если этот код выполнится несколько раз с обрывами исполнения предыдущего раза в произвольном месте.
Но ваша фраза "на самом деле это не init много раз вызывается, а сам скрипт может рассчитываться несколько раз сначала" настораживает... Означает ли она, что во время очередного запуска скрипта может выполнится не только инит, но еще и calc() или onHistoryCalculated() , а потом еще раз скрипт запустится и опять дойдет до исполнения calc()/onHistoryCalculated()   ???
Просто если речь только об ините, то Вы правы, поиметь большие проблемы наверное невозможно, т.к. возможность исполнять/снимать заявки из инита заблаговременно убрана ;) Но если до calc()/onHistoryCalculated()   может доходить - то я писать код с такой "устойчивостью" писать пока не умею.

Т.е. реальных проблем пока нет, и, наверное, (если речь только об ините!!!), раз у вас это не баг, а особенность работы в рамках текущей архитектуры - можно ограничится описанием этой особенности в документации и больше не париться. Ибо конечно всё, что по ошибочному восприятию инита как функции "запускающейся при запуске скрипта" хочется засунуть в инит, можно засунуть, например, в onHistoryCalculated() или выделить в калке/onNewCandle спецзону "первый после запуска скрипта запуск калке/onNewCandle" и поместить туда. Но если, опять же onHistoryCalculated()  может несколько раз подряд вызваться - это уже мегапроблема. (Вдруг я туда какие-либо счетчики с накоплением поставил. Зачем - не знаю - это я фантазирую. Или более реальное - кто-то, использующий сложные системы условных и активных заявок, понимая,  что может произойти разрыв с сервером скажем на 1 минуту, очевидно, захочет после запуска скрипта после восстановления соединения понять текущую ситуацию, загрузить таблицу заявок и сделок, понять, что исполнилось, по каким ценам, что нет, что нужно срочно снимать и пр.)
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 15.02.2013, 10:04:30
Да, именно так. При приходе новой порции истории, скрипт выполняется целиком: вначале init(), затем calc() на каждую свечку и в конце onHistoryCalculated(). Если история при загрузке приходит в несколько порций, то это будет выполнено несколько раз.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: aq2003 on 15.02.2013, 13:25:55
Провел сегодня эксперимент на часовом графике Газпрома. Действительно, график грузится порциями. В начале каждой выполняется init(), в конце каждой выполняется onHistoryalculated(). Получилось 10 порций, то есть график пересчитывался от начала до конца 10 раз.

Открыто 13 графиков. На каждом индикатор на основе Зигзага и кое-что по мелочи - MACD, ATR, Volume и т.п. Сессия стартует 13 минут, в течение которых АРМ висит и ни ручкой, ни ножкой. Немного неудобно, особенно если торговоля уже началась.

Не понятно, почему так получается. Порции данных ведь формирует ваш же сервер. Почему они не договорятся с АРМом, когда история по-настоящему закончилась?
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 15.02.2013, 15:27:19
Да, сейчас посмотрели, в принципе это можно переделать. Сделаем.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 17.02.2013, 14:46:46
После того как сделаете - onHistoryCalculated перестанет вызываться несколько раз при запуске скрипта?
Просто на практике точно может возникать необходимость делать в onHistoryCalculated торговые операции (по результатам анализа текущей ситуации после разрыва соединения), и, если эта особенность многократного вызова сохранится - придется геммороится с сохранением в файл флага, позволяющего определить, что это не первый запуск onHistoryCalculated до первого вызова onNewCandle (чего не очень хочется).
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 18.02.2013, 09:06:39
Да, когда сделаем, всё будет вызываться только один раз.

Кстати, флаг можно сохранять не в файл - использование переменных окружения удобнее на мой взгляд.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: ddd323 on 18.02.2013, 11:21:16
А они разве сохраняют свои значения при перезапуске терминала Транзак? Если - нет, то файл универсальней.
Title: Re: При переходе с 1.8 на 1.15 похоже перестал работать file.close()
Post by: Heller on 18.02.2013, 15:59:46
Да, если смотреть с позиций нескольких перезапусков терминала, то тогда да - файл лучше подходит конечно же.