nikolz написал: Плaтфopмa ничего не считает сама , а покупают дaнныe с биpж и у пocтaвщикoв дaнныx (вне биржевых, например, FOREX).
Специально для Вас ссылка на FAQ TradingView про TVC :
Цитата
Этот префикс не является признаком какой-либо биржи: TVC расшифровывается как «TradingView Charts» и означает, что данные рассчитываются TradingView. Мы берём их из комбинированного потока данных, который получаем из разных источников. После обработки , полученные данные отображаются на графиках в режиме реального времени и любой желающий может использовать их бесплатно.
спасибо за ссылку, но читайте далее: -------------------- Под префиксом TVC: обычно выступают CFD, а также инструменты на основе других, наиболее популярных инструментов, например, индексов и товаров: Индекс доллара США, S&P 500, золото и другие. Несмотря на то, что графики оригинальных инструментов и графики TVC внешне схожи, сравнивать их неправильно, так как у них разные источники данных.
nikolz написал: Правильно я понял, что свечи с таймом меньше дня считаются одинаково.Проблема только с дневными свечами. Верно?
Я пока что думаю, что дневки TradingView сама строит из младших свечек.
Относительно TradingView вы зблуждаетесь. Плaтфopмa ничего не считает сама , а покупают дaнныe с биpж и у пocтaвщикoв дaнныx (вне биржевых, например, FOREX). Это классический агрегатор. Они продают эти данные желающим (см. на их сайте цены подписки) в том числе и брокерам.
nikolz написал: Не знал что свечи можно формировать по разным алгоритмам Всегда считал что свеча - это 5 индикаторов, алгоритмы которых настолько примитивны. --------------- Ну если разработчики Квика умудрились изобрести новый алгоритм формирования свечей, то хотелось бы увидеть его. Или это тайна?
К сожалению, можно. Например, дневные свечи срочного рынка на TradingView начинаются от 19:05, а в квике от 9:00. Или, скажем, дневные свечки акций СПб биржи в квике строятся по часовому поясу мосбиржи, хотя ясное дело нужно строить по часовому поясу биржи, где торгуется исходная акция. Это влияет на цену закрытия дневки, т.к. реальное закрытие переносится на следующий день (в 0:59) в зимнее время США.
Правильно я понял, что свечи с таймом меньше дня считаются одинаково. Проблема только с дневными свечами. Верно? ------------------- Относительно начала в 19.05 и 9:00. Вроде бы это соответствует началу дневной сессии. В первом случае для фьючерсов, а во втором - для акций. Если это так, то это привязано к бирже. --------------------- из Вашего объяснения непонятно, чем алгоритм Квика отличается от алгоритма Мосбиржи или СПБ. -------------------- TradingView -- вообще ничего не рассчитывает - это Веб агрегатор. ------------------------- Tradingview показывает котировки от FXCM (известный прайм брокер) и еще ряда поставщиков. Вот эти поставщики и считают свечи. ------------------ Вообще-то, сравнивать Tradingview можно и то лишь с натягом не с QUIK, а с WEB-QUIK. Аналогично поездке на Гаити на пароходе или самолете. Вы были на Гаити?
Не знал что свечи можно формировать по разным алгоритмам Всегда считал что свеча - это 5 индикаторов, алгоритмы которых настолько примитивны. --------------- Ну если разработчики Квика умудрились изобрести новый алгоритм формирования свечей, то хотелось бы увидеть его. Или это тайна?
Владимир написал: nikolz, Лапуль, Вы ХОТЬ ЧТО-НИБУДЬ в программ ировании соображаете? С какого там класса нынешние школьники начинают изучать информатику? Вот в тот самый класс и загляните - надеюсь, объяснят.
Может просто признаете , что написали хрень. ---------------------------- Ах, да, Вы же самый крутой петух в этой курятне.
Не влияет. так как ответы от сервера приходят пакетами, то отсылал заявки с максимально возможной скоростью, примерно со скоростью до 100 в секунду. В результате почти положил сервер , так как отключили и предупредили, чтобы так не делал.
Если я что-нибудь в чём-нибудь понимаю, то сделка может быть либо активной либо пассивной, то есть это ОДИН бит информации, а здесь их ДВА. И что будем делать с состояниями 0x00 и 0x60?
0x00 - отмененное состояние. 0x60 - прикольно . Расскажите, как уместить 60 в два бита?
nikolz написал: Я отлаживаю свои dll в Scite. Отладил не одну сотню функций для работы в луа и не только для КВИК, но и других встраиваемых систем.В чем проблема?
Проблема описана в топике. Раньше было удобно ловить в отладчике плюсовые ошибки. Если есть что предложить по теме, прошу выложить инструкцию как с помощью Scite поймать в отладчике плюсовую ошибку при работе терминала. Указание числа отлаженных Вами функций считаю офтопом.
Выложите пример с ошибкой, попробую показать на Вашем примере.
Нуичточталексейужесуществует написал: Ну отладка через логирование у меня уже есть через нормальные lock-free очереди, вопрос не в этом. Раз заявляется поддержка LUA, необходимо предоставить и нормальные средства разработки. Пусть отладочный, заведомо неюзабельный в проде, терминал без символов, пусть какой-то mock на lua - свою же lua часть они как-то отлаживают? Всегда можно найти способ подходящий только для добросовестных разработчиков. Зачем провоцировать сообщество на взломы защит и распространение неофициальных релизов с подозрительными правками?
Я отлаживаю свои dll в Scite. Отладил не одну сотню функций для работы в луа и не только для КВИК, но и других встраиваемых систем. В чем проблема?
Cyber написал: Како же тормозной этот SearchItems. Или это у меня комп уже старый. Чтоб проверить 100 цен на наличие в них заявок уходит около минуты. Есть альтернативные методы?
Можно подробнее, что такое "Чтоб проверить 100 цен на наличие в них заявок "
У меня эта функция работает очень быстро. Покажите свой скрипт.
Информация к размышлению. Тестил скрипт на QLUA на демо сервере разработчиков. За 4 часа 250 тысяч заявок выставил и снял. Инструментов было 250. Потоки открывались из пула столько, сколько надо. чтобы не было очереди по инструменту. Максимальное число потоков получилось 12. ---------------- Проблем было ноль.
Время сервере брокера никак не привязано к работе сервера брокера. Наблюдал случаи когда время сервера запаздывало относительно биржи и сервера точного времени, но это не влияло на начало сессии. Данные с биржи просто транслируются клиентам. ------------------ вообще-то время сервера биржи и время компьютера я не использую в торговле. Я использую эти данные лишь для изучения потоков либо для обнаружения запаздывания данных по причине очередей либо глюкам на сервере брокера. -------------------- Начало сессии определяю по движению цен и появлению заявок.
еще замечу, что нестабильность времени компьютера связана со стабильностью его часов на плате. Для наглядности вот две картинки
На этой картинке погрешность показаний сервера точного времени, которые принимает компьютер. Очевидно, что среднее значение равно нулю так как ошибка симметрична относительно нуля. А максимальное отклонение в пределах 10 ms ========================= А это картинка усредненной погрешности часов компьютера, которые синхронизируются от сервера точного времени Очевидно, что погрешность имеет смещение и дрейф , которого нет в показаниях сервера. Это результат дебильной системы фазовой автоподстройки винды и нестабильность аппаратных часов на плате.
Serge123 написал: Чтобы при приёме заявок раньше встать в очередь, я синхронизирую часы Виндовс по атомным часам и проверяю это в сервисах типа time100.ru. Но всё равно возникают погрешности. Напр., утром эти сервисы, как правило, говорят (да ещё и каждый по-своему), что у меня точное время, а в 19 часов, что мои часы спешат на 0.3 сек... Можно ли как-то узнавать время точнее, напр., с точностью 5-10 мсек? Например, получая его с сервера брокера? Или более точно установить его в Виндовс? Регион - Ставропольский край (не сам Ставрополь).
Писал про это на форуме. Для более точной синхронизации надо настроить параметры винды. Как и что , можно почитать на сайте майкрософт. Но погрешность менее 10 ms будет в среднем.
Колбек вызывыется терминалом не после изменения таблицы, а перед ее изменением. т е сначала вызывается колбек, а потом эти данные обновляют соответствующую таблицу. ------------------------- Поэтому попытка прочитать изменения таблицы в колбеке всегда безрезультатна.
Serge123 написал: Subscribe_Level_II_Quotes на получение этой информации? Если не создавать табл. обезл. сделок, то скрипт получает только инфо по OnQuote...
Subscribe_Level_II_Quotes и OnQuote - это не сделки, а заявки.
Судя по откликам, писатели ничего не увидели интересного. Поэтому выскажу свое мнение. ------------ Про возможность конвертации данных из TXT в формат DAT и обратно. --------------------- Есть два случая, когда надо дописать данные в архив свечей в формате DAT. --- 1) Иногда в истории появляются пропущенные дни, которые хотелось бы восстановить. --- 2) Для тестирования алгоритмов на истории нужна история больше чем 3000 свечей, доступных с сервера. -- Пока единственный способ получить больше - это накапливать историю в реальном времени. -------------------- Да, в статье рассказываются проблемы (особенности ) работы брокеров с сервером. Но не стоит забывать, что все клиенты брокера получают инфу от этого сервера. проблемы сервера - проблемы клиентов. -------------- В статье есть два интересных момента. Первый касается загрузки данных по клиентам. Пусть и упрощенно, но показано, что клиенты могут курить бамбук многие минуты. ------------------ Второй момент связан с загрузкой состояния счетов, при которой блокируются остальные потоки. т е опять клиенты курят бамбук. --------------------- В статье говорится о скорости ядра в 2000 транзакций. Раньше читал о 1000. Писатели и буратины, могут просто посчитать сколько ждать ответки с биржи, когда рынок активно торгуется. ------------------------- Прикольно читать чистосердечные признания типа: Ничего не понял (не увидел, не внюхал). Всегда интересовало, зачем чел это пишет? Ну не понял, твоя проблема. Не интересует, не читай.
Открываете окна->монитор В этом окне делаете следующее: 1) выносите графики на второй монитор и Размещаете окна рядом. 2) Удаляете заголовки 3) Закрепляете ------------------ В результате :
написал: Здравствуйте, есть определенная сложность, поместить графики в отдельном окне (от окна терминала) графики с котировками, что бы их можно было бы переместить на другой монитор. В данный момент приходится пользоваться несколькими брокерами.
В чем сложность? У меня графики на втором мониторе без проблем
написал: Здравствуйте. Я клиент банка ПСБ. Сегодня на срочном рынке у меня сделок не было, а в Квике минус 13 контрактов на доллар. Последние сделки были вчера в вечернюю сессию. После возобновления торгов с 13.30 заявка на покупку даже одного контракта на доллар не ставилась, при попытке выставление заявки максимальное количество рассчитывалось. Мальцев Василий Николаевич +7(918)0332791 mvn5711@mail.ru
На срочном рынке дневная сессия начинается вчера вечером.
написал: Я, конечно, не знаю давность информации и конфигурацию оборудования, но вот это: " Пропускная способность не сильно производительного mssql сервера примерно 1500-2000 транзакций в секунду " вызывает сомнения. 20-30к в секунду - это нормально. Бывает и 200к.
А если взять другие базы данных, то там 100-200к - это просто норма, не говоря уже про документные базы. Если бы, для примера Quik был на NYSE, то при 1,5к - просто все встало бы. И, кстати, оставаться сейчас на транзакционной базе данных для прокси сервера, уже выглядит странно.
Так что, если это так, то все настолько печально, что даже уже не вызывает никаких эмоций прибитая гвоздями кодировка win-1251.
Вы немного путаете. В данном случае речь идет о сервере. Раньше читал выступление разработчиков QUIK в котором они сами говорили что их сервера обеспечивают скорость 1000 транзакций в секунду. Если стало лучше , то поправит.
Также необходимо помнить, что объём передаваемых данных в сторону клиентов, так и в QuikExporter ограничен для обеспечения стабильности работы.
Попробуем немного посчитать. У нас есть 10000 клиентов, у каждого из них 3 счёта в валюте (рубли, доллары, евро). Плюс к этому портфель на 30 бумаг. При этом лимиты у нас существуют в двух днях(Т0 и Т+). 10000*3*2+10000*30*2 = 60000+600000 = 660000 элементов. Пропускная способность не сильно производительного mssql сервера примерно 1500-2000 транзакций в секунду. Итого для загрузки информации о портфелях в промежуточную базу нужно 660000/2000 = 330 секунд, это 5 с половиной минут.
и это:
Ниже скрипт для автоматического разбора группы файлов из бинарного формата в человекочитаемый.
quik_candlefile_dat_parser.py
и это: Дело в том, что в момент начала фазы передачи данных таблиц MoneyLimits и DepoLimits, QUIK Exporter полностью блокирует приём любых данных кроме этих, до окончания передачи.
написал: Спасибо, я проверю на практике, но у меня закралось сомнение, что это не совсем тот маркет-мейкер, что нужно. Если не ошибаюсь тут маркет-мейкер - это не то, как была исполнена заявка(по рынку или как лимитная) , а как признак того, что заявка была выставлена участником маркет-мейкером.
Код
Из Вашего вопроса и следовало, что Вы хотите узнать участника. Чтобы получить нужный Вам ответ , пишите правильно вопросы.
написал: Добрый день! Подскажите где взять indicators.zip под lua 5.4. У меня часть индикаторов на 5.4. и вместе на одном графике они не уживаются с 5.3.
indicators.zip Это какой-то архив? Вы где его взяли? Вы думаете, что все должны знать, что у Вас в этом архиве?
Не нормальный. Если я хочу продать от 18 100, то не надо продавать существенно ниже этой цены. А это произойдет, если сразу будет сделка на 40 пунтов ниже.
написал: Задача такая. Есть график или стакан по одной акции. Нужно запустить скрипт и он должен отправить заявку по этой акции. Для заявки нужен sec_code. sec_code должен браться автоматом от графика или стакана. Графики и стаканы привязаны якорем к таблице с акциями.
функция getDataSourceInfo() работает как и говорилось. Вот пример как ваша хотелка. График подключен якорем к ТТТ щелкаем в ТТТ строку с инструментом. Он появляется на графике, а в окошке выводится код инструмента этой функцией.
написал: Установил тейк-профит 18 100, отступ 2, спред -2. На открытии был взлёт и падение цены. Заявка выставлена по 18 063 и исполнена по 18 084. Не лучший тут алгоритм.
ИМХО, надо чтобы цена выставлялась не ниже чем тейк-профит минус отступ минус спред. Это в случае если цена резко скакнёт против. В остальном случае будет как сейчас.
Алгоритм нормальный. У Вас есть лучше, с интересом почитаю, как он реально работает. Как задали , так и получили. Кроме того, все зависит от задержки выставления заявки по тейку. И Вы в очереди не первый.
local sec_code = getSecurityInfo(tiker_id, "SEC_CODE")
message("Название акции: " ..sec_code)
дает ошибку attempt to concatenate a nil value (local 'sec_code')
почему это не работает((( что за проклятье как тяжело получить этот SEC_CODE
============================== Вы не ту функцию взяли. Читайте внимательнее. вам выше специально скопировал из документации ------------------ функция getDataSourceInfo, а у Вас getSecurityInfo ------------------------ getSecurityInfo Функция предназначена для получения информации по инструменту. Формат вызова: TABLE getSecurityInfo (STRING class_code, STRING sec_code) Функция возвращает таблицу Lua с параметрами Таблицы инструментов.
написал: Присвоил графику идентификатор WWWbond. Код работает. Выдает число свечек.
x = getNumCandles('WWWbond') message('x= ' ..x) Пытаюсь разными способами получить по этому идентификатору WWWbond sec_code. Никак не получается, такая возможность вообще есть?
Функция предназначена для получения информации об источнике данных для индикатора.
TABLE info getDataSourceInfo()
Функция возвращает таблицу Lua с параметрами:
ВАЖНО! Для корректной работы функции getDataSourceInfo, вызываемой из функции Init, необходимо перезапустить Рабочее место QUIK после добавления индикатора на график.
Параметр
Тип
Описание
interval
NUMBER
Текущий интервал (тайм-фрейм) графика
class_code
STRING
Код класса источника данных
sec_code
STRING
Код инструмента источника данных
param
STRING
Наименование параметра Таблицы текущих торгов, по которому строится график. Если поле пустое, то график строится на основании Таблицы обезличенных сделок
написал: Недавно был удивлен, ставил айсберг примерно 1% от дневного оборота по акции кусочками по 100 лотов. До этого всегда думал, что если по этой же цене стоит кто-то еще за тобой, то между кусочками айсберга его пропустят вперед твоего очередного кусочка, при удовлетворении заявки. А тут кто-то крупный бахнул по рынку и мой айсберг почти полностью съел, но не весь, а тот чел так и остался за мной. Но самое удивительной, что в потоке обезличенных сделок эта сделка прошла одной строкой в несколько тысяч контрактов. Это как? Я вообще думал, что айсберги, как и стопы, хранятся на сервере брокера и отправляются на биржу по мере исполнения кусочков? Пусть даже это ММ шалит и убрал свою же заявку перед тем как бахнуть по моей. Но в потоке сделок должны же быть видны все кусочки айсберга?
Tue Aug 29 11 : 21 : 47 2023 , getDepo Ex currentbal = 0.0
Tue Aug 29 11 : 21 : 47 2023 ,выставляем заявку
Tue Aug 29 11 : 21 : 48 2023 , getDepo Ex currentbal = 10.0
Tue Aug 29 11 : 21 : 48 2023 ,OnDepolimit currentbal = 10.0
1 строка - до выставления заявки 2 строка выставили заявку по рынку и купили 3 строка getDepoEx ответ в колбеке 4 строка - колбек OnDepoLimit -------------------- Резюме: Задержка менее 1 секунды. .
И вот результат: 1 29.08.2023 13:16:35 OnInit - инициализация функции main 15702.911 2 29.08.2023 13:19:40 (162) Заявка на покупку N 38404828165 зарегистрирована (1 удовлетворено). 3 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.112 ... 8 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.145 9 29.08.2023 13:19:40 OnOrder - новая заявка или изменение параметров существующей заявки 15888.149 10 29.08.2023 13:19:40 OnOrder - новая заявка или изменение параметров существующей заявки 15888.151 11 29.08.2023 13:19:40 OnTrade - новая сделка 15888.152 12 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.155 ... 17 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.185 18 29.08.2023 13:19:45 OnDepoLimit - изменение бумажного лимита 15893.151 ... 23 29.08.2023 13:19:45 OnDepoLimit - изменение бумажного лимита 15893.168 24 29.08.2023 13:20:08 (163) Заявка на продажу N 38404864243 зарегистрирована (1 удовлетворено). 25 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15915.868 ... 36 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15915.934 37 29.08.2023 13:20:08 OnOrder - новая заявка или изменение параметров существующей заявки 15915.958 38 29.08.2023 13:20:08 OnOrder - новая заявка или изменение параметров существующей заявки 15915.961 39 29.08.2023 13:20:08 OnTrade - новая сделка 15915.962 40 29.08.2023 13:20:08 OnMoneyLimit - изменение денежного лимита 15915.964 ... 45 29.08.2023 13:20:08 OnMoneyLimit - изменение денежного лимита 15915.994 46 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15915.995 ... 57 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15916.039
Строки 17 и 18 - это покупка бумаги. Как раз та самая 5-секундная пауза, которую я и наблюдаю. Обратите внимание, строки 45, 46 - это продажа бумаги. Паузы уже нет. Это реальный счет, не демо. Пример для покупки SBER.
Серегей, Я вам выложил скрипт и результат. У меня никаких запаздываний нет. ------------------------ Как я понял теперь у Вас другая проблема. Раньше вы писали о задержке между таблицей и функцией getDepoEx ------------ Теперь Вы лукавите, это у вас другая задержка ------------------------------- Если хотите, то выложите свой скрипт я его проверю.
Посмотрите Выше мое сообщение от 29.12.2022 20:34:14 относительно Вашего теста. Он работает без проблем. Если что-то не так, то выложите скрипт для теста проверю еще раз.
nikolz написал: Гадать нет смысла, а запустить у себя Ваш скрипт нет возможности.Но ,без обид,уверен, что ошибка Ваша, а не КВИКА.
Сто процентов не у меня! Какая нахрен ошибка? Один и тот же скрипт с утра и с вечера по разному заработал! В скрипте ничего не меняется. Один и тот же код, один и тот же цикл - то выводит, то не выводит. Я скажу так. В курсе вообще как и когда обновление окна происходит надеюсь. WM_PAINT это его дело! Так вот при при щелчке мышки в окне, WM_SIZE срабатывает, его разрабы написали, что он обрабатывает его, при этом все данные от SetCell попадают туда, куда надо - в буфер, а далее InvalidateRect или UpdateWindow, что вызывает WM_PAINT, где и перерисовывается таблица. Тож самое при щелчке мышкой WM_LBUTTONDOWN только срабатывает. Так вот а когда и как срабатывает WM_PAINT для окна, когда мы не щёлкаем, не меняем размер окна, когда окно просто на экране и ничего с ним не делаем? Вот это пусть разрабы и ответят. Об этом я их уже сколько прошу? Нет ответа никакого. Думаю вот если проблема не закроется - писать прогу, чтобы слала в окно сообщение WM_SIZE из вне с определённой переодичностью. Т.е. насильно извне заставить обработать WM_PAINT/ Может так и заработает, но при условии, что все данные от SetCell уже есть в нужном буфере. А если они не в буфере из которого идёт обновление таблицы, а "болтаются" неизвестно где, мало ли как у них там это реализовано?, промежуточные буфера, очереди и прочее, тогда ничего и так не получится!
если хотите выложите скрипт я могу его запустить на демо сервере и сказать Вам конкретно.
paths = "D:/nkarray/"
package.cpath =paths.."?.dll";
require"nkarray"
require"nkthread"
path = "D:/QUIK_SCRIPT/nk_bot/"
event=nkevent.Create("event");
local acc="NL0011100043"
local firmid="NC0011100000"
local firmid_f="SPBFUT000000"
local Client_code="10590"
local acc_f="SPBFUT000ie"
local sec_code="SBER"
local class_code="QJSIM"
Order_buy = {
["ACTION"]="NEW_ORDER",
["ACCOUNT"] = tostring(acc),
["CLIENT_CODE"] = Client_code,
["TYPE"] = "M",
["TRANS_ID"] = 0,
["CLASSCODE"] = class_code,
["SECCODE"] = sec_code,
["OPERATION"] = "B",
["PRICE"] = "0",
["QUANTITY"] = "1",
["EXPIRY_DATE"]="TODAY",
}
function main()
local f=0;
local trans_id=1;
while true do
nkevent.wait(event); --ждем события
local z=getDepoEx(firmid, Client_code,sec_code,acc,0); --или 2
if z then z=z.currentbal;
Log:write(os.date()..",getDepoEx currentbal="..tostring(z).."\n"); Log:flush();
end
if f==0 then
Log:write(os.date()..",выставляем заявку\n"); Log:flush();
Order_buy.TRANS_ID=tostring(trans_id);
local res = sendTransaction(Order_buy);
if res ~="" then message("Ошибка транзакции:"..res) else trans_id=trans_id+1; end
f=1;
local z=getDepoEx(firmid, Client_code,sec_code,acc,0).currentbal;
Log:write(os.date()..",getDepoEx currentbal="..tostring(z).."\n"); Log:flush();
-- f=0;
end
end
end
function OnDepoLimit(t)
sec=t.sec_code -- STRING Код инструмента
acc=t.trdaccid --STRING Счет депо
firm=t.firmid --STRING Идентификатор фирмы
client=t.client_code-- STRING Код клиента
cur=t.currentbal -- NUMBER Текущий остаток
Log:write(os.date()..",OnDepolimit currentbal="..tostring(cur).."\n"); Log:flush();
nkevent.Set(event);
end
function OnInit(pfile)
path = getScriptPath();
Log=io.open(path.."/forum_test.log","w") --лог файл
fconnect=isConnected();
end
function OnParam(c,s)
nkevent.Set(event);
end
nikolz написал: Выше я выкладывал скрипт, который тестировал. И все там обновляется.
С утра запущены 4 скрипта абсолютно одинаковые. Выставлены разные переменные просто. Все 4 скрипта сейчас идеально всё выводят в ячейку и показывают last синхронно с ТТТ. При этом код сейчас крутится в вышеприведённом цикле(так как last в определённом диапазоне). При выходе из этого диапазона идёт выход из цикла и из функции и попадаем в main() в цикл while(так как уже в другом диапазоне last). Там во while тоже идёт вывод в ячейку last, но только уже в другую и нихрена уже ничего не выводит! Щёлкнишь мышкой по строке - данные обновятся. Или размер окна дёрнешь - обновятся. Опять попадает last в нужный диапазон, опять вызов функции и в repeat цикл и опять всё обновляется. Вчера было всё НАОБОРОТ!!! while обновлял ячейку, repeat нет.
Гадать нет смысла, а запустить у себя Ваш скрипт нет возможности. Но ,без обид,уверен, что ошибка Ваша, а не КВИКА.