Transaq

СБО "Transaq" => Подсистема ATF => Topic started by: Heller on Марта 17, 2014, 11:08:49 am

Title: Сборка 336.22
Post by: Heller on Марта 17, 2014, 11:08:49 am
Сделали новую сборку, главное отличие которой от прошлых - переработанный механизм сборки мусора в памяти в ATF. У ряда пользователей были проблемы с тем, что за день или несколько дней работы ATF съедал всю память, предположительно в этой сборке проблема должна быть решена:

http://transaq.ru/cl_files/v508/508Trader.336.22.zip

Переработка довольно сложная, поэтому пока это сборка тестовая, было бы полезно, если бы пользователи, которые сталкивались с проблемой "out of memory" или подобными проблемами с памятью, попробовали её и сообщили исчезла ли проблема.
Title: Re: Сборка 336.22
Post by: alexejshevchenko on Марта 21, 2014, 11:30:13 am
Здравствуйте.
С новой сборкой не работает следующий код:

function onKeyDown(var id){

var order=new_object("hash");
order["condvalue"]=111;
signal::alertMultiple(order["condvalue"]);

}

Т.е. проблема с созданием "хэша".
Робот загнулся из-за этого ((
Title: Re: Сборка 336.22
Post by: Heller on Марта 21, 2014, 04:43:58 pm
Да, мы уже нашли ошибку, эту тему удалю, в понедельник будет новая сборка.
Title: Re: Сборка 336.22
Post by: falcone on Марта 25, 2014, 12:38:31 pm
Когда будет обновление?
Title: Re: Сборка 336.22
Post by: falcone on Марта 28, 2014, 11:54:25 am
Уважаемый Heller! В какой понедельник будет новая сборка?
Title: Re: Сборка 336.22
Post by: klimov on Марта 31, 2014, 01:42:06 pm
Новая сборка здесь

http://transaq.ru/cl_files/v508/508Trader.336.24.zip
Title: Re: Сборка 336.22
Post by: Андерс on Марта 31, 2014, 05:37:33 pm
За 30 минут транзак так  и не загрузился. Пришлось откатиться.
Title: Re: Сборка 336.22
Post by: Anatoly Utkin on Апреля 01, 2014, 10:35:31 am
Да вроде работает все, навскидку. И с памятью стало намного гуманней. 
Title: Re: Сборка 336.22
Post by: Heller on Апреля 01, 2014, 10:43:15 am
В каком смысле так и не загрузился?
Title: Re: Сборка 336.22
Post by: Андерс on Апреля 01, 2014, 02:13:38 pm
Попробовал ещё раз без загрузки экрана. Вроде нормально. Жаль всё вручную пришлось восстанавливать.
Title: Re: Сборка 336.22
Post by: alexejshevchenko on Апреля 04, 2014, 10:55:42 am
что-то не особо радует сборка...
на одном компьютере вообще подключение не устанавливается.
На другом память так же улетает. за в секунду по несколько Мб.

Вот участок кода из calc() который в этом виновен

        var ids = getAllOrderIDs();
      var z_id;
      while (ids.size() > 0) {
         z_id = ids.shift();
         var z = getOrder(z_id);
         if (z["secid"] != ins["secid"]) {
            continue;
         }
         if (z["status"] == OS_WATCHING) {
         return;

         }
      }

если его убрать, то всё хорошо

P.S. Методом последовательной итерации было выявлено, что это из-за функции  getOrder()
Title: Re: Сборка 336.22
Post by: Heller on Апреля 04, 2014, 04:25:38 pm
То что память тратится большой проблемы нет - сборщик мусора запускается время от времени и память очищает (хотя по состоянию в диспетчере задач этого не будет видно, т.к. память остаётся зарезервированной для дальнейшего использования). Так что улетевшие несколько мегабайт в конце концов вернутся.

Вы кстати используете сборку 336.24? В ней исправлены серьёзные ошибки нового сборщика мусора.
Title: Re: Сборка 336.22
Post by: alexejshevchenko on Апреля 04, 2014, 05:40:41 pm
Да, я использую последнюю версию. Но когда в диспечере задач память доходит до 2 Гб, то Transaq вылетает с ошибкой и создаётся файл Crash Report нулевого размера.
Title: Re: Сборка 336.22
Post by: Heller on Апреля 07, 2014, 10:04:27 am
Можете прислать ваш скрипт на support@transaq.ru?
Title: Re: Сборка 336.22
Post by: alexejshevchenko on Апреля 07, 2014, 10:12:25 am
Уважаемый Heller, проверьте, пожалуйста, последнюю сборку.

Приложил скрины. На них видно, что за 2 минуты "скушало" 10 Мб. Сборка 5.08.336.24 rev 55.
Мне ОЧЕНЬ нужно чтобы данный робот работал. Вы понимаете, что с этим связаны деньги.
Если нужна какая-то помощь - Вы только скажите. Я знаю что язык ATF поддерживается только разработчиками, но на нём всё же работают люди. Так что прошу помочь всем нам ))
Title: Re: Сборка 336.22
Post by: Heller on Апреля 08, 2014, 01:24:17 pm
Такой дополнительный вопрос. Я нашёл проблему, связанную с тем, что сборщик мусора работает только для индикатора, непосредственно добавленного на график. То есть если индикатор использует IndRef для пользовательских индикаторов, активно использующих память, то сборщик мусора для этих внешних индикаторов не будет запускаться, а это поправлю. Посмотрите в своём коде, не тот ли это случай?

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

Таким образом если во время расчета индикатора во время каждой свечи происходит примерно одинаковое количество сделок и на каждую сделку выделяется примерно одинаковое количество объектов, память постепенно будет очищаться (примерная формула x_{n+1} = (x_n+D)/2, легко увидеть, что предел по затратам памяти всегда D).

По всей видимости на каждую последующую сделку в вашем скрипте требуется всё больше и больше памяти, что приводит к означенной проблеме. Вероятно раньше на ранних сборках этого не наблюдалось, т.к. в принципе ранее на каждый объект требовалось в среднем раза в четыре меньше памяти, нежели сейчас.

Но в любом случае пока кажется, что проблема в вашем скрипте. Не исключено, конечно, что ошибка всё же у нас, а ваш скрипт на неё всё же нарывается, но пока я никак не могу ничего подобного воспроизвести. Если пришлёте ваш скрипт, то вероятно я что-то найду.
Title: Re: Сборка 336.22
Post by: alexejshevchenko on Апреля 08, 2014, 02:17:04 pm
Я не использую IndRef. В скрипте просчитывается свой индикатор и выводится на график.
Мне кажется дело не в этом...
Сегодня на демо счёте тестировал новую стратегию на 4 бумагах. Функция getActiveOrderIDs() не работает, т.е. при активной отложенной заявке возвращает 0. Поэтому у меня на каждом тике проверяется наличие заявки:

var ids = getAllOrderIDs();
      var z_id;
   
      while(ids.size()>0){
         z_id=ids.shift();
         var z=getOrder(z_id);
         if(z["secid"]!=ins["secid"]){continue;}
         if(z["status"]==OS_WATCHING || z["status"]==OS_FORWARDING || z["status"]==OS_ACTIVE){
            return;
         }
}

Всё работает нормально, память уходит медленно, но я допустил ошибку и у меня выставилось по несколько сотен заявок сразу по 4 бумагам, т.е. в сумме около 1000 заявок. Я их сразу же удалил, исправил и память стала улетать десятками Мб в секунду.

Я уже вынес все переменные в глобальную область видимости, но всё равно. Такое ощущение, что переменная при каждом проходе цикла записывается в новую ячейку памяти.
Title: Re: Сборка 336.22
Post by: ddd323 on Апреля 08, 2014, 02:35:05 pm
а может просто переменную z сделать глобальной типа static? будет всего одна постоянно перезаписываемая (вместо сотен или тысяч вновь созданных за одну свечу - до следующей уборки мусора).
кстати, а зачем на каждом тике запрашивать массив ВСЕХ заявок - может стоит запоминать id только нужных (требующих отслеживания) заявок и проверять периодически их статус. Даже если их 100 одновременно и статус их нужно знать на каждом тике - с точки зрения памяти это может быть более экономным.
Title: Re: Сборка 336.22
Post by: alexejshevchenko on Апреля 08, 2014, 03:01:09 pm
Я уже делал глобальные static переменные.
Конечно можно и так сделать. Но надо же ошибки ATF исправлять ))
Title: Re: Сборка 336.22
Post by: Heller on Апреля 16, 2014, 03:25:50 pm
Попробуйте вот это обновление:

http://transaq.ru/cl_files/v508/508Trader.336.25.zip