Transaq
СБО "Transaq" => Подсистема ATF => Topic started 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 и в любом случае исправляйте тройной вызов инита.
-
Вчера принудительно обновился мой Transaq до:
Transaq 5.05.303.02, rev.51, ATF 1.15
У меня тоже перестали работать мои индикаторы.
Например, в окне вывода ATF пишется ошибка:
Indicator, line 43: Встретился нечисловой параметр в арифметическом выражении
При этом в строчке 43 стоит оператор else{
-
Установил на два компа. На первом всё нормально, на втором те же индикаторы не работают. Windows XP. Позвонил +78002004400 (доб.2222) : 1)обновление принудительное, отката не будет; 2) Когда будут исправления - неизвестно.
Вот тебе и обновление - за что боролись на то и напоролись...
Ещё косяк: графики в офлайне не открываются.
-
Вчера принудительно обновился мой 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.
-
else if, если ее заменить на if, то работает, но логика немного меняется. Сделал просто в качестве эксперимента, чтобы докопаться до истины. Странно, почему вдруг перестало работать. Косяк явно где-то в софте.
Можете привести конкретный пример кода, где конструкция else if не работает?
П.С:
А вообще, странная нумерация. Я сначала подумал, что это даунгрейд, поскольку 1.15 меньше, чем 1.8 (1.80). По логике либо ATF должна быть уже 2.0, либо тогда предыдущая версия должна была быть 1.08.
Да, с этим согласны, недодумали. В дальнейшем исправимся.
Насчет file.close() будем смотреть, пока не ясно.
-
else if, если ее заменить на if, то работает, но логика немного меняется. Сделал просто в качестве эксперимента, чтобы докопаться до истины. Странно, почему вдруг перестало работать. Косяк явно где-то в софте.
Можете привести конкретный пример кода, где конструкция else if не работает?
Легко :)
Берем пример из документации (Impulse System) и заменяем второй if на else if. После такой замены скрипт на экран ничего не выводит.
#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;
}
}
-
...на втором те же индикаторы не работают.Ещё косяк: графики в офлайне не открываются.
Ошибку исправил, заменив везде "&&" на "and".
Графики в офлайне не открываются. Выдаёт сообщение:" Произошла неизвестная ошибка. Обратитесь в службу тех. поддержки". Обращаюсь.
-
mega_traider, спасибо! Сам бы не за что не догнал, что ошибка из-за else if.
-
mega_traider, спасибо! Сам бы не за что не догнал, что ошибка из-за else if.
Пожалуйста.
Только вот понять бы еще почему. Но здесь уже только разработчики смогут сказать, в чем дело.
Без else if обойтись, конечно, можно, используя if, но придется флаги лепить, чего делать не хочется.
Самая засада в том, что обновление принудительное и использовать предыдущую версию нельзя :(
Ждем ответа от разработчиков.
-
Для справки скрипт, который демонстрирует сабжевые глюки (file.close и тройной запуск инита) не содержит ни одного "else if"
-
Heller, воспроизвелись сабжевые глюки или тестовые примеры нужны?
-
Извиняюсь, что долго отвечал - было много багфиксинга.
В том числе насколько могу судить поправлено все перечисленное в этой ветке, за исключением проблем с оффлайновой работой Интре - эту ошибку не удалось воспроизвести.
Скоро в Финаме будет глобальное обновление клиентов - можно подождать его, либо написать на support@transaq.ru и в индивидуальном порядке попросить новую сборку.
-
Скоро в Финаме будет глобальное обновление клиентов - можно подождать его, либо написать на support@transaq.ru и в индивидуальном порядке попросить новую сборку.
А клиентам "не Финама" можно надеяться на обновление или оно специфичное и только для Финама?
-
... графики в офлайне не открываются.
Ошибку исправил, удалив папку cache2.
[/quote]
-
А клиентам "не Финама" можно надеяться на обновление или оно специфичное и только для Финама?
Нет, данное обновление не является специфичным только для Финам
Напишите мне в личку Вашего брокера
-
С неделю назад у Финама появилась304.01. Это то самое глобальное обновление? else if и file.close там исправлено? тройной запуск инита например нет. правда теперь не 3 а 2 раза инит срабатывает при запуске скрипта
-
Да, ошибки закрыты. Многократный вызов инита буде еще править.
-
Да, ошибки закрыты. Многократный вызов инита буде еще править.
Зато слетели все конфигурации >:(
-
В каком смысле слетели? В чем это выражается?
-
До обновления в окнах графика были индикаторы, скрипт с роботом и прочие.
После обновления, графики есть, а индикаторы, линии и робот пропали.
При этом конфигурацию я не сохранял и не менял, дата у файлов недельной давности.
Пытаюсь загрузить конфигурацию, указываю какой файл выбрать и ничего не происходит.
-
и пропали все скрипты
-
Уважаемые разработчики, перешел пару дней на последнюю финамовскую версию с ATF 1.18, т.е. на 5.05.305.0.7
При запуске скрипта - по прежнему скрипт при запуске выполняет инит 2 раза ( для справки у меня 3 графика с автозапускаемыми скриптами).
Т.е. этот мегастарый глюк Вы пока победить не смогли...
-
ddd323, да, пока не победили. Но сейчас появились идеи как можно победить, так что в ATF 1.20 уже скорее всего победим.
Пока кстати можно бороться с багом штатными средствами - например, используя функцию onStopIndicator выполнять какую-то чистку/освобождение ресурсов. Перед тем как индикатор пересчитается, она будет позвана в любом случае.
-
ddd323, а вообще в чем именно возникает проблема с этой функцией init? Её многократный вызов связан с тем, что по приходу каждой порции истории скрипт пересчитывается заново, и на самом деле это не init много раз вызывается, а сам скрипт может рассчитываться несколько раз сначала.
Это конечно выглядит как странное поведение, но в действительности я не очень понимаю чем это мешает - просто вместо одного запуска программы, получается что программа запускается, потом закрывается, потом запускается заново. По идее кроме небольшой дополнительной нагрузки при старте это не должно приводить к каким-то проблемам.
Вы можете описать конкретнее к каким именно негативным последствиям в вашем коде приводит такое поведение? Возможно это можно решить как-то по-другому?
-
Да нет никаких проблем. Были бы - давно уже бы громко ругался ;)
Только лишние строчки во вспомогательных логах, да необходимость периодически обдумывать после очередных дописок в инит, что будет, если этот код выполнится несколько раз с обрывами исполнения предыдущего раза в произвольном месте.
Но ваша фраза "на самом деле это не init много раз вызывается, а сам скрипт может рассчитываться несколько раз сначала" настораживает... Означает ли она, что во время очередного запуска скрипта может выполнится не только инит, но еще и calc() или onHistoryCalculated() , а потом еще раз скрипт запустится и опять дойдет до исполнения calc()/onHistoryCalculated() ???
Просто если речь только об ините, то Вы правы, поиметь большие проблемы наверное невозможно, т.к. возможность исполнять/снимать заявки из инита заблаговременно убрана ;) Но если до calc()/onHistoryCalculated() может доходить - то я писать код с такой "устойчивостью" писать пока не умею.
Т.е. реальных проблем пока нет, и, наверное, (если речь только об ините!!!), раз у вас это не баг, а особенность работы в рамках текущей архитектуры - можно ограничится описанием этой особенности в документации и больше не париться. Ибо конечно всё, что по ошибочному восприятию инита как функции "запускающейся при запуске скрипта" хочется засунуть в инит, можно засунуть, например, в onHistoryCalculated() или выделить в калке/onNewCandle спецзону "первый после запуска скрипта запуск калке/onNewCandle" и поместить туда. Но если, опять же onHistoryCalculated() может несколько раз подряд вызваться - это уже мегапроблема. (Вдруг я туда какие-либо счетчики с накоплением поставил. Зачем - не знаю - это я фантазирую. Или более реальное - кто-то, использующий сложные системы условных и активных заявок, понимая, что может произойти разрыв с сервером скажем на 1 минуту, очевидно, захочет после запуска скрипта после восстановления соединения понять текущую ситуацию, загрузить таблицу заявок и сделок, понять, что исполнилось, по каким ценам, что нет, что нужно срочно снимать и пр.)
-
Да, именно так. При приходе новой порции истории, скрипт выполняется целиком: вначале init(), затем calc() на каждую свечку и в конце onHistoryCalculated(). Если история при загрузке приходит в несколько порций, то это будет выполнено несколько раз.
-
Провел сегодня эксперимент на часовом графике Газпрома. Действительно, график грузится порциями. В начале каждой выполняется init(), в конце каждой выполняется onHistoryalculated(). Получилось 10 порций, то есть график пересчитывался от начала до конца 10 раз.
Открыто 13 графиков. На каждом индикатор на основе Зигзага и кое-что по мелочи - MACD, ATR, Volume и т.п. Сессия стартует 13 минут, в течение которых АРМ висит и ни ручкой, ни ножкой. Немного неудобно, особенно если торговоля уже началась.
Не понятно, почему так получается. Порции данных ведь формирует ваш же сервер. Почему они не договорятся с АРМом, когда история по-настоящему закончилась?
-
Да, сейчас посмотрели, в принципе это можно переделать. Сделаем.
-
После того как сделаете - onHistoryCalculated перестанет вызываться несколько раз при запуске скрипта?
Просто на практике точно может возникать необходимость делать в onHistoryCalculated торговые операции (по результатам анализа текущей ситуации после разрыва соединения), и, если эта особенность многократного вызова сохранится - придется геммороится с сохранением в файл флага, позволяющего определить, что это не первый запуск onHistoryCalculated до первого вызова onNewCandle (чего не очень хочется).
-
Да, когда сделаем, всё будет вызываться только один раз.
Кстати, флаг можно сохранять не в файл - использование переменных окружения удобнее на мой взгляд.
-
А они разве сохраняют свои значения при перезапуске терминала Транзак? Если - нет, то файл универсальней.
-
Да, если смотреть с позиций нескольких перезапусков терминала, то тогда да - файл лучше подходит конечно же.