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

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

Страницы: Пред. 1 2 3 4 5 6 7 След.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Сирануш, откройте в квике таблицу "Позиции по инструментам", и определите какие данные оттуда вы все же хотите видеть.
Потом прочитайте http://luaq.ru/getDepoEx.html чтобы понять какой столбец таблицы какому параметру getDepoEx соответствует
Программный разрыв соединения
 
Цитата
Юрий Волошин написал:
А таки "Разорвать соединение с информационным сервером" можно программно из Lua QUIK? Отключиться от сервера на ночь.
С помощью библиотеки w32 (ссылка есть выше в теме) буквально в три строчки
Код
local w32=require("w32")
local hWnd=w32.FindWindow("InfoClass","")
w32.PostMessage(hWnd,w32.WM_COMMAND,101,0)
Вызов индикатора в скрипте, Использование значений индикаторов при работе со свечками
 
Владимир, не перестаю с вас удивляться
Цитата
Владимир написал:
И не надо никаких индикаторов!
и тут же
Цитата
Владимир написал:
Тупое мат. ожидание, то бишь среднее арифметическое. Ну, можно ещё и дисперсию дать - есть там какая-то мышиная возня вокруг него или нет. Заодно и гонки курса малыми объёмами будут затруднены. Короче, примерно так:
M=(n1*p1+n2*p2+n3*p3+...)/(n1+n2+n3+...)
Вы понимаете, что то что вы описываете, по сути и есть индикатор, и даже формулу его расчета дали.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
В коде у вас ищется текущий остаток
Код
    local tblTotalLot =     getDepoEx(FIRM_ID, CLIENT_CODE, SEC_CODE, ACCOUNT ,LIMIT_KIND)    
    if tblTotalLot==nil     then TotalLots=0    else TotalLots=tonumber(tblTotalLot.currentbal)         end   
а тут вы пишете про входящий остаток.
Цитата
Сирануш написал:
меня волнует в основном входящий остаток по бумаге
не в этом ли дело?
Вызов индикатора в скрипте, Использование значений индикаторов при работе со свечками
 
Цитата
Владимир написал:
BlaZed, Лучше бы она выкладывала нормальные свечки и простой доступ к ним. И не надо никаких индикаторов! Кстати, и свечки желательно без этих дурацких "японских" штучек, а нормальные, куда более информативные.
А что такое "нормальные" свечи?
Дайте ссылочку на описание.

Я вот только японские знаю.
Вызов индикатора в скрипте, Использование значений индикаторов при работе со свечками
 
Цитата
Dr Wed написал:
Hola

Можно ли в скриптах вызывать индикаторы теханализа для использования их значений при обработке свечей?
Естественно, хочется обойтись без открытого графика по инструменту.
Легко, в скрипте рассчитываем самостоятельно нужный индикатор.
Благо арка даже выложила архив с индикаторами написанными на lua https://arqatech.com/upload/iblock/398/INDICATORS.zip
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Цитата
Владимир написал:
BlaZed,  Прям уж "такого значения быть не может". У меня "вот прям ща" у одного брокера два таких значения и у другого ещё одно. А перед началом торгов на Мосбирже там и ваще одни нули. А в СПб все данные с виду нормальные, но торгов-то всё равно нет. ::  
Владимир, а разве может, вот прям торгуется по нулевой цене?

Вы же понимаете, что если на каком-либо инструменте вдруг видим цену 0, то это либо торгов нет, либо косяк какой с данными.
В любом случае таким инструментом не торгуем, пока не увидим ненулевую цену.
[ Закрыто] Опять ошибка получения кол-ва ордеров скриптом
 
Цитата
Сирануш написал:
Если я не правильно получаю эти данные поправьте меня, чтоб было правильно. Потому как время от времени в переменные транслируются сосвсем левые данные, из-за чего робот начинает тупо набирать или продавать. Тема уже была такая(  https://forum.quik.ru/messages/forum10/message45769/topic5506/#message45769 ) и видимо ниче не поменялось.  
Вам же в прошлой теме подсказывали как лучше сделать, год как прошел, а вы так ничего и не исправили.

Я, например, подобные проверки делаю так:
Код
    params["LAST"] = tonumber(getParamEx2(class_code,sec_code,"LAST").param_value) or 0 -- Последняя цена
В результате, либо правильное число у меня в таблицу запишется, либо в случае каких проблем с данными, записываем 0, а такого значения быть не может.
Ну и тупо проверку в код добавляю, если у меня вдруг в таблице обнаружится 0, то не торгуем.
Код
    if(Тут_мои_условия)and(Тут_мои_условия)and(params["LAST"]~=0)then Trading(trading_lots,i) end
И так по всем параметрам, которые критичны для работы робота.
w32.dll, FindWindow
 
Так тут только один вариант - ClassName не верен.

Не знаю что такое Robo, но это и не важно. Вам надо указать правильный ClassName нужного вам окна.
Узнать ClassName можно разными утилитами, я смотрю через Window Detective
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Цитата
Артем написал:
Dr Wed, я инструкцию проштудировал, вроде как других способов нет. Единственная альтернатива которую я вижу это брать данные из открытого графика внутри скрипта индикатора, который к этому графику подцеплен.
Так вот тут же Владимир, он считает свечи самостоятельно. Спросите как именно лучше считать, если интересно.

Я например сходу вижу пару вариантов.
1) Из таблицы обезличенных сделок
2) Из таблицы текущих торгов параметр LAST
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Цитата
Владимир написал:
BlaZed, Вот и плохо, что "не при созревании". Надо бы дать пожелание разработчикам на доработку софта.
Кстати хорошая идея, мне тоже по стратегии приходится ловить момент появления новой свечи, а так бы коллбек словил и готово.
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Владимир, В самостоятельном расчете свеч я вижу только один существенный плюс, это построение свеч любого таймфрейма.
Думаю степени двоек должны интересный результат давать. Но я ленивый, хотя может когда и созрею реализовать..

Как по вашему, какие еще плюсы имеются по сравнению со стандартным способом получения свеч через CreateDataSource?
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Цитата
Владимир написал:
BlaZed, А как я ещё должен писать? Мне и в голову не приходило, что они могут давать незакрытые свечи! А так всё просто: свеча созрела, пришла - прерывание.
Ну если у нас все еще разговор про SetUpdateCallback (мы же с этого начали разговор), то данный коллбек срабатывает именно при получении новых данных по свечам, а не при созревании свечи.
Цитата
Владимир написал:
Нет, мы и говорим о разном: у меня незакрытая (накапливаемая) свеча существует лишь потому, что я сам её считаю, как сервер. А вот отдаю её "клиенту" лишь тогда, когда она будет закрыта. Фактически в прерывании и отдаю (15-секундном). А накапливается она в полуторасекундном, то есть обработчик свечей и знать не знает о её существовании: раз он вообще получил управления, значит, пришла новая свеча.
Ну так и через источник данных ничего не мешает такую же незакрытую(накапливаемую) свечу хоть отдавать в свой обработчик, хоть подождать пока закроется, запрограммировать можно что угодно.
Тут кроме того, что вы свечи самостоятельно рассчитываете разницы как бы и нету.
Цитата
Владимир написал:
А зачем тогда этот форум, если "разработчики менять все равно ничего не будут"?   Это же бесплатный набор тестирующих их софт, причём крайне заинтересованных в его качестве!
Смотрите, вот вам, как я понял, не нравится логика работы данных функций, а меня, например, она устраивает.
Но дело в том что существующая логика, хоть и не без косяков, но она работает.
Тут люди исправления проблем по несколько лет ждут, так что даже если вы все распишите как должно работать, и предложение признают целесообразным, то по приоритету задача на разработку явно где-нибудь в конце очереди затеряется.
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Цитата
Владимир написал:
BlaZed, А какие же ещё могут поступать новые данные в источник, если не свечи? ::
Так данные по свечам и поступают, кто ж спорит. Только вы почему-то пишете "пришла новая свеча", а же говорю, что "поступили новые данные" по свечам.
На мой взгляд разница существенная.
Цитата
Владимир написал:
ЧАВО???!!! Они что, НЕЗАКРЫТЫЕ свечи присылают?! Совсем шизанулись... Я, как уже говорил, считаю свечи сам, так у меня только три свечи на каждый таймфрейм: две рабочие и одна накапливаемая. И только когда она накопится, последняя свеча становится предпоследней, предпоследняя выбрасывается (меня не интересуют "преданья старины глубокой"), а накапливаемая обнуляется. И пока она снова не накопится и не станет последней, её данные не используются вообще никак. Чего и всем остальным желаю. Это ж ДОДУМАТЬСЯ надо! Я в ауте!  
Владимир, мы говорим об одном и том же, только терминология разная.
Под незакрытой свечой я подразумеваю то, что вы называете накапливаемой, а под закрытой, то что для вас последняя/предпоследняя и более ранние.

PS: а про логику работы всего этого спорить просто не хочу, это все же вопросы к разработчикам, а менять они все равно ничего не будут.
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Цитата
Владимир написал:
BlaZed, Ну и замечательно! Квик загружает исторические данные, скрипт их читает, если хочет по прерыванию - заказывает коллбек на событие "пришла новая свеча". В любом случае, данные с сервера получает Квик,а не юзер - в том виде, в каком удобнее именно ему.
Так и есть, только одно замечание, колбек не на событие "пришла новая свеча", а на событие "поступили новые данные" в источник.
Цитата
Владимир написал:
График-то построить можно, но это РАЗНЫЕ процессы - зачем же их смешивать? Мне вот графики нафиг не нужны, а свечи на что-то и пригодились бы.
Опять согласен с вами по сути данные функции и есть работа со свечами. Хотя назвали их "работа с графиками", но вот не пофиг ли.
Цитата
Владимир написал:
Да, конечно, можно и сразу получить часы - я имел в виду, что даже для минутных свечей при нынешних каналах связи объёмы никакие. И потом: откуда Квику знать, что нужно Вам? Он вполне может отдавать Вам то, что нужно Вам, а получать от сервера то, что нужно ему. Может, ему выгоднее получить один массив на все таймфреймы и формировать данные для юзера "на лету"? А нам какое дело, как именно он готовит для нас данные? Это проблемы Квика, а не наши.
Тут я думаю логика в том, что проще один раз посчитать свечи на сервере и отдать пользователю сразу, то что он запросил, чем на каждой рабочей станции, будут производиться такие вычисления.
Да и объемах данных разных таймфреймов различаются во много раз (например минутные от дневных в 60*24=1440 минус нерабочее время), и если учесть, что пользователей на сервере брокера могут быть многие тысячи, то все же это экономия трафика, а следовательно и скорость реакции увеличиться.
Но это всего лишь мои предположения.
Цитата
Владимир написал:
Кстати, и на низколиквидных инструментах свечи могут идти обычным порядком - мои так и считаются: вот включил я комп в 7 часов, так у меня все рублёвые и евровые активы и большинство долларовых не торгуются, а свечки тикают - просто у них цена не меняется. Я именно по ним и определяю, торгуется данный инструмент в данный момент или нет.
Значит для ваших задач такое решение подходит, но может не подходить другим.
Свечи в классическом понимании по сделкам формируются, и кому-то это может быть важным для стратегии.
Цитата
Владимир написал:
Так ведь актуальные данные это ТОЖЕ исторические данные! Прилетать новые свечки могут, изменяться - нет.
Тут есть маленький ньюанс, актуальные данные станут историческими только после закрытия свечи. А последняя свеча всегда меняется, если еще не закрыта и прилетает сделка.
CreateDataSource в цикле по большому списку, Анализ свечей по большому количеству инструментов
 
Цитата
Владимир написал:
Во-первых, почему CreateDataSource? Ведь алгоритмически задача проста до безобразия: получить с сервера некий массив данных, причём исторических данных! Что здесь вообще можно "Create"?
Тут немного сложнее реализовано, CreateDataSource создает источник данных (обычно обзываемый в примерах ds) в который сначала загружаются исторические данные, после чего постоянно добавляются актуальные (если запросить обновления через SetEmptyCallback, хотя по наблюдениям они прилетают даже без этого запроса)
Цитата
Владимир написал:
Во-вторых, какого хрена она в разделе "Функции для работы с графиками"? При чём тут вообще графики? У меня никаких графиков нет, не было и не будет, а со свечами я активно работаю.
А что это еще как ни данные для построения свеч из которых можно строить график?
Цитата
Владимир написал:
В-третьих, данные нужно получать фактически по одному интервалу (минутному), поскольку все остальные интервалы (даже полюбившиеся кому-то нестандартные) при необходимости прекрасно считаются из него прямо на клиенте (тики здесь явно инородное тело и должны быть выброшены нафиг).
Конечно можно, вот только зачем например мне получать минуты и высчитывать часы, если я могу сразу получить часы, а минуты меня не интересуют? Я могу и сам все высчитать, только зачем это делать, если мне дают сразу то, что мне надо.
Цитата
Владимир написал:
В-четвёртых, объём этих данных для одного тикера даже при круглосуточной работе: 60 минут * 24 часа * 30 дней * 12 месяцев * sizeof одной свечи = курам на смех даже за год, при этом более-менее востребованным является интервал размером в сутки, а время можно даже не указывать: порядковый номер свечи в массиве однозначно его идентифицирует.
А как быть на низколиквидных инструментах, когда, ну скажем сутки, не было сделок? Слетит весь порядок же. Да тоже чисто для удобства, чтобы не делать лишних вычислений.
Цитата
Владимир написал:
В-пятых, какого хрена здесь делает SetUpdateCallback?! Какая может быть "обработка изменившихся свечек"?! Повторяю: это ИСТОРИЧЕСКИЕ данные! Всё, поезд ушёл, ничего уже не меняется!
Потому что созданный источник данных это НЕ исторические данные, в него прилетают и актуальные данные. Вот коллбек на них и срабатывает.
Цитата
Владимир написал:
Какой-то тихий ужас, господа! Неужели вся эта кухня вообще хоть как-то работает?  
Не без косяков, конечно, но работает.
В таблицах после обновления не видны первые буквы тикеров в первой колонке, как исправить и есть ли формат таблиц?, В таблицах после обновления не видны первые буквы тикеров в первой колонке, как исправить и есть ли формат таблиц?
 
Проблема то известная, сходу находятся такие же темы
https://forum.quik.ru/forum8/topic6475/
https://forum.quik.ru/forum1/topic6410/
Вроде как в версии quik 8.13.0 таблицы могут съехать, а в 8.13.1 уже исправили
Если проблема в таблице текущих торгов, то "редактировать таблицу" -> "транспонировать" должно помочь
Так же можно сбросить ширину столбцов, нажав ctrl+w на таблице

Ну или пересоздать таблицу

И не помешает обновиться на версию 8.13.1 чтобы проблема не повторилась


Цитата
vladindre написал:
Версия 8.13.3.1
Это что за версия такая? На сервере арки не наблюдаю ее.
Список инструментов из табл. текущих торгов, Список инструментов из табл. текущих торгов
 
Цитата
Dr Wed написал:
Благодарю за подсказку.
Буду благодарен еще за такую наводку - как тащить свечки по интересующему инструменту?
Почитайте документацию https://arqatech.com/upload/iblock/194/quik_lua.zip "Интерпретатор языка LUA.pdf"
главу 3.10 Функции для работы с графиками
Цитата
Dr Wed написал:
Например, нужен Low за последние N дней или часов.
создаете источник данных,
дожидаетесь загрузки данных в источник,
смотрите лои свечей за интересующий вас период времени, ищите среди них минимальный
Список инструментов из табл. текущих торгов, Список инструментов из табл. текущих торгов
 
Уж сколько раз поднималась подобные вопросы.
Для таблицы текущих торгов обход элементов не предусмотрен.

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

Если я прав, то алгоритм следующий.
Через getClassSecurities получаем список инструментов, выдергиваем из него инструменты с нужным префиксом, для каждого из них вытаскиваем параметр количество дней до экспирации (DAYS_TO_MAT_DATE) и определяем у кого данный параметр минимален (либо в заданном диапазоне), с тем и работаем.

Делал я такое, там кода даже 10 строчек не наберется, насколько помню

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

Вот если бы видеть список зарегистрированный предложений и возможность как-то влиять на их приоритет, разработчикам было бы действительно понятно что надо пользователям.
Эх, мечты-мечты...
Но как я понимаю разработчики против такой открытости.
Построение индикаторов по нескольким источникам
 
Цитата
Andrey Bezrukov написал:
Регистрация пожеланий и их количество (по какому-либо определённому функционалу) позволяет оценить востребованность этого функционала, это влияет на принятие решения о реализации и выделения на это соответствующих ресурсов.
Вы по количеству пожеланий оцениваете востребованность?
Это одновременно и логично и не логично.

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

А получается, что мне и всем кому надо данный функционал требуется отписываться в теме что мол "надо, надо"??
Иначе вы его 10 лет делать будете.

Так мы все темы с пожеланиями заспамим подтверждениями востребованности.
Несчастное окно
 
Прошу зарегистрировать мое пожелание, которое почему-то оставили без внимания.
Цитата
BlaZed написал:
Да с этим окном еще и не работают горячие клавиши Alt+L - "Закрепить окно" и Alt+B - "Убрать заголовок".
Вот со всеми остальными окнами горячие клавиши работает, а с этим нет.
Тоже бы исправить.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
Насколько я понял, BlaZed, говорил про  подачу  заявки по рыночной цене. Меня это не устраивает - хрен знает, что там с рынком может произойти, так что я предпочитаю совершать сделки именно по той цене, которая указана. Или, по крайней мере, не худшей, так что заявки у меня всегда лимитированные.
У меня алгоритм такой, что я всегда либо в продаже либо в покупке сижу, потому мне важнее не конкретная цена сделки, а сам факт войти в шорт либо лонг при определенных условиях рынка.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Цитата
Владимир написал:
BlaZed, Именно! А от "дрочилова" у меня такое средство: если заявка по данному тикеру подана, выставляется тайм-аут в 5 минут (или 4, не помню), и пока он не истечёт, никаких новых заявок. При этом гарантированно все прерывания по сделкам (они же приходят пачками) уже пройдут. А каждое такое прерывание (если заявка в несколько лотов, и не все они реализуются за одну сделку) продлевает этот тайм-аут: время начинает отсчитываться уже с неё. Правда, эта скотина оказалась изобретательная: она честно выдерживает эти 5 минут, после чего снимает несработавшую заявку (или её остаток), и в ту же секунду выставляет новую - эту подлянку я до конца ещё не поборол. ::  
Предположу, когда таймаут заявки вышел, алгоритм должен снять заявку и обнулить сигнал, после чего заново оценить рынок, чтобы дать или не дать новый сигнал на покупку/продажу.
Если сигнал по какой-либо причине не обнуляется, то как раз вышеописанное поведение и будет наблюдаться.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
 
Владимир,Эх помню как тоже сначала пытался ловить тики, чтобы не прозевать самую лучшую цену, вместо одной заявки скрипт только и делал, что ставил, снимал заявки пока не поймает цену, дрочилово то еще было. Потом как вы начал выставлять заявки по ценам спроса/предложения, но после нескольких раз "гонок" с рынком, эту идею тоже отбросил. Сейчас при наличии сигнала просто бью по рынку, всего одна заявка которая тут же превращается в сделку, и наступило счастье..
Отладка LUA скриптов в IDE IntelliJ Idea 2020.1, Решаем проблему запуска отладки в IDE IntelliJ Idea 2020.1 настройка конфигурации отладчика.
 
Для отладки скриптов достаточно PrintDbgStr() и DebugView

PS: Когда-то существовал LUA отладчик decoda  https://unknownworlds.com/decoda/download/, но сейчас с его работой проблемы.
Ошибка скрипта после переподключения
 
Цитата
Старатель написал:
Нельзя в OnInit никаких ожиданий делать. Если данных нет, то они и не появятся пока из OnInit не выйдете.
Вы правы, не подумал об этом.
Да и основной поток ожиданиями напрягать тоже далеко не самая лучшая идея.
Благодарю.

Sergey, код из OnInit лучше перенести в main перед вечным циклом
Ошибка скрипта после переподключения
 
Кстати, а в чем смысл для каждого инструмента искать class_code?
По мне лучше указывать явно нужные sec_code и class_code, и понадежнее будет, да и код станет проще.
Ошибка скрипта после переподключения
 
Цитата
Sergey написал:
Проблема в .class_code. На этих инструментах он выдает "EQRP_INFO" а должен возвращать "TQBR"
Ну просто у вас существует два инструмента с одинаковым sec_code, но разными class_code
А функция getSecurityInfo возвращает данные по первому из найденных под заданные параметры инструменту
Надо для таких случаев явно указывать нужный class_code

Если использовали мой код, то вот небольшие изменения
Код
ticker_list = {{"SiM1"},{"SiU1"},{"FIVE","TQBR"},{"TCSG","TQBR"}}
function OnInit()
  if(isConnected()==1)then
    for key,value in pairs(ticker_list) do --в цикле перебираем бумаги из ticker_list
      local n=10
      while (getSecurityInfo((ticker_list[key][2] or ""),ticker_list[key][1])==nil)and(n>0) do sleep(1000) n=n-1 end -- Ждем загрузки данных по инструменту 10 секунд
      if(n==0)then message("Инструмент "..ticker_list[key][1].." не найден") ticker_list[key]=nil break end
      ticker_list[key][2]=getSecurityInfo((ticker_list[key][2] or ""),ticker_list[key][1]).class_code --получаем класс бумаги (TQBR,SPBFUT,CETS,ect.) по ее тикеру
      ticker_list[key][3]=CreateDataSource(ticker_list[key][2],ticker_list[key][1],iNterval) --создаем источник данных
    end
  end
end

string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
Цитата
s_mike@rambler.ru написал:
Цитата
swerg написал:
Считаю это ошибкой, которую разработчики QUIK должны исправить.
Интерфейс у терминала русский, по умолчанию для русских букв штатные upper / lower должны корректно работать.
интерфейс у терминала не только русский, увы...
И все же это ошибка

Запускать на только что запущенном квике, пока никакой скрипт локаль не установил еще
Код
message(string.upper('привет'))
message(os.setlocale(''))
message(string.upper('привет'))
Вывод:
Цитата
привет
Russian_Russia.1251
ПРИВЕТ
Как видно из примера, квик знает про нужную локаль, но почему то не устанавливает ее сам, хотя надо бы.

QUIK 8.13.1.16, интерфейс русский, Windows 10
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
Цитата
Артем написал:
альтернативно:
Классный способ, еще бы в нем русскую "ё" учитывать, было бы идеально.
string.upper(S) - русские буквы, Русские буквы в верхний регистр не получается сделать в string.upper(S) в Lua QUIK версии 8.13
 
Можно вот так
Код
function upper(s)
  local str=""
  for i=1,string.len(s) do
    local byte=string.byte(s,i)
    local char=string.char(byte)
    if(byte>= 97)and(byte<=122)then char=string.char(byte-32) end -- Латинские буквы
    if(byte>=224)and(byte<=255)then char=string.char(byte-32) end -- Русские буквы
    if(byte==184)              then char=string.char(byte-16) end -- Русская ё
    str=str..char
  end
  return str
end
Запуск скриптов по списку
 
Пока писал прошлый коммент подумал над предложением Евгения.

А вот если реализуют ваше предложение, и допустим запустили из основного скрипта 10 других. И один из них падает.

Как реагировать то на это?
Основной скрипт ложить, перезапускать упавший, игнорить с сообщением о падении?
Вроде как все варианты не очень.
Запуск скриптов по списку
 
Цитата
Артем написал:
Хотелось бы чтобы была функция авто-перезапуска упавших скриптов, в виде галочки например.
Если скрипт упал, то это ж явно нештатная ситуация и надо разбираться в причинах, а не тупо его перезапускать.
Запуск скриптов по списку
 
Цитата
Евгений написал:
Вы являетесь разработчиком Quik ?
Вы где-то у меня увидели подпись "QUIK clients support"?

Я интересуюсь зачем просите добавить то, что по сути то уже реализовано, и делается в три клика.
Запуск скриптов по списку
 
Цитата
Евгений написал:
Возможность запуска скриптов по заранее определенному списку. Например в скрипт добавляется список скриптов, и после запуска этого скрипта он запускает скрипты из списка
А зачем это может понадобиться?
Если надо запустить несколько скриптов одновременно, то выделяем в доступных скриптах нужные скрипты (мышкой с зажатой клавишей Shift либо Ctrl, это стандатрные возможности винды) и запускаем.
Что делает SetEmptyCallback() ?
 
Цитата
Артем написал:
BlaZed, при умном заказе без этой функции получение новых данных определенно не работает, только из открытого графика.
Проверил только что - работает даже при умном заказе при закрытом графике, потому и вопрос задал.
Просто возникло ощущение, что  SetEmptyCallback() стала не нужна.

QUIK если что 8.13.1.16
Что делает SetEmptyCallback() ?
 
Читаю описание функции SetEmptyCallback()
Цитата
Функция позволяет получать данные с сервера. Функция возвращает «true» в случае успешного завершения, иначе – «false».
Судя по описанию без нее новые данные не получишь.
Да и везде пишут, что при заказе надо делать так
Код
ds=CreateDataSource(class_code,sec_code,interval)
ds:SetEmptyCallback()

Итак. Вводные данные.
Выбираем инструмент который до этого не использовали, ну я выбрал "EuM1"
График инструмента не открываем, в заказе котировок указано "по выбранным классам" и данный инструмент не выбран, в папке archive файла с таким инструментам тоже нет.
Другими словами, QUIK пока еще никогда не получал данный инструмент.

Пишу простенький скриптик
Код
is_run=true
function main()
  ds=CreateDataSource("SPBFUT","EuM1",INTERVAL_M5)
--  ds:SetEmptyCallback()
  while(ds:Size()==0) do sleep(100) end
  while is_run do
    message("C="..ds:C(ds:Size()))
    sleep(1000)
  end
end
function OnStop()
  is_run=false
  return 100
end

...и он работает, данные обновляются.
Но почему данные обновляются?
Я же закомментил ds:SetEmptyCallback()

Всегда думал, что SetEmptyCallback() нужна для того чтобы поток данных обновлялся, но оказывается что нет.

Прошу знающих объяснить, зачем все таки нужна функция SetEmptyCallback()?
Ошибка скрипта после переподключения
 
Ну и причесать код бы не помешало, а то смотреть больно
вместо
Код
sTime=os.time(T)
datetime=os.date("!*t",sTime)
out_file:write(tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..","..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..","..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C)..","..tostring(V).."\n")
то же самое, только в нормальном виде
Код
datetime=os.date("!*t",os.time(T)+corrTime*3600)
out_file:write(string.format("%04d%02d%02d,%02d%02d%02d,%s,%s,%s,%s,%s\n",datetime.year,datetime.month,datetime.day,datetime.hour,datetime.min,datetime.sec,O,H,L,C,V))
и функция strText() как бы нафиг не нужна, ее возможности есть в string.format()
Ошибка скрипта после переподключения
 
Цитата
Sergey написал:
Вариант вынести все в OnInit()? Но ведь там тоже нет гарантии что переменная classcode успеет записаться сразу после инициализации скрипта, даже при условии проверки соединения и не вылетит с ошибкой
Именно вариант с OnInit() в данном случае самый надежный, надо всего лишь добавить парочку дополнительных проверок.

Смотрите

во первых, меняем ticker_list, делаем его двухуровневым массивом
Код
ticker_list = {{"EUR_RUB__TOM"},{"USD000UTSTOM"},{"SiM1"},{"SiU1"}}
во-вторых, переносим все одноразовые предварительные вычисления в OnInit(), данные скидываем в массив, сюда же добавляем дополнительные проверки
Код
function OnInit()
  if(isConnected()==1)then
    for key,value in pairs(ticker_list) do --в цикле перебираем бумаги из ticker_list
      while(getSecurityInfo("",ticker_list[key][1])==nil)do sleep(100) end -- Ждем загрузки данных по инструменту
      ticker_list[key][2]=getSecurityInfo("",ticker_list[key][1]).class_code --получаем класс бумаги (TQBR,SPBFUT,CETS,ect.) по ее тикеру
      ticker_list[key][3]=CreateDataSource(ticker_list[key][2],ticker_list[key][1],iNterval) --создаем источник данных
    end
  end
end
в-третьих, убираем ненужные вычисления из main(), а данные берем из массива, который заполнили в OnInit()
Код
function main()
  while is_run do
    for key,value in pairs(ticker_list) do --в цикле перебираем бумаги из ticker_list
      instrument=value[1]
      classcode=value[2]
      ds=value[3]
      while(ds:Size()==0) do sleep(100) end -- Ждем загрузки данных графика
--ТУТ ВАШ КОД--
    end
    sleep(3000)   -- приостановка на 3 секунды
  end
end

Примерно так.
Думаю должно работать без ошибок
Ошибка скрипта после переподключения
 
Цитата
Sergey написал:
classcode не глобальная - локальная в цикле for
Неа, она у вас именно глобальная. Обратитесь из любой другой функции к переменной classcode и удивитесь.

Цитата
Sergey написал:
попробуйте сами:
Не согласен, так же как и раньше выдаст ошибку на строчке
Код
classcode=getSecurityInfo("",instrument).class_code
и до проверки classcode==nil просто не дойдет

Тут дело в том, что ошибка плавающая, и будет появляться если удачно совпадет момент чтения данных из getSecurityInfo с моментом подключения к серверу, когда старые данные уже удалились, но еще не загрузились новые.
При вашем sleep(3000) это может быть, ну скажем 1 раз из 10 раз, а поставьте sleep(100), так сразу увидите, что ошибка никуда не делась.
Ошибка скрипта после переподключения
 
Цитата
Sergey написал:
Сейчас работает надежно, независимо от  коннекта к серверу:
Ну как вам сказать... скрипт ругался на невозможность получить getSecurityInfo("",instrument).class_code


Цитата
Sergey написал:
if classcode~=nil then
Такая проверка не поможет, ибо classcode у вас глобальная и после первой же итерации всегда будет не nil если инструмент существует, и по такому условию просто каждую итерацию скрипт будет пропускать
Ошибка скрипта после переподключения
 
Ну или можно обернуть в проверку соединения
Код
function main()
  while is_run do
    if(isConnected()==1)then
--- ТУТ ВАШ КОД --
    end
    sleep(3000)
  end
end
но код вам явно причесать не помешало бы, слишком много ненужных повторов действий
Ошибка скрипта после переподключения
 
При потере связи скрипт ругается на строчку
Код
      classcode=getSecurityInfo("",instrument).class_code --получаем класс бумаги (TQBR,SPBFUT,CETS,ect.) по ее тикеру
и вываливается с ошибкой
Код
C:\Scripts\Testers\1.lua:27: attempt to index a nil value
Я же спрашивал выдает ли скрипт какую ошибку... а говорите что молча останавливается

Тут решение сразу же напрашивается такое.
Вынести расчет classcode (а так же out_file и ds) за пределы бесконечного цикла с проверкой наличия соединения isConnected(), и поместить в массив, а в цикле уже брать значения из массива.
Нет никакого смысла каждый раз их заново находить, достаточно одного раза.
Ошибка скрипта после переподключения
 
Скрипт не должен завершаться при разрыве соединения, если, конечно, это специально не реализовано.

Поэтому возникают следующие вопросы:
1) Скрипт молча останавливается или ошибку какую выдает?
2) Если вручную переподключиться, скрипт остановится?
3) Если ли в скрипте колбеки onConnected, onDisconnected, onCleanUp? Если есть, то что в них?
4) Используется ли проверка подключеия isConnected? Если используется, то как именно?

В идеале показали бы скрипт, предварительно удалив из него то, что считаете ком.тайной.
Откуда брать идентификатор транзакции trans_id или же он рандомиться?
 
Идентификатор транзакции это параметр в диапазоне от 1 до 2147483647
Причем серверу QUIK даже не нужна уникализация данного параметра, сервер будет обрабатывать заявки даже если задать
Код
trans_id=1
хотя делать так, конечно же, не надо.

Уникализация trans_id нужна самому пользователю чтобы отслеживать через колбеки состояние своих заявок.
Тут на форуме много споров было, как лучше это делать.
Настройки и их сохранение.
 
Цитата
Kolossi написал:
Я чего-то недопонимаю в логике настроек переноса заказа данных в настройки (?).
Стоял фильтр заказа котировок. Снимаю галочку "фильтр инструмента" класса в
/Программа/Получение данных/Котировки и уверен что все хорошо. Однако при следующем входе галка на месте.
Ручное сохранение настроек эффекта не дает.   Версия 8.11
Сталкивался с такой проблемой
https://forum.quik.ru/messages/forum1/message51971/topic6116/#message51971

Был косяк в версии 8.11.0.66, в 8.12 был исправлен
Так что либо обновиться, либо (если не желаете обновляться) перед закрытием программы, отключитесь и подключитесь к серверу заново, тогда настройки котировок сохранятся.
Обновление Quik, Не обновляется Quik
 
Цитата
Александр написал:
Спасибо большое!! по правде хром и опера не разрешают больше работать с FTP буду искать как это устратить!
Еще раз спасибо, не думал что они это отключили возможность.
В Chrome включается так
Открывайте адрес chrome://flags/
Там включайте пункт "Enable support for FTP URLs"
Обновление Quik, Не обновляется Quik
 
Цитата
Folsan написал:
Здравствуйте! У меня не обновляется Quik. Пробовал запускать от имени администратора. Пробовал проверить наличие обновлений вручную. Ничего не помогает. Версия, стоящяя на компьютере: 8.11.0.66
Автоматически квик обновляется с серверов брокера, а брокер выкладывает обновление когда посчитает нужным.
Скорее всего брокер еще не выложил новую версию для обновления.

Но всегда можно обновиться вручную.
1) Выходи из квика
2) Скопируй куда-нибудь ВСЮ папку с установлнным квиком (на случай если что-нибудь пойдет не так, вернешь ее на место и будет как раньше)
3) Качай архив с последней обновой с сервера квикаftp://ftp.quik.ru/public/updates/8.13/quik_8.13.1_upd.zip
4) Распакуй архив в папку с квиком с заменой файлов
5) Готово
Страницы: Пред. 1 2 3 4 5 6 7 След.
Наверх