Sergey Gorokhov (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 77 След.
Написание автономного бота
 
Цитата
Mixa написал:
Как в этом случае будут загружаться лимиты? После запуска какого из шлюзов?

Сервер не будет отправлять пользователю лимиты по тем инструментам, которые ему недоступны.
Если инструмент есть хотя бы по одному (любому) доступному пользователю классу, то тогда лимит отправится.
Проверка доступности это отдельная история.
Например если есть два шлюза которые транслируют одинаковые инструменты, но разные фирмы, то пользователь увидит лимиты только по той фирме которая у него в правах, даже если все остальные параметры лимита идентичны.
Если же фирмы одинаковые, и инструменты одинаковые, но по первому шлюзу прав на классы нет (ни на один), а по второму есть (хотя бы на один), то даже если первый шлюз придет раньше, клиент не получит лимита пока не приедет второй шлюз.
Есть и еще куча подобных примеров "если". Все они сводятся к тому что сервер не будет отправлять пользователю лимиты по тем инструментам которые пользователь видеть не должен.
Цитата
Mixa написал:
А код клиента?
И код клиента.

Цитата
Mixa написал:
Для решения задачи этого и не требуется. Грубо говоря, нам нужно уведомление, что лимиты по конкретному рынку загружены, но, поскольку в QUIK нет такого понятия "рынок", нужно делать привязку к чему-то другому.
К чему?

Цитата
Mixa написал:
Вы же сами пишите, что сервер может транслировать не все лимиты, которые на него загружены:
Да верно, может отправить не все.
А если так:
узнать когда количество загруженных строк в таблице будет равно количеству на сервере в том состоянии которое доступно пользователю в данный момент.
Написание автономного бота
 
Цитата
Mixa написал:
Кажется понимаю, что вы хотите сказать: в таблицах depo_limits и futures_client_holding нет параметра "Класс". Вы об этом?

Вот именно, что там нет такого параметра.
Причина в том что
Цитата
Sergey Gorokhov написал:
Одна бумага может быть в разных классах и даже на разных биржах.

Цитата
Mixa написал:
Можно сделать привязку к фирме или счету. Если я правильно понимаю, технически это равнозначно:"Загрузка всех лимитов на фондовой секции" == "загрузка лимитов по всем классам фондовой секции" == "загрузка лимитов по всем trdaccid, привязанным к фондовой площадке" == "загрузка лимитов по всем firmid, привязанным к фондовой площадке"

На фондовом и Валютном рынках, сервер выбирает лимиты для отправки по фирме и коду клиента (не торговому счету)
А на срочном, по фирме и торговому счету (НЕ коду клиента)
Код клиента и торговый счет это абсолютно разные вещи. Так на фондовом рынке по одному торговому счету могут торговать сотни клиентов. А на срочном только один.
На всех рынках может быть одна фирма, а могут быть разные. Если делать привязку к фирме, нет абсолютно никаких гарантий что true будет именно по нужной секции.
Банальный пример, срочный и фондовый рынки объединены в одну фирму, isLimitsLoaded(firmid) вернет true, по какому рынку?
Со счетом может быть еще сложнее т.к. на том же СПБ и MOEX счета могут совпадать, а фирмы нет.
Только связка фирма + торговый счет (или код клиента) вернет правильное значение, но опять же без класса, без рынка.

Чем предложенный вариант не устаревает?
Цитата
Sergey Gorokhov написал:
узнать когда количество загруженных строк в таблице будет равно количеству на сервере в том состоянии которое есть в данный момент.
Написание автономного бота
 
Цитата
Mixa написал:
Я укажу только НУЖНЫЕ мне. Мне даже не надо перечислять все классы, а только по одному классу каждой секции, на которой скрипт торгует.

Сделать задуманное означает реализовать/создать привязку лимита к классам. Проще говоря, чтобы по каждому лимиту, где то хранился список классов.
Как уже было сказано сейчас такой привязки просто нет, ни в сервере ни в терминале, и никогда не было.
Хранить где-то такой список ради одной функции явно выглядит нецелесообразным.
Написание автономного бота
 
Цитата
Mixa написал:
А если подумать?
В фондовой секции 236 классов, Вы хотите все их указывать? А если класс прекратит свое существование скрипт сломается.
Например, EQBR никто годами не верил что этот класс исчезнет, но он же исчез.
Лимиты не привязаны к классам, думать тут нечего, так было всегда.
Одна бумага может быть в разных классах и даже на разных биржах.
Написание автономного бота
 
Цитата
Mixa написал:
isLimitsLoaded("TQBR")
Это не будет работать по простой причине, лимиты не привязаны к классу.
Возможно только узнать об окончании загрузки в терминал сразу по всем данным в таблице (отдельно по срочной отдельно по фондовой секциям), т.е. без привязки к классу или бумаге.
Грубо, узнать когда количество загруженных строк в таблице будет равно количеству на сервере в том состоянии которое есть в данный момент.
Такой вариант устроит? Если да готовы зарегистрировать пожелание в соседней ветке
Написание автономного бота
 
Цитата
Старатель написал:
Что такое "идеальные условия" в данном контексте? Это когда позиции загружены на сервер до начала торгов, они верные, не требуют корректировки.

"идеальные условия" - Это когда позиции загружены на сервер до начала торгов, они верные, не требуют корректировки. И сам терминал подключен к серверу тоже до начала торгов, а скрипт начинает всю работу только после начала торгов (например по времени или смотреть статус в ТТП, или кто-то смотрит ТВС или еще какие-то способы).
Учитывая что терминал был подключен до торгов, то к началу торгов он уже точно получил все что было на сервере, а значит сам скрипт может получить данные по лимитам или не получить и тогда их нет (нет позиций). И тогда никакой признак уже не нужен и так все ясно. На клиентские терминалы лимиты грузятся точно не дольше нескольких секунд. Даже на менеджерских терминалах с миллионами записей на загрузку в терминал уходит не больше нескольких десятков минут.

Цитата
Старатель написал:
Можем ли мы сейчас определить их при "идеальных условиях". Надёжно - нет, вы сами признали.
Про "идеальные условия" было сказано только то что признак вообще не нужен.
Написание автономного бота
 
Цитата
Старатель написал:
Этот вариант не рабочий от слова совсем.
Почему не рабочий? Ведь им пользуются значит рабочий.
То что не надежный, так это и не скрывается.
Вопрос был что надежней. Только внештатные ситуации и могут дать ответ на этот вопрос.
В идеальных условиях и вопроса о признаке бы не возникло, не так ли.
Получить дату закрытия реестра по дивидендам
 
Уточните про какую таблицу и параметр в терминале QUIK идет речь?
Пустой brokerref в OnTransReply ACTION = "KILL_ORDER"
 
Sergey,
Да верно.
Пустой brokerref в OnTransReply ACTION = "KILL_ORDER"
 
Sergey,

В транзакции KILL_ORDER нет такого параметра CLIENT_CODE
то что Вы его туда написали, ничего не значит, он просто игнорируется
При снятии заявки перемерт account пустой
 
Цитата
BlaZed написал:
PS: Ради интереса сейчас поочередно убирал разные параметры при снятии заявок и наблюдал снимется ли заявка. Оказывалось что SECCODE тоже не нужен, а вот CLASSCODE обязателен.Я искренне удивлен.
SECCODE тоже может быть не нужен.
Но это не всегда так. На некоторых рынках есть классы в которых нумерация заявок идет в разрезе инструментов, а не классов.
Т.е. есть ситуации когда у разных инструментов одного класса номера заявок могут совпадать. И при этом это совершенно разные заявки

CLASSCODE нужен всегда т.к. сервер должен понимать по какому рынку отправляется транзакция (читай в какую ТС ее послать)
При снятии заявки перемерт account пустой
 
Здравствуйте,
В транзакции на снятие заявки нет такого параметра ACCOUNT, да он и не нужен.
То что Вы его указали, просто игнорируется.
Пример транзакции из документации:
CLASSCODE=TQBR; SECCODE=RU0009024277; TRANS_ID=5; ACTION=KILL_ORDER; ORDER_KEY=503983;
Написание автономного бота
 
Mixa,

Ок, еще пример.
Упомянутый sys_events, в документации на P2 сказано что он приходит после окончания загрузки данных на клиента, т.е. в данном случае на сервер, а не терминал QUIK
допустим он попал на сервер утром до торгов, сервер его запомнил с тем чтобы отправить Вам в isLimitsLoaded
Вы ведь этого хотите не так ли?
А что дальше. Ведь событие из sys_events оно одно на всех клиентов, а не отдельно по каждому.
Вы посреди дня запускаете терминал QUIK и запускаете Ваш скрипт.
Терминал подключается к серверу, начинает качать данные и сообщает скрипту isLimitsLoaded=true, т.е. на сервере все лимиты действительно загружены
Что изменится от того что есть сейчас?
Информация на терминал о Вашем лимите еще не пришла (т.к. только подключились).
О том придет Ваш лимит в конце концов или нет скрипт не знает и не узнает даже если будет знать что на сервере все лимиты загружены.
Да благодаря sys_events скрипт будет знать что на сервере все лимиты есть и опять же скрипту придется ждать прокачки данных (то что и сейчас)
Но опять же скрипт не узнает когда эта прокачка закончится, а значит может ждать вечно (ни или то что уже было предложено, делать условие выхода)
Получается sys_events может позволить решить проблему только если рабочее место подключится к серверу ДО старта шлюза срочного рынка.


Цитата
Mixa написал:
Sergey Gorokhov , какое место вы занимаете в компании и почему решение о "надежности" функционала принимаете вы, а не программисты, которые явно лучше вас в этом разбираются?
Вам было уже сказано что этому вопросу уже очень и очень много лет, и решение уже давным давно принято.
По этой причине предлагается альтернативное решение
Написание автономного бота
 
Цитата
Mixa написал:
Напишите хоть один вариант, который по вашему мнению, будет НЕ МЕНЕЕ НАДЕЖНЫМ, чем предложенный мной. Условия указаны: скрипт должен определить начальные лимиты по корзине бумаг, в т.ч. по тем, по которым позиции не открыты (=0), прежде чем запустится алгоритм торговли.

Вам прямым текстом было сказано что надежного варианта нет.
Цитата
Sergey Gorokhov написал:
Спрашивать как его сделать в этом вопросе бесполезно, т.к. надежных способов нет.

Любой вариант НЕ надежен.
Есть только два пути:
1) Придумывать новый НЕ надежный вариант и наткнуться на новые проблемы
2) Использовать старый тоже НЕ надежный вариант, но зато проблемы старые и известные
Из этого следует что п2 "не менее надежный" чем п1 хотя бы тем что с п2 мы знаем с какими проблемами можем столкнуться.
Для примера, "плохие" варианты уже были озвучены:
Цитата
Sergey Gorokhov написал:
Допустим брокер загрузил пачку, isLimitsLoaded вернет true, а именно Ваши лимиты брокер не загрузил, а загрузит их чуть позже. Ваш код в этой ситуации примет решение что лимитов нет (нулевые) а на самом деле они будут позже.

Цитата
Sergey Gorokhov написал:
А значит, Вам легко может приехать строка содержащая 0, а потом через некоторое время нормальное значение.
В аналогичной ситуации цикл из п2 "дождется" лимитов и скрипт нормально отработает.

Можно и дальше придумывать примеры, ограничено это только воображением.

Цитата
Mixa написал:
Если вы скинете мне документ, описывающий процедуру загрузки лимитов, то я смогу ответить более конструктивно.

Документация на рабочее место QUIK, глава "Операции брокера" - "Операции над позициями"
Timer Resolution и sleep(1)
 
Цитата
Андрей написал:
Что ж, тогда вопрос разработчикам, может стоить сделать этот механизм штатно управляемым? Штатно значит всегда работает не менее 15.6мс..
Как Вы верно подметили Вы сами уже сейчас можете поменять таймер через WinAPI.
Написание автономного бота
 
Цитата
Mixa написал:
Если их не будет, что скрипту ждать?
Если не будет значит ждать пока появятся.
Можно добавить какое-либо условие выхода из ожидания, например по времени.
Вариантов масса.
Главное определиться с условиями.


Цитата
Mixa написал:
Допустим, у нас есть функция isLimitsLoaded. В чем по-вашему ожидание сигнала while isLimitsLoaded(class_code) do будет "не надежным"? Какой именно "неверный результат" выдаст "предложенное решение"?
В приведенной Вами цитате, речь выше была не про фьючерсные позиции, а про фондовые.
Так что и ответ будет про фондовые.
Как быть если брокер в течении дня грузит позиции?
Пример, сервер подняли без лимитов.
Подняли шлюзы.
Брокер начинает грузить позиции, будет он их грузить пачками или все сразу ему самому решать.
В результате сервер не знает сколько позиций брокер будет грузить. Не знает окончился процесс или нет. Вдруг брокеру через час захочется загрузить еще?
Допустим брокер загрузил пачку, isLimitsLoaded вернет true, а именно Ваши лимиты брокер не загрузил, а загрузит их чуть позже.
Ваш код в этой ситуации примет решение что лимитов нет (нулевые) а на самом деле они будут позже.

Как уже было сказано фондовые лимиты и срочные, работают по кардинально разным технологиям и мешать их в разговоре лучше не стоит, а то все запутаются.

Хорошо, допустим с фьючерсными позициями.
Там ситуация другая, они начинают транслироваться после запуска шлюза.
И транслируются сразу все что есть на бирже.
Если лимита нет на бирже, значит при isLimitsLoaded = true мы действительно можем судить о том что его нет, а не то что он не загружен.
Но задачу целиком это опять же не решит.
Вы пишите "таблица еще не загрузилась" и "таблица пустая и позиции нулевые"
На самом деле есть три состояния "таблица еще не загрузилась" и "таблица пустая" и "позиции нулевые"
Допустим первые два способа функция поможет отличить, но третий точно нет, ибо на стороне брокера есть транзакция на корректировку входящей позиции срочного рынка.
А значит, Вам легко может приехать строка содержащая 0, а потом через некоторое время нормальное значение.
Как быть?

ИТОГО, функция isLimitsLoaded никак не решает проблему с фондовыми и валютными лимитами.
Зато частично решает со срочными. Целесообразно ли ее вводить в условиях ненадежности и того что она хоть что то будет показывать только на одном рынке?
Написание автономного бота
 
Цитата
Mixa написал:
sys_events не решит вопрос?
А разве там есть признак окончания загрузки данных на клиента которым в данном случае является QUIK?
Там есть "session_data_ready", в описании которого сказано о том что это признак окончания загрузки данных в торговую систему.
Это не то же самое что загрузка на клиента.
Цитата
Mixa написал:
И в чем по-вашему будет "решение не надежным"?

Вопрос не понятен, был приведен конкретный пример не надежного срабатывания.
Если есть ситуации когда предложенное решение выдаст неверный результат значит решение не надежное.
А такие ситуации поверьте будут всегда.
Цитата
Mixa написал:
А вслед за лимитами - уведомление "лимиты загружены".
Из этого следует что Вы все таки готовы ждать данные.
И чем тогда это отличается от предложенного варианта с ожиданием данных?
На наш взгляд вообще ничем. Тогда что мешает этим уже сейчас пользоваться?

Вы предлагаете, делать цикл который будет ловить признак окончания загрузки лимитов.
Мы предлагаем, делать цикл который будет ловить появление именно нужных скрипту лимитов.
Каждый скрипт, знает чем будет торговать, а значит знает какие лимиты ему нужны, не так ли?
Зачем скрипту ждать не нужных ему лимитов не понятно.
Написание автономного бота
 
Цитата
Mixa написал:
признак, что процедура загрузки лимитов (на сервер) завершена.
Это уже касается фондовых лимитов а не срочных? т.к. срочные лимиты НЕ грузятся на сервер. Они ТРАНСЛИРУЮТСЯ с биржи.
Разница в технологии колоссальная.
Как правило брокера грузят фондовые лимиты на сервер задолго до старта всех торговых шлюзов, когда они даже не запущены.
Так что когда пользователь подключается к серверу, фондовые лимиты уже точно на сервере есть.
Иное считается аварийной ситуацией.
Другой вопрос в том что сервер не будет транслировать фондовые лимиты по тем инструментам которые отсутствуют, либо у пользователя нет прав.
Например если пользователь подключился к серверу до старта шлюза, лимитов он не увидит, хотя на сервере они есть.
И сервер не будет транслировать никакой признак о наличии таких лимитов т.к. не знает появятся инструменты или нет, может биржа их исключила из торговли.
Получается опять диссонанс, на сервере лимит есть, он не знает можно ли давать его пользователю, пользователь подключился лимит не видит. А потом когда шлюз запустят лимит вдруг появился.

Вам уже было сказано что надежных способов не существует, тема разжевывалась сотни раз, на все предложенные пользователями варианты всегда найдется НО которое делает решение не надежным.
Мы можем и дальше продолжить диалог и Вы опять что то предложите и мы опять сообщим что есть ситуации делающее решение не надежным
Вариант которые уже сейчас решает вопрос уже был предложен
Ждите колбек или смотрите в цикле.
Данные появились - хорошо работаем
Данные не появились - сидим ждем дальше.

Цитата
Mixa написал:
В биржевом шлюзе нет уведомления об окончании загрузки данных?
Биржевой протокол не является тайной
http://ftp.moex.com/pub/ClientsAPI/Spectra/CGate/prod/docs/p2gate_ru.pdf
Написание автономного бота
 
Цитата
Mixa написал:
Да ладно! Посчитать количество записей в таблице на сервере и отправить число клиенту. В чем проблема?
Допустим, момент Х данных на сервере еще нет. Что должен подсчитать сервер?
Вы подключаетесь и сервер присылает Вам 0.
Ваш скрипт думает что данных нет и прекращает работу
И тут вдруг в момент Y данные на сервере появляются.
Как быть?


Цитата
Mixa написал:
Как это не знает?!! Лимиты грузятся с сервера!
Конкретно FuturesClientHolding  грузятся НЕ с сервера, а с биржи.

Цитата
Mixa написал:
Сам пусть считает!
Что считает?
Написание автономного бота
 
Цитата
Mixa написал:
Так сделайте надежный способ. В чем проблема? Эта задача не кажется невыполнимой.
Этому вопросу уже больше 10 лет и никто так и не предложил надежного способа.

Цитата
Mixa написал:
Что это за рекомендация такая? Как скрипт узнает сколько колбеков ждать и ждать ли вообще?А если OnFuturesClientHolding не будет? "Ничего не делать"?

Вот именно, и сервер тоже этого не знает и не может знать.
Кто скажет серверу будут ли FuturesClientHolding или нет? Биржа? Брокер? А им от куда знать?
Написание автономного бота
 
После подключения к серверу, на загрузку данных требуется время и тут ничего не поделать.
Какого-либо маркера о полной загрузке данных НЕ существует. Спрашивать как его сделать в этом вопросе бесполезно, т.к. надежных способов нет.
Самый верный вариант ждать пока нужные скрипту данные появятся в колбеке, если не появились значит ничего не делать.
Альтернатива, то же самое ждать, но в цикле раз в период.
Написание автономного бота
 
Цитата
Mixa написал:
я предоставил пример кода и ёмкое описание проблемы.
нет, Вы не представили ёмкое описание проблемы
Исходя из описания не понятно что именно не работает, только просьба выполнить работу.
Цитата
Mixa написал:
Так и есть. Скрипт может не правильно определить текущие позиции. В чём моя ошибка?

Вот это уже похоже на "описание проблемы".
Вопрос в том, что подразумевается под "не правильно"?
Не правильно это как? есть конкретный пример?
Написание автономного бота
 
Цитата
Mixa написал:
Ув. разработчики., могли бы вы оказать поддержку в доработке скрипта,
К сожалению мы не можем предоставить подобную помощь т.к. разработка скриптов не является нашей задачей.
Мы можем помочь в устранении ошибки если она случается.
Получение данных о состоянии счета
 
Цитата
Юрий Волошин написал:
Цитата
Sergey Gorokhov написал: В текущей реализации к сожалению нет доступа через Lua к этой таблице.
Прошло 6 лет -- на дворе лето 2021. Таки можно получить через Lua QUIK доступ к таблице "Состояние счёта"?!
Ответ тот же, доступа по прежнему нет и планов по его предоставлению не было, т.к. в Lua и так уже сейчас можно повторить те же расчеты и получить те же цифры что видны в таблице
[BUG] Пропадает текст в таблицах
 
Цитата
Старатель написал:
Ahtung!
Мы исправим описанные в данном инциденте ошибки в одной из очередных версий ПО. Приносим извинения за доставленные неудобства.
_dataline_data_metatablegc
 
s_mike@rambler.ru,
Это наш тип данных который используется в элементе _DataSource таблицы которая порождается функцией CreateDataSource.
этот элемент содержит наши служебные параметры которые не являются публичными
Обновление Quik, Не обновляется Quik
 
Александр,
Проверили, ссылка работает. Видимо у Вас что то с браузером
Какой формат записи ячеек с типом QTABLE_DATETIME_TYPE, чтобы работали сортировка и фильтры?
 
Здравствуйте,
Этот тип не описан в документации, значит он не является публичным и использовать его не рекомендуется
Ошибка: указанная транзакция по указанному классу не найдена, Quik 8.11.0.66
 
Олег,
Здравствуйте,
Если через терминал транзакция не отправляется то и через QLUA вполне ожидаемо отправиться не сможет.
Ошибка означает то что сказано, а именно транзакция не найдена.
Варианты причин могут быть разные:
Указаны неверные параметры транзакции
Нет прав на класс
Права есть но класса нет
Права есть, класс есть, но возможна какая-то неполадка на стороне брокера.

Достоверно определить причины, может только брокер.
Метки
 
Цитата
Юрий написал:
Действительно, с помощью фунции Lua  AddLabel можно добавить  прозрачность для текстовой метки. Однако после любого ручного изменения  метки RB ---> Редактировать....   появляется черный фон под текстом?
Возможность восстанавливать прозрачность фона галочкой вручную была бы очень полезной!
Добрый день,

Описанная в данном инциденте ошибка будет исправлена в одной из очередных версий программы.
Приносим извинения за причиненные неудобства.
Куик виснет и потом не запускается
 
Цитата
dwell dwell написал:
Саппорт сделал предположение насчет того, что проблема Quik связана с Punto Switcher. Я выгрузил пунто, пару дней не было зависаний. Потом запустил, зависание появилось.
Так что считаю, что можно приступить к более детальному анализу, как решить этот вопрос...
Или вы по понятным причинам теперь занимаетесь только массовыми проблемами?

Добрый день,

Предполагаем, что описанная в данном инциденте проблема вызвана некорректным поведением программы Punto Switcher и рекомендуем в качестве решения проблемы попробовать установить самую свежую версию данного ПО.

В процессе просмотра списка изменений по версиям данного ПО нам встретились следующие пункты:
- Оптимизировано поведение программы punto switcher после выхода компьютера из режима сна.
- Устранены ситуации, в которых могло происходить зависание программ во время автоматического и ручного переключения.
Склейка графика приводит к сбросу ряда настроек
 
Цитата
mikr написал:
Застарелая проблема, которую наблюдаю на протяжении многих версий (возможно, обсуждалась, но, извините, не нашёл). При склейке графика происходит:
1) сброс фильтров потока всех сделок - все галки с классов оказываются снятыми, поток, естественно, полностью прекращается, приходится проставлять галки заново;
2) смена кода клиента в табл. Купить/Продать на более ранний в списке. Поясню. Если есть два кода по одному рынку (обычный счёт и ИИС) и установлен второй по порядку код (ИИС), то, после склейки, таблица К/П оказывается привязанной к первому коду (обычный счёт).
Поэтому стоит альтернатива: или не пользоваться склейкой, или каждый раз мучаться с восстановлением настроек Квик.
Добрый день,

Описанная в данном инциденте ошибка будет исправлена в одной из очередных версий ПО.

Приносим извинения за причиненные неудобства.
WebQuik API
 
Цитата
Sergey написал:
Есть сдвиги и изменения в этом вопросе на текущий момент 07.12.2020?
API к WebQUIK нет и не планируется.
Есть имеющиеся средства такие как FIX приборы (платно), Trans2Quik, lua скрипты (бесплатно).
Если этих средств Вам недостаточно, Вы всегда можете озвучить свои пожелания по доработкам в соответствующей ветке форума.
Очевидно что Вы хотите бесплатное, прямое API к серверу. Выпуск такого API не планируется, потому что уже есть FIX приборы.
Изменения в работе с колбеками LUA в новой версии
 
TGB,

Цитата
Egor Zaytsev написал:
Следите на обновлениями.
Индикаторы для QUIK старше 8.3.2.4
 
Здравствуйте,
По идее последняя версия должна работать
https://arqatech.com/upload/iblock/398/INDICATORS.zip

Если не работает просьба описать подробней что именно
Отправка транзакций, Время прихода ответа на транзакцию
 
Дмитрий,
Вы же сами говорите что на разных серверах разная картина.
Отправка транзакций, Время прихода ответа на транзакцию
 
Дмитрий,

Уточните в связи с чем Вы проводите такие исследования? если вопрос чисто из любопытства то не видим оснований исследовать этот вопрос т.к. он тербует более детального анализа логов со стороны брокера.
Иными словами стоит ли игра свеч?
Если Вы столкнулись с какой-то реальной проблемой, опишите в чем её суть.
Функции onInit, onStop, onClose
 
Цитата
Владимир написал:
это только В НОРМАЛЬНЫХ языках такое происходит, но не в Lua или JS

В чем проблема выводить данные по DDE (или odbc) и ловить их в своем приложении на любом "нормальном" языке?
get candle
 
s_mike@rambler.ru,
К сожалению причины не понятны, однако Старатель, правильно сказал, doesExist решает проблему.
Функции onInit, onStop, onClose
 
Владимир,
Если Вы сомневаетесь в компетенции поддержки, зачем тогда вообще спрашивать совета у поддержки?
Спросите у того кому вверите.
get candle
 
Цитата
s_mike@rambler.ru написал:
Нет, не подтвердилось. Инструмент на графике один
Инструмент или источник данных?
Ведь у одного инструмента могут быть графики от разных источников, таблица текущих торгов или обезличенные сделки.
Если говорить про индикаторы, то они само собой рассчитываются чуть позже появления графика-источника.
get candle
 
Старатель,
да такая ситуация возможна.
но как правило, она возникает когда в одном окне несколько графиков с разными источниками.
Один из графиков обновился и получил данные для построения свечи, а второй еще нет.
Оба покажут size+1, но на одном будут нулевые значения, а на втором нет.
Функции onInit, onStop, onClose
 
Цитата
Владимир написал:
Перечитал
Ваши посты переданы модератору для анализа.

Цитата
Владимир написал:
В моём коде индексы SP НЕ "заданы как числа"
Разве? А это что?
Код
SP[2]=0;


И наша рекомендация, на оборот, везде в индексах использовать числа, а не строки.
передавайте число а не строку в a[N][1][1]
Код
a[N][1][1]=tonumber(l:sub(i+1,i+1))
Функции onInit, onStop, onClose
 
Цитата
Владимир написал:
Sergey Gorokhov , Какие ещё "матерные и нецензурные слова"?!
Вы прекрасно понимаете о чем речь, если нет перечитайте свои посты еще раз.
Еще одно предупреждение и Вас заблокируют.
Не используйте ненормативную лексику при написании сообщений.

Цитата
Владимир написал:
Sergey Gorokhov, Мне нужно, чтобы я ЗНАЛ, какого типа мои переменные и был уверен, что она не поменяет свой тип через миллисекунду. Повторяю: я ВСЕ свои данные заношу как строки (впрочем, Вы это могли увидеть по коду). А вот как интерпретатор их ВОСПРИНИМАЕТ - этого я уже не знаю.

Проблема не в интерпретаторе, а в Вашем понимании что строка НЕ равно число.
У Вас в Вашем же коде, индексы SP заданы как числа, а Вы пытаетесь обратиться к ним как к строкам.
О чем Вам уже три человека сказали.
Вы говорите что Вам нужны индексы строки, тогда почему Вы где-то используете числа а где-то строки??
проще и надежней везде использовать однотипный способ получения данных.

Вы сами запутались уже в своем же коде.

Вот это a[i][1][1] - должно быть числом а не строкой, о чем и было сказано выше #67
Функции onInit, onStop, onClose
 
Владимир,

Вы в начале задаете индексы как числа, а потом обращаетесь к ним как к строке
С нашей стороны было сделано предположение что Вам нужны индексы - числа, а не строки.
Если нужны строки то используйте их везде
Код
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP["0"]=0;SP["1"]=0;SP["2"]=0;SV["0"]=0;SV["1"]=0;SV["2"]=0;SR["0"]=0;SR["1"]=0;SR["2"]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=l:sub(i+1,i+1);a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
Функции onInit, onStop, onClose
 
Владимир,
Вынужден сделать второе предупреждение.
не допускайте матерных и нецензурных слов при общении на форуме.
Функции onInit, onStop, onClose
 
Цитата
Владимир написал:
Нет, ничего не смущает А что должно смущать?    
ответ уже был дан:
Цитата
Sergey Gorokhov написал:
Потому что SP[2] и SP["2"] - это разные вещи
Функции onInit, onStop, onClose
 
Старатель,
я раньше успел))

Владимир,
остальной код не проверял но наверняка там есть и другие похожие ошибки.
Функции onInit, onStop, onClose
 
Владимир,
как и ожидалось у Вас в a[N][1][1] попадает строка, а не число.
надо чтобы было число.
Потому что SP[2] и SP["2"] - это разные вещи
Исправьте например так:

Код
function r()local i,j,k;c=c+1;if c==10 then c=0;R();end;for i=0,N-1 do if a[i][9]~=-1 then j=a[i][2];a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;k=0xFFFFFF;if j~=a[i][2]then if tonumber(j)>tonumber(a[i][2]) then k=0xFFCCCC;end;if tonumber(j)<tonumber(a[i][2]) then k=0xCCCCFF;end;end;j=CL[a[i][1][1]];if tonumber(a[i][1][5])==0 then j=0x666666;end;if f then SetColor(T,a[i][9],QTABLE_NO_INDEX,k,j,-1,-1);end;if tonumber(a[i][2])==0 then if f then SetColor(T,a[i][9],1,0,0xFFFFFF,-1,-1);end;end;if f then SetCell(T,a[i][9],1,a[i][0]);end;if f then SetCell(T,a[i][9],2,d0(a[i][1][5]));end;if f then SetCell(T,a[i][9],3,d0(a[i][2]));end;if f then SetCell(T,a[i][9],4,string.format("%1.2f",a[i][2]*a[i][1][3]*a[i][1][5]));end;if f then SetCell(T,a[i][9],5,string.format("%1.2f",a[i][1][6]));end;if f then SetCell(T,a[i][9],6,d0(string.format("%1.3f",a[i][1][7])));end;if f then SetCell(T,a[i][9],7,string.format("%1.2f",a[i][2]/a[i][1][7]*100-100));end;j=a[i][5][a[i][1][4]-1];if f then SetCell(T,a[i][9],8,d0(j));end;j=a[i][2]/j*100-100;if j>5 then if f then SetColor(T,a[i][9],9,0xCCCCFF,0,-1,-1);end;end;if j<-5 then if f then SetColor(T,a[i][9],9,0xFFCCCC,0,-1,-1);end;end;if f then SetCell(T,a[i][9],9,string.format("%1.2f",j));end;end;end;SetWindowCaption(T,"R="..SP[0].."+"..M[0].."="..SV[0].."/"..SR[0].." D="..SP[1].."+"..M[1].."="..SV[1].."/"..SR[1].." E="..SP[2].."+"..M[2].."="..SV[2].."/"..SR[2]);end
function R()local i,j,k,l;l=0;SP[0]=0;SP[1]=0;SP[2]=0;SV[0]=0;SV[1]=0;SV[2]=0;SR[0]=0;SR[1]=0;SR[2]=0;for i=0,N-1 do a[i][2]=getParamEx(a[i][1][0],a[i][0],"LAST").param_value;SP[a[i][1][1]]=tonumber(SP[a[i][1][1]])+a[i][1][6];j=a[i][2]/a[i][1][7]*100-100;if j > 1 then SR[a[i][1][1]]=SR[a[i][1][1]]+a[i][1][6];end;SV[a[i][1][1]]=SV[a[i][1][1]]+(a[i][2]-a[i][1][7])*a[i][1][5]*a[i][1][3];j=a[i][2]/a[i][1][7]*100-100;k=0;j=a[i][2]/a[i][1][7]*100-100;if j<-5 and a[i][2]~=0 then k=1;end;if a[i][1][5]>0 then j=a[i][2]/a[i][5][a[i][1][4]-1]*100-100;if j>3 or j<-3 then k=1;end;end;if k==0 and a[i][9]~=-1 then l=1;a[i][9]=-1;end;if k~=0 and a[i][9]==-1 then if f then a[i][2]=0;a[i][9]=InsertRow(T,-1);end;end;end;if l~=0 then if f then Clear(T);end;i=0;for i=0,N-1 do if a[i][9]~=-1 then a[i][2]=0;if f then a[i][9]=InsertRow(T,-1);end;end;end;end;C=C+1;end
function OnStop() f=false;end
function b(n) local i=0;a[n][1][5]=0;a[n][1][6]=0;while i<a[n][1][4] do a[n][1][5]=a[n][1][5]+a[n][5][i];a[n][1][6]=a[n][1][6]+a[n][5][i]*a[n][5][i+1]*a[n][1][3];i=i+2;end;if a[n][1][5]~=0 then a[n][1][7]=a[n][1][6]/a[n][1][5]/a[n][1][3];else a[n][1][7]=a[n][5][a[n][1][4]-1];end;end
function d0(s) s=tonumber(s);if s==math.floor(s) then s=math.floor(s) end return tostring(s);end
function e() f=false;message("Файл бракованный!");sleep(5000);end
function main() local i,j,s;CL={0,0x9900,0x99};f=true;c=0;C=0;N=0;T=0;a={};M={};M[0]=0;M[1]=0;M[2]=0;SP={};SV={};SR={};F=io.open(getScriptPath().."//T","r");if F==nil then e();return;end;for l in F:lines() do s=l:sub(1,1);if s=="_" then loadstring(l:sub(2))();end;if s~="-" and s~="_" then i=l:find("\1");if i==nil then e();return;end;a[N]={};a[N][1]={};a[N][1][0]=l:sub(1,i-1);l=l:sub(i+1);i=l:find("\2");if i==nil then e();return;end;a[N][0]=l:sub(1,i-1);if l:sub(i+2,i+2)~="\3" or l:sub(i+4,i+4)~="\t" then e();return;end;a[N][1][1]=tonumber(l:sub(i+1,i+1));a[N][1][2]=l:sub(i+3,i+3);l=l:sub(i+5);a[N][1][3]=getParamEx(a[N][1][0],a[N][0],"LOTSIZE").param_value;i=l:find("\t");if i==nil then e();return;end;a[N][2]=0;l=l:sub(i+1);a[N][3]=0;a[N][4]=0;a[N][5]={};j=0;while l:sub(1,1)~="#" do i=l:find("\t");if i==nil then e();return;end;s=l:sub(1,i-1);l=l:sub(i+1);i=s:find(":");if i==nil then e();return;end;a[N][5][j]=s:sub(1,i-1);a[N][5][j+1]=s:sub(i+1);j=j+2;end;a[N][1][4]=j;a[N][6]={};a[N][7]={};a[N][8]={};j=0;while j<12 do a[N][6][j]=0;a[N][7][j]=0;a[N][8][j]=0;j=j+1;end;l=l:sub(i+1);j=0;while j<12 do i=l:find("\4");if i==nil then break;end;i=l:find(":");if i==nil then e();return;end;a[N][6][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find(":");if i==nil then e();return;end;a[N][7][j]=l:sub(2,i-1);l=l:sub(i+1);i=l:find("\4");if i==nil then e();return;end;a[N][8][j]=l:sub(2,i-1);l=l:sub(i+1);j=j+1;end;a[N][9]=-1;b(N);N=N+1;end;end;F:close();T=AllocTable();AddColumn(T,1,"Тикер",true,QTABLE_STRING_TYPE,8);AddColumn(T,2,"Кол",true,QTABLE_STRING_TYPE,6);AddColumn(T,3,"Цена",true,QTABLE_STRING_TYPE,12);AddColumn(T,4,"Сумма",true,QTABLE_STRING_TYPE,12);AddColumn(T,5,"Затраты",true,QTABLE_STRING_TYPE,12);AddColumn(T,6,"Med",true,QTABLE_STRING_TYPE,12);AddColumn(T,7,"%",true,QTABLE_STRING_TYPE,12);AddColumn(T,8,"Last",true,QTABLE_STRING_TYPE,12);AddColumn(T,9,"%",true,QTABLE_STRING_TYPE,12);CreateWindow(T);SetWindowPos(T,0,0,900,560);R();F=io.open(getScriptPath().."//LOG","w");if F==nil then e();return;end;message("Скрипт запущен, акций: "..N);while f do sleep(1500);r();end;F:close();F=io.open(getScriptPath().."//TTT","w");if F==nil then e();return;end;i=0;while i<N do F:write(a[i][1][0].."\1"..a[i][0].."\2"..a[i][1][1].."\3"..a[i][1][2].."\t"..d0(a[i][2]).."\t");j=0;while j<a[i][1][4] do F:write(a[i][5][j]..":"..d0(a[i][5][j+1]).."\t");j=j+2;end;F:write("#");j=0;while j<12 do F:write(d0(a[i][6][j])..":"..d0(a[i][7][j])..":"..d0(a[i][8][j]).."\4");j=j+1;end;F:write("\n");i=i+1;end;F:close();message("Скрипт остановлен!");end
Функции onInit, onStop, onClose
 
Цитата
Владимир написал:
Sergey Gorokhov, О Господи! Ну, ловите:
Код
   function  r() local  i,j,k;c = c +  1 ; if  c =  =  10   then  c =  0 ;R(); end ; for  i =  0 ,N -  1   do   if  a[i][ 9 ]~ =  -  1   then  j = a[i][ 2 ];a[i][ 2 ] =  getParamEx (a[i][ 1 ][ 0 ],a[i][ 0 ],"LAST").param_value;k =  0xFFFFFF ; if  j~ = a[i][ 2 ] then   if  tonumber(j) > tonumber(a[i][ 2 ])  then  k =  0xFFCCCC ; end ; if  tonumber(j) < tonumber(a[i][ 2 ])  then  k =  0xCCCCFF ; end ; end ;j = CL[a[i][ 1 ][ 1 ]]; if  tonumber(a[i][ 1 ][ 5 ]) =  =  0   then  j =  0x666666 ; end ; if  f  then   SetColor (T,a[i][ 9 ],QTABLE_NO_INDEX,k,j, -  1 , -  1 ); end ; if  tonumber(a[i][ 2 ]) =  =  0   then   if  f  then   SetColor (T,a[i][ 9 ], 1 , 0 , 0xFFFFFF , -  1 , -  1 ); end ; end ; if  f  then   SetCell (T,a[i][ 9 ], 1 ,a[i][ 0 ]); end ; if  f  then   SetCell (T,a[i][ 9 ], 2 ,d0(a[i][ 1 ][ 5 ])); end ; if  f  then   SetCell (T,a[i][ 9 ], 3 ,d0(a[i][ 2 ])); end ; if  f  then   SetCell (T,a[i][ 9 ], 4 , string.format ( "%1.2f" ,a[i][ 2 ] * a[i][ 1 ][ 3 ] * a[i][ 1 ][ 5 ])); end ; if  f  then   SetCell (T,a[i][ 9 ], 5 , string.format ( "%1.2f" ,a[i][ 1 ][ 6 ])); end ; if  f  then   SetCell (T,a[i][ 9 ], 6 ,d0( string.format ( "%1.3f" ,a[i][ 1 ][ 7 ]))); end ; if  f  then   SetCell (T,a[i][ 9 ], 7 , string.format ( "%1.2f" ,a[i][ 2 ]/a[i][ 1 ][ 7 ] *  100  -  100 )); end ;j = a[i][ 5 ][a[i][ 1 ][ 4 ] -  1 ]; if  f  then   SetCell (T,a[i][ 9 ], 8 ,d0(j)); end ;j = a[i][ 2 ]/j *  100  -  100 ; if  j >  5   then   if  f  then   SetColor (T,a[i][ 9 ], 9 , 0xCCCCFF , 0 , -  1 , -  1 ); end ; end ; if  j <  -  5   then   if  f  then   SetColor (T,a[i][ 9 ], 9 , 0xFFCCCC , 0 , -  1 , -  1 ); end ; end ; if  f  then   SetCell (T,a[i][ 9 ], 9 , string.format ( "%1.2f" ,j)); end ; end ; end ; SetWindowCaption (T,"R =  "..SP[0].."  + " .. M[ 0 ] .. " =  "..SV[0].." /" .. SR[ 0 ] .. " D =  "..SP[1].."  + " .. M[ 1 ] .. " =  "..SV[1].." /" .. SR[ 1 ] .. " E =  "..SP[2].."  + " .. M[ 2 ] .. " =  "..SV[2].." /" .. SR[ 2 ]); end 
 function  R() local  i,j,k,l;l =  0 ;SP[ 0 ] =  0 ;SP[ 1 ] =  0 ;SP[ 2 ] =  0 ;SV[ 0 ] =  0 ;SV[ 1 ] =  0 ;SV[ 2 ] =  0 ;SR[ 0 ] =  0 ;SR[ 1 ] =  0 ;SR[ 2 ] =  0 ; for  i =  0 ,N -  1   do  a[i][ 2 ] =  getParamEx (a[i][ 1 ][ 0 ],a[i][ 0 ],"LAST").param_value;SP[a[i][ 1 ][ 1 ]] = tonumber(SP[a[i][ 1 ][ 1 ]]) + a[i][ 1 ][ 6 ];j = a[i][ 2 ]/a[i][ 1 ][ 7 ] *  100  -  100 ; if  j  >   1   then  SR[a[i][ 1 ][ 1 ]] = SR[a[i][ 1 ][ 1 ]] + a[i][ 1 ][ 6 ]; end ;SV[a[i][ 1 ][ 1 ]] = SV[a[i][ 1 ][ 1 ]] + (a[i][ 2 ] - a[i][ 1 ][ 7 ]) * a[i][ 1 ][ 5 ] * a[i][ 1 ][ 3 ];j = a[i][ 2 ]/a[i][ 1 ][ 7 ] *  100  -  100 ;k =  0 ;j = a[i][ 2 ]/a[i][ 1 ][ 7 ] *  100  -  100 ; if  j <  -  5   and  a[i][ 2 ]~ =  0   then  k =  1 ; end ; if  a[i][ 1 ][ 5 ] >  0   then  j = a[i][ 2 ]/a[i][ 5 ][a[i][ 1 ][ 4 ] -  1 ] *  100  -  100 ; if  j >  3   or  j <  -  3   then  k =  1 ; end ; end ; if  k =  =  0   and  a[i][ 9 ]~ =  -  1   then  l =  1 ;a[i][ 9 ] =  -  1 ; end ; if  k~ =  0   and  a[i][ 9 ] =  =  -  1   then   if  f  then  a[i][ 2 ] =  0 ;a[i][ 9 ] =  InsertRow (T, -  1 ); end ; end ; end ; if  l~ =  0   then   if  f  then   Clear (T); end ;i =  0 ; for  i =  0 ,N -  1   do   if  a[i][ 9 ]~ =  -  1   then  a[i][ 2 ] =  0 ; if  f  then  a[i][ 9 ] =  InsertRow (T, -  1 ); end ; end ; end ; end ;C = C +  1 ; end 
 function   OnStop () f =  false ; end 
 function  b(n)  local  i =  0 ;a[n][ 1 ][ 5 ] =  0 ;a[n][ 1 ][ 6 ] =  0 ; while  i < a[n][ 1 ][ 4 ]  do  a[n][ 1 ][ 5 ] = a[n][ 1 ][ 5 ] + a[n][ 5 ][i];a[n][ 1 ][ 6 ] = a[n][ 1 ][ 6 ] + a[n][ 5 ][i] * a[n][ 5 ][i +  1 ] * a[n][ 1 ][ 3 ];i = i +  2 ; end ; if  a[n][ 1 ][ 5 ]~ =  0   then  a[n][ 1 ][ 7 ] = a[n][ 1 ][ 6 ]/a[n][ 1 ][ 5 ]/a[n][ 1 ][ 3 ]; else  a[n][ 1 ][ 7 ] = a[n][ 5 ][a[n][ 1 ][ 4 ] -  1 ]; end ; end 
 function   d0 (s) s = tonumber(s); if  s =  =  math.floor (s)  then  s =  math.floor (s)  end   return  tostring(s); end 
 function  e() f =  false ; message ( "Файл бракованный!" ); sleep ( 5000 ); end 
 function   main ()  local  i,j,s;CL = { 0 , 0x9900 , 0x99 };f =  true ;c =  0 ;C =  0 ;N =  0 ;T =  0 ;a = {};M = {};M[ 0 ] =  0 ;M[ 1 ] =  0 ;M[ 2 ] =  0 ;SP = {};SV = {};SR = {};F =  io.open ( getScriptPath () .. "//T","r"); if  F =  =  nil   then  e(); return ; end ; for  l  in  F:lines()  do  s = l:sub( 1 , 1 ); if  s =  =  "_"   then  loadstring(l:sub( 2 ))(); end ; if  s~ =  "-"   and  s~ =  "_"   then  i = l:find( "\1" ); if  i =  =  nil   then  e(); return ; end ;a[N] = {};a[N][ 1 ] = {};a[N][ 1 ][ 0 ] = l:sub( 1 ,i -  1 );l = l:sub(i +  1 );i = l:find( "\2" ); if  i =  =  nil   then  e(); return ; end ;a[N][ 0 ] = l:sub( 1 ,i -  1 ); if  l:sub(i +  2 ,i +  2 )~ =  "\3"   or  l:sub(i +  4 ,i +  4 )~ =  "\t"   then  e(); return ; end ;a[N][ 1 ][ 1 ] = l:sub(i +  1 ,i +  1 );a[N][ 1 ][ 2 ] = l:sub(i +  3 ,i +  3 );l = l:sub(i +  5 );a[N][ 1 ][ 3 ] =  getParamEx (a[N][ 1 ][ 0 ],a[N][ 0 ],"LOTSIZE").param_value;i = l:find( "\t" ); if  i =  =  nil   then  e(); return ; end ;a[N][ 2 ] =  0 ;l = l:sub(i +  1 );a[N][ 3 ] =  0 ;a[N][ 4 ] =  0 ;a[N][ 5 ] = {};j =  0 ; while  l:sub( 1 , 1 )~ =  "#"   do  i = l:find( "\t" ); if  i =  =  nil   then  e(); return ; end ;s = l:sub( 1 ,i -  1 );l = l:sub(i +  1 );i = s:find( ":" ); if  i =  =  nil   then  e(); return ; end ;a[N][ 5 ][j] = s:sub( 1 ,i -  1 );a[N][ 5 ][j +  1 ] = s:sub(i +  1 );j = j +  2 ; end ;a[N][ 1 ][ 4 ] = j;a[N][ 6 ] = {};a[N][ 7 ] = {};a[N][ 8 ] = {};j =  0 ; while  j <  12   do  a[N][ 6 ][j] =  0 ;a[N][ 7 ][j] =  0 ;a[N][ 8 ][j] =  0 ;j = j +  1 ; end ;l = l:sub(i +  1 );j =  0 ; while  j <  12   do  i = l:find( "\4" ); if  i =  =  nil   then   break ; end ;i = l:find( ":" ); if  i =  =  nil   then  e(); return ; end ;a[N][ 6 ][j] = l:sub( 2 ,i -  1 );l = l:sub(i +  1 );i = l:find( ":" ); if  i =  =  nil   then  e(); return ; end ;a[N][ 7 ][j] = l:sub( 2 ,i -  1 );l = l:sub(i +  1 );i = l:find( "\4" ); if  i =  =  nil   then  e(); return ; end ;a[N][ 8 ][j] = l:sub( 2 ,i -  1 );l = l:sub(i +  1 );j = j +  1 ; end ;a[N][ 9 ] =  -  1 ;b(N);N = N +  1 ; end ; end ;F:close();T =  AllocTable (); AddColumn (T, 1 ,"Тикер", true ,QTABLE_STRING_TYPE, 8 ); AddColumn (T, 2 ,"Кол", true ,QTABLE_STRING_TYPE, 6 ); AddColumn (T, 3 ,"Цена", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 4 ,"Сумма", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 5 ,"Затраты", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 6 ,"Med", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 7 ,"%", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 8 ,"Last", true ,QTABLE_STRING_TYPE, 12 ); AddColumn (T, 9 ,"%", true ,QTABLE_STRING_TYPE, 12 ); CreateWindow (T); SetWindowPos (T, 0 , 0 , 900 , 560 );R();F =  io.open ( getScriptPath () .. "//LOG","w"); if  F =  =  nil   then  e(); return ; end ; message ( "Скрипт запущен, акций: "  .. N); while  f  do   sleep ( 1500 );r(); end ;F:close();F =  io.open ( getScriptPath () .. "//TTT","w"); if  F =  =  nil   then  e(); return ; end ;i =  0 ; while  i < N  do  F:write(a[i][ 1 ][ 0 ] .. "\ 1 " .. a[i][ 0 ] .. "\ 2 " .. a[i][ 1 ][ 1 ] .. "\ 3 " .. a[i][ 1 ][ 2 ] .. "\t" .. d0(a[i][ 2 ]) .. "\t");j =  0 ; while  j < a[i][ 1 ][ 4 ]  do  F:write(a[i][ 5 ][j] .. ":" .. d0(a[i][ 5 ][j +  1 ]) .. "\t");j = j +  2 ; end ;F:write( "#" );j =  0 ; while  j <  12   do  F:write(d0(a[i][ 6 ][j]) .. ":" .. d0(a[i][ 7 ][j]) .. ":" .. d0(a[i][ 8 ][j]) .. "\ 4 ");j = j +  1 ; end ;F:write( "\n" );i = i +  1 ; end ;F:close(); message ( "Скрипт остановлен!" ); end 
  
Последняя версия, ругается на "attempt to perform arithmetic on a nil value". если отрезать SP, SV, SR - работает: рисует таблицу, меняет в ней данные, записывает результаты в файл. Вот прям ща и работает - советует акции Nokia продать.  ::  

для полной картины не хватает содержимого файла "//T"
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 77 След.
Наверх