О, сколько нам открытий чудных!..
Сегодня попробовал прогнать алгоритм по историческим данным - не работает. С чего бы вдруг? Всегда работал, и вот опять. И изменения в коде были вроде как косметические. Причём внешне делает вид, что работает, но считав первые 70 строк из файла данных, остальные читать не хочет (их там порядка 6 миллионов). Чем занимается - непонятно. Стал разбираться - глаза на лоб: локальная переменная в main портится! Та самая, которая внутри бесконечного цикла крутится. Она у меня изменяется от 1 до 8 и управляет вызовом обработчиков. Для балансировки нагрузки на процессор обработчики вызываются со сдвигом: 4 раза в секунду – обработчик стека прерываний. Каждое нечётное срабатывание (2 раза в секунду) – обработчик стека заявок, каждое второе и шестое – секундный (не пересекаясь с 0.5-секундным), каждое восьмое – 2-секундный (не пересекаясь ни с секундным ни с 0.5-секундным). Всё это тыщу лет как отлажено и всегда работало без нареканий. Отключил все модули - работает. Стал подключать по одному - затыкается. И память вдруг стала жрать со страшной силой, раз в 10 больше, чем обычно. Стал выводить значение счётчика - ОБА-НА!
Код |
---|
1213456178121345617812134
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
USD: 0.00+0.00=0.00/0.00 V=0.00
EUR: 0.00+0.00=0.00/0.00 V=0.00
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
RES: 0.00+0.00=0.00/0.00 V=0.00
|
Отрубил всё к чертям собачьим, даже обнуление счётчика, и тут меня ожидал удар ниже пояса:
Код |
---|
277995
277996
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
277997
277998
277999
278000
USD: 0.00+0.00=0.00/0.00 V=0.00
278001
278002
EUR: 0.00+0.00=0.00/0.00 V=0.00
278003
278004
278005
278006
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
278007
278008
278009
RES: 0.00+0.00=0.00/0.00 V=0.00
278010
278011
|
Или, если оставить обнуление и только его:
Код |
---|
123456781
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
234
USD: 0.00+0.00=0.00/0.00 V=0.00
5678
EUR: 0.00+0.00=0.00/0.00 V=0.00
12345
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
6781
RES: 0.00+0.00=0.00/0.00 V=0.00
2
|
Теперь поясняю, что это значит: по OnStop у меня сбрасывается на диск дамп состояния портфеля и в лог выводится состояние кошелька по каждой валюте - вот это самое, что мы видим. Выводится, повторяю, В КОЛЛБЕКЕ: function OnStop()local i;for i=0,4 do F:write(string.format("%s: %1.2f+%1.2f=... А значение счётчика выводится В МЕЙНЕ! Получается, что OnStop в цикле между своими F:write отдаёт управление в main, а потом каким-то образом снова захватывает его себе или как? У меня просто крыша едет, в голове не укладывается, как вообще может такое происходить.
И тут меня осенило: в боевом режиме в цикле мейна стоит sleep(250), а при работе по историческим данным этой задержки нет (в результате чего двухмесячный тиковый массив пролетает за пару минут). Поставил туда sleep(1) и - О, ЧУДО!
Код |
---|
1234567812345
RUR: 0.00+50000.00=50000.00/0.00 V=50000.00
USD: 0.00+0.00=0.00/0.00 V=0.00
EUR: 0.00+0.00=0.00/0.00 V=0.00
FUT: 0.00+20000.00=20000.00/0.00 V=20000.00
RES: 0.00+0.00=0.00/0.00 V=0.00
|
Версия Квика СТАРАЯ, много раз по историческим данным работала, в Интернет вообще не входил, биржа не работает. Кто-нить может подсказать, ЧО ВАЩЕ ЗДЕСЬ ТВАРИЦЦА?!