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

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

Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 19 След.
В чём преимущество OnInit
 
Цитата
Смысл Вы спрятали getScriptPath() от луа, так как функция эта qlua который еще не запущен.
Что значит не запущен.

Напишите скрипт из одной строки

message(getScriptPath())

и выполните его в терминале. Никакого OnInit нет.
В чём преимущество OnInit
 
Цитата
Так Вы его исключили, у вас или или это. Если его нет то идет конструкция or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or '' еще в глобальное поле занесли.
Потому что одни и те же скрипты могут запускаться не только в терминале Квике. Поэтому если нет в глобальном контексте метода getScriptPath, то значит вызов из командной строки, а значит надо разбирать аргументы, коих в терминале нет.
В чём преимущество OnInit
 
Кстати по по поводу пути. У меня путь определяется так:
local path      = (_G.getScriptPath and _G.getScriptPath() or (arg[0]:gsub('[^\\/]*$', '', 1):gsub('\\', '/'))) or ''
if path == '' then path = './' end

И это не в какой-то функции, а в самом начале скрипта. И как-то не вижу я проблем, чтобы getScriptPath не работал. Так что да, особого смысла в OnInit не вижу. Хотя, когда разбирался с окружением qlua, тоже использовал.
В чём преимущество OnInit
 
Цитата
Вы уверены в тот, что для нахождения всех колбек надо выполнить скрипт.
Lua  - интерпретируемый язык, сначала он должен заполнить пространство имен (скомпилировать кусок кода), только потом что-то вызывать. Правда это не выполнение скрипта, конечно. Т.е. если сделать определение некой глобальной переменной внутри какого-то метода, то будет ошибка, да.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
VPM написал:
Nikolay, Подскажите пожалуйста dll служит для обмена данными?
Да, dll для обмена данных. Можно выкинуть.

Что касается чтения, то при обрыве связи не будет сначала, т.к. скрипт же продолжает работать.Он просто будет ждать пока не придет очередная порция после восстановления связи.
А вот если его выключить, упадет Квик, то да, сначала. И в контексте той задачи, для которой он писался - это правильно.

И если хотите обсудить конкретное решение, то лучше для этого использовать ветку Discussions GitHub (правда если есть профиль).
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Но ведь это очередь.

Да хорошо ушел от колбека. Читаю таблицу можно наверное не писать а через присвоение. А что делать с индексацией?
Первого нужно вести, желательно и подчистить предыдущие данные.

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

Вот, я когда-то давно писал макет такого скрипта по просьбе - https://github.com/nick-nh/qlua/tree/master/quantScript
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Цитата
Как то перебирать всю таблицу да по нескольким инструментам меня смущает?
А что смущает? При старте внутри торговой сессии уже есть накопленные данные. Их надо перебрать (если надо). Для этого будет написан код.
Далее появляются новые записи. Например, через интервал 1 сек., появилось 10-100 записей. Берем и читаем их сразу за один проход, используя тот же, уже написанный, код И это без всяких колбеков.

Также стоит учитывать особенность колбеков qlua - при заказе данных, приедут все записи и на каждую запись будет колбек. Если читать колбеком, то придется обрабатывать построчно - это плохо и медленно.
Проще это сделать за раз. Пришли 50 тыс. записей - прочитать их разом, потратив на это 1 сек., если не меньше.
Очереди и двойные очереди в луа, Пример из книги Р.Е.
 
Здесь вопрос зачем эта конструкция используется. Если задача - просто собрать данные в таблице всех сделок, то да, конечно, можно это делать через колбек. Но зачем?
Есть таблица. У нее есть размер. Изменился размер - значит там появились новые записи. Пройдись по ним и обработай. И так порциями обрабатывать. По крайней мере я так привык делать, когда надо в реальном времени опрашивать данные с портов. Да, колбек - это красиво, модно и т.д. Но если речь про деньги или про критически важный параметр с датчика, то не ленись, опрашивай его. Надежность решения важнее красоты.

Поэтому - читаете таблицу, хоть всю подряд (но это в момент расход памяти), либо через специальную функцию SearchItems интерфейса qlua. И делайте это в потоке main, тогда это не будет нагружать поток терминала.Например, простой скрипт записи всех сделок в файл, читая первоначальную порцию накопленных данных, делает это очень быстро: 100 тыс. записей пишется за секунду - две.
В чём преимущество OnInit
 
Цитата
Если в самой функции коллбэка используется нечто не объявленное ранее, и он сработает, возникнет ошибка.
Поэтому это "нечто" нужно объявить до запуска main.
Я не буду ничего говорить по поводу данной возможности, кроме того, что если так делается, то это очень плохой стиль. Я такое могу представить только через глобальные переменные.
В колбеке идет обращение к ним, а сама переменная объявляется где-то. И это плохо. Не считая самих глобальных переменных, коих у меня нет вовсе.
Каждый блок когда должен оперировать своей областью видимости, объявленной ранее. Да, глобальный контекст есть. Но использовать его как единственно доступный - это пут в ад, где происходят магические преобразования, по причине случайных коллизий в именовании переменных.
В чём преимущество OnInit
 
Цитата
Ziveleos написал:
Владимир,  переменные окружения показывают разницу между body и OnInit.
Получается, если до зарезу необходимо сделать что-то до начала работы коллбэков, и в этом "что-то" используются функции объявляемые позже, то без OnInit не обойтись. В остальном он на фиг не нужен.
Body скрипта выполняется в потоке терминала. Так что служебные переменные вполне себе инициализируются там.

Читаем документацию:
Цитата
Как и в предыдущей структуре скрипта Lua, после его запуска первоначально выполняются
сценарии, описанные в <BODY>, если они присутствуют. Далее происходит вызов обработчика с
именем OnInit(), если он присутствует. В обработчике OnInit() пользователь имеет возможность
инициализировать все необходимые переменные и библиотеки перед запуском отдельного потока.
После завершения функции OnInit() происходит создание отдельного потока РМ QUIK, и в этом
потоке начинает выполнение функция main(), которая обязательно должна присутствовать в
скрипте.

Так что тело скрипта вполне себе достаточно. OnInit вполне можно использовать для каких-то действий после выполнения служебных процедур, например проверить, что запуск возможен. А если нет - отказ. Но все это можно делать так или иначе.

Речь же про колбеки звучит странно, т.к. я слабо себе представляю использование колбеков в алгоритме, если они не обработаны все. Например, запуск в середине торгового дня. Половина колбеков уже прошла, надо читать прошедшие события из таблиц, и здесь уже не важно как инициализировать. Поэтому колбеки - это вспомогательный инструмент, не более. "Прибивать гвоздями" их к логике - не самая лучшая затея. Он может и не прийти, в конечном итоге. Гарантированной доставки в документации не декларируется.
Интервалы CreateDataSource
 
Цитата
Kolossi написал:
Если я правильно понимаю, свечи формируются из тиковой базы сделок. Так в чем проблема передавать в свечи не только те кастрированные параметры которые придумали японцы сто лет назад? Там ведь добавить всего ничего.
Ну, у окна доступные скрипты до сих пор нельзя изменить размер, древнейшая кодировка ANSI - и это не критически важная часть, явно только клиент. А Вы на святое замахнулись, сервер.
Интервалы CreateDataSource
 
В описании доступных методов нет такой возможности. Так что нет. Впрочем, я не увидел очень уж существенной нагрузки при чтении ленты сделок. Ожидание заказанных данных долгое - это да, но когда они пришли и прочитан первый большой блок, дальше уже все терпимо. Правда за памятью надо следить.
Скрипт который выставляет заявку исходя из объема портфеля и предыдущей исполненной заявки, Возникают непонятные проблемы с запросом информации о портфеле и заявке. Постоянно возвращается nil, что бы не спросил.
 
Никто же не знает задачи. Алгоритм либо перебирает все бумаги некой коллекции и запрашивает данные, либо фиксируется на одной, двух и т.д.
Скрипт который выставляет заявку исходя из объема портфеля и предыдущей исполненной заявки, Возникают непонятные проблемы с запросом информации о портфеле и заявке. Постоянно возвращается nil, что бы не спросил.
 
Цитата
Alexey89 написал:
getParamEx (STRING class_code, STRING sec_code, STRING param_name)
Это же сигнатура функции. Т.е. надо передать код класса (строка), код бумаги (строка), имя получаемого параметра (строка). Возвращается таблица с данными или nil, в случае неудачи.

Читайте документацию по методам. Можно онлайн - https://luaq.ru/getParamEx.html
Скрипт который выставляет заявку исходя из объема портфеля и предыдущей исполненной заявки, Возникают непонятные проблемы с запросом информации о портфеле и заявке. Постоянно возвращается nil, что бы не спросил.
 
Посмотрите внимательно на формат вызова функций
TABLE getPortfolioInfo (STRING firm_id, STRING client_code)                        
TABLE getParamEx (STRING class_code, STRING sec_code, STRING param_name)                        

Нет варианта с строковым параметром "all"
Не снимаются заявки в секции FORTS
 

Lua 5.3 introduces the integer subtype, which uses 64-bit integer by default.

From Lua 5.3 reference manual

The type number uses two internal representations, one called  integer and the other called float. Lua has explicit rules about when  each representation is used, but it also converts between them  automatically as needed (see §3.4.3). Therefore, the programmer may  choose to mostly ignore the difference between integers and floats or to  assume complete control over the representation of each number.  Standard Lua uses 64-bit integers and double-precision (64-bit) floats, but you can also compile Lua so that it uses 32-bit integers and/or  single-precision (32-bit) floats. The option with 32 bits for both  integers and floats is particularly attractive for small machines and  embedded systems. (See macro LUA_32BITS in file luaconf.h.)

Раз введен новый подтип, то возвращаемые данные будут integer, для примера:

print(math.type(1)) -- integer
print(math.type(1.0)) -- float

А раз так, то нет необходимости преобразовывать данные. Впрочем, наверно, Вы все это знаете.
QUIK для ARM
 
Это нормально когда софт стоит дороже железа - тоже стоит принять за данность. Зачастую труда в его создание вложено намного больше. Впрочем, пока сам не начнешь создавать коммерческий продукт - не начнешь ценить.
Цитата
И из всего его функционала используется процентов 20.
Смысл переплачивать?
Есть смысл не покупать такой продукт, а найти аналог. А вот воровать его точно не имеет смысла. Тем более, если такой продукт используется как инструмент для коммерческой деятельности. Это как землекопы будут воровать экскаваторы, если можно обойтись лопатой.

Что касается покупок, не делайте предположений. Весь софт куплен. Пресловутый Photoshop покупать нет нужды - есть подписка. Когда он мне был нужен на месяц - оплатил месяц и все. Офис не нужен в отдельной поставке, поэтому не покупается. Вполне достаточно бесплатного онлайн варианта. Да и на MacOS файлы прекрасно открываются и редактируются без продукции Microsoft.
Что касается окружения, то DebugView не нужен. Отладка производится прекрасно и без него. Впрочем, на linux много своих утилит. А вот тот же офис как данность для компаний, тот же терминал, много проприетарного софта - это и есть окружение, которое тормозит многие компании от перехода и развития окружения на linux.

Но, как говорится, время все рассудит - иногда такие переходы становятся вынужденными. Поэтому лучше быть готовым к этому, чем оказаться внезапно в ситуации.
QUIK для ARM
 
Цитата
А варез? А старые программы? Или программы, которых автор обновляет редко?
Пираты не будут выкатывать по три варианта вареза: x86/amd64 (что одно и то же), для Apple и еще arm.
Им бы с чем-то одним справиться. В лучшем случае под винду и мак одновременно.
Или вы предлагаете платить за фотошоп и офис, да еще и по-русски?
Нет, нужна классическая пиратская версия от европейских хакеров.
И самая свежая, они есть.
Но под Arm пока выпускают мало.
Тем более есть мнооого специальных и редких программ.

Так что и Квик без arm-a это нормально. В порядке вещей.
Может это сарказм, но как-то странно все это слышать. Привыкайте платить за софт. Это нормально. Почему-то в других областях не вызывает вопросов, что продукт стоит денег. Хотя, возможно, раз здесь можно украсть, то и там была бы возможность сделали бы.

Что касается ARM, то на данном этапе более логичным и важным был бы релиз для linux. По крайней мере ушла бы необходимость покупать Windows, что для многих является существенной статьей расхода, особенно если рабочих мест очень много.
Как убрать рекламный баннер?, Реально злит!
 
Да, можете зарегистрировать. Хотя не очень понятно почему это надо делать. Впрочем, причины очевидны - место размещения рекламы.
Как убрать рекламный баннер?, Реально злит!
 
Цитата
Karina Dmitrieva написал:
Здравствуйте, Sergey.

К сожалению, самостоятельно отключить баннер возможности нет, т.к. его отображение настраивается брокером на стороне сервера для всех пользователей.
Это не совсем корректно, т.к. он отображается в панели инструментов, которая недоступна для редактирования. Поэтому и возникает вопрос - а почему есть такая панель в интерфейсе недоступная для редактирования? Была бы возможность снять видимость, вопроса бы и не было.
Классическая тема для quik на Windows 10
 
Вот так пожелания одних делают плохо для других. Теперь в версии 10.2 интерфейс ужасен. Как же надоели эти новомодные плоские интерфейсы. Сделайте отключаемое текущее поведение.
И разу уж изменяете интерфейс, то, видимо, стоит сделать изменяемый размер окна "Доступные скрипты", что просят уже очень давно.
LUA и PIPE
 
Дело не в скорости а в самой технологии DDE. 1. Она только в Windows (правда был еще в OS/2). 2. Это очень древняя технология, сколько ей осталось - не ясно.
Но, конечно, если задача выдать данные в Excel, то да - это самое простое решение, хоть и со своими нюансами.
Последовательность обработки функций обратного вызова
 
Цитата
Cyber написал:
Цитата
В идеале нужно записывать данные в таблицу с индексом и сразу возвращать управление, всю обработку производить уже в main.
Это все хорошо, когда БА двигается медленно. Но если нам надо успеть выставить новую заявку за доли секунды после срабатывания предыдущей. Иначе можем нарваться на комиссию биржи.
В main можно делать только медленные запросы на сервер, требующие ожидания ответа. Если смешать всё в main, то все станет медленным из-за ожидания ответов. Из-за этого еще может потребоваться делать задержки в main.
И перенос в main требует держать глобальные переменные или таблицы в памяти.
В разумных пределах выгоднее высокочастотное делать в OnTrade. И очередь из коллбеков НЕ может расти бесконечно, так как новые заявки не успевают выставиться.
Самое главное, меня интересует, будет ли эта очередь выполнятся строго последовательно?
Что-то странное у Вас происходит в main. Мне, наоборот, приходится вводить параметры - число транзакций в секунду, иначе у некоторых брокеров приходит ответ "Превышено максимальное количество 30 транзакций в интервале 1 сек.". И все это в main и никаких колбеков.
Колбек как концепция хороша, но если она используется, то должно соблюдаться условие гарантированности доставки. Что нельзя сказать о колбеках в терминале. Плюс многократные технические вызовы оных, плюс исполнение оных в потоке терминала, т.е. есть шанс, что это будет медленно.
Не знаю как другие, но раз мы здесь про деньги, то должно быть надежно, гарантировано и воспроизводимо, поэтому я как-то лучше обойдусь без колбеков.
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
 
Любая обработка клиент-сервер требует той или иной обработки ожидания. А по поводу main - так любой скрипт, предполагающий длительную работу в среде терминала, должен содержать эту функцию.

Документация "Использование Lua в Рабочем месте QUIK.pdf", раздел 2. Взаимодействие потоков Lua скрипта
Рисование индикатора с определенной свечи, Рисование индикатора с определенной свечи
 
Для всех предшествующих баров поставить значение nil. C определенной по текущую поставить значения. Если надо сдвигать линии, то также для устаревших баров ставить знаяение nil.
LUA и PIPE
 
Код
   local pipe = io.open("\\\\.\\PIPE\\"..pipe_name, "wb") -- открываем именованный канал
   if not pipe then
       return false
   end
   pipe:write(msg) -- записываем сообщение в канал
   pipe:close() -- закрываем канал
Как заставить индикатор не округлять "последнее значение"?
 
Цитата
green_X5 написал:
Да, зарегистрируйте пожалуйста.
Есть надежда что сделаете это довольно быстро, там ведь в вашей "виртуальной машине" всего-то убрать одну паразитную функцию округления. Или например изменить её до округления до 2-х знаков, что вполне приемлемо для всех индикаторов.
Не забывайте, что есть инструменты с точностью 5 знаков после запятой. А если добавить еще точность вычисления 2 знака, то уже надо все 7 знаков.
Как обрезать число типа float до 2х знаков после запятой
 
Цитата
Согласен.

Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01.
Вот отсюда:  https://bot4sale.ru/blog-menu/qlua/512-floor-to-step.html
Стоит помнить о вычислениях с плавающей запятой. Такой подход может дать неожиданный сюрприз.
GetLabelParams, GetLabelParams как работает?
 
L - это возвращаемая таблица метода GetLabelParams. Но если метка не найдена, то будет возвращено nil.
Поэтому надо проверять L на nil прежде чем индексировать. На самом деле это надо делать для всех методов qlua.
Отладка кодов индикаторов, Отладка кодов индикаторов
 
Если Вы отлаживаете просто алгоритм, то лучше написать тесты. На истории еще можно как-то отлаживать в привычном понимании. А вот когда идет поток в реальном времени, то как Вы себе представляете отладку - останавливать основной поток терминала. Вряд ли это приемлемо. А так да, так называемый print debug позволит найти ошибки.
Волшебное исчезание меток
 
Как-то нет никакой обратной реакции. Хоть бы сказали, что да, метки реиндексируются при каждом запуске терминала. Делайте что хотите.
Либо все же надо это исправить, например дать возможность искать метки по внешнему индексу, задаваемому при установке метки. Или не применять реиндексацию, а выдавать для новой метки индекс из пула свободных индексов и только когда он пустой увеличивать индекс на 1.
unexpected symbol near '<\171>', В тексте функции main() всего три строки!
 
Проблема в расширенном символе « код 171. О чем, собственно, и пишется.
Кол-во в заявках стакана на одном ценовом уровне, Кол-во в заявках стакана на одном ценовом уровне
 
Да, сумму. Собственно, параметры так и называется "Спрос по лучшей цене", "Предложение по лучшей цене". Т.е. всего по лучшей цене.
Кол-во в заявках стакана на одном ценовом уровне, Кол-во в заявках стакана на одном ценовом уровне
 
Таблица текущих торгов. Данные из неё получаются методом getParamEx https://luaq.ru/getParamEx.html
Кол-во в заявках стакана на одном ценовом уровне, Кол-во в заявках стакана на одном ценовом уровне
 
Для получения спроса и предложения по лучшей цене, не надо получать весь стакан. Эти данные есть в ТТТ, параметры BIDDEPTH, OFFERDEPTH. Правда они могут быть не в лотах, а в шутках, т.е. надо разделить на лотность.
Кривые шибки в QLua
 
Цитата
nikolz написал:
getClassSecurities
То что список некорректный в сообщении указано. А то что входящий параметр в функции getClassSecurities не проверяется тоже очевидно из-за молчаливого падения терминала. Собственно сообщение о падении терминала, а не о работе самой функции. Хотелось бы видеть в методах qlua возвращаемое значение. А если что-то не так, то nil, например, и вторым параметром уже описание - "сам дурак, что на вход передаешь". Сейчас же, случайно переедал не то и привет... И приходится каждый метод qlua оборачивать в свой assert.
Кривые шибки в QLua
 
Это строка приводит к падению терминала (10.1.2.2):
Код
local sec_list = getClassSecurities('TQOD|TQOB|TQTD|TQTF|EQEO|EQOB|EQDB|SPBBND|SPBXM|QJSIM|TQBR|FQBR|SPBFUT|CETS')

Да, есть ошибка в передаваемом параметре, но, кажется, это не должно приводить к падению. Есть ощущение, что просто нет unit тестов методов qlua...
Волшебное исчезание меток
 
Цитата
Уточните, как именно Вы аварийно завершаете работу терминала? Так же просьба подробно описать последовательность Ваших действий. Для анализа проблемы просьба прислать скрипт с уточнениями нам на  quiksupport@arqatech.com  со ссылкой на данную ветку форума.
Ок. Раз Вы сами не можете проверить происходит ли переиндексация меток при каждом запуске терминала, вот два скрипта.

Первый добавляет метки:
Код
local path = _G.getScriptPath()

local sleep = _G.sleep
local log_file

local AddLabel          = _G.AddLabel

local function init_log()
    log_file = io.open(path.."\\add_labels_test.txt", "w")
end
local function close_log()
    if io.type(log_file) == 'file' then
        log_file:close()
    end
    log_file = nil
end

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function log(...)
    if not log_file then return end
    log_file:write(tostring(os.date("%c", os.time())).." "..log_tostring(...).."\n");
    log_file:flush();
end

function _G.OnStop()
    close_log()
end

function _G.main()

    init_log()
    log('start')

    local tag = 'virt_test'

    local date = tonumber(os.date('%Y%m%d', os.time())) or 0
    local time = tonumber(os.date('%H%M%S', os.time() - 120)) or 0

    local label_params = {}
    label_params.YVALUE = 172.0
    label_params.TEXT = ''
    label_params.HINT = ''
    label_params.DATE = date
    label_params.TIME = time
    label_params.FONT_FACE_NAME = 'Arial'
    label_params.ALIGNMENT = 'RIGHT'
    label_params.FONT_HEIGHT    = 3
    label_params.TRANSPARENT_BACKGROUND    = 1

    for i = 1, 100 do
        label_params.TEXT = tostring(i)..': |||||||||||||||||||||||||||'
        label_params.YVALUE = label_params.YVALUE + 0.1
        local l_id = AddLabel(tag, label_params)
        log('add label', i, 'id', l_id)
        sleep(10)
    end

end

Второй читает:
Код
local path = _G.getScriptPath()

local log_file

local GetLabelParams    = _G.GetLabelParams

local function init_log()
    log_file = io.open(path.."\\check_labels_test.txt", "w")
end
local function close_log()
    if io.type(log_file) == 'file' then
        log_file:close()
    end
    log_file = nil
end

local function log_tostring(...)
    local n = select('#', ...)
    if n == 1 then
    return tostring(select(1, ...))
    end
    local t = {}
    for i = 1, n do
    t[#t + 1] = tostring((select(i, ...)))
    end
    return table.concat(t, " ")
end

local function log(...)
    if not log_file then return end
    log_file:write(tostring(os.date("%c", os.time())).." "..log_tostring(...).."\n");
    log_file:flush();
end

function _G.OnStop()
    close_log()
end

function _G.main()

    init_log()
    log('start')

    local tag = 'virt_test'

    for l_id = 1, 1000 do
        local l_params = GetLabelParams(tag, l_id)
        if l_params then
            log('find label', 'id', l_id, 'text', l_params.text)
        end
    end

end

Запускаем терминал. Запускаем скурипт, добавляющий метки. Удаляем несколько меток, чтобы образовались дырки в последовательности id меток. Можно еще проще сделать - добавить метка, удалить все метки и заново добавить. В результате id меток будет начинаться не с 1.

Tue Mar  7 13:30:26 2023 start
Tue Mar  7 13:30:26 2023 add label 1 id 101.0
Tue Mar  7 13:30:26 2023 add label 2 id 102.0
Tue Mar  7 13:30:26 2023 add label 3 id 103.0
Tue Mar  7 13:30:26 2023 add label 4 id 104.0
Tue Mar  7 13:30:26 2023 add label 5 id 105.0
Tue Mar  7 13:30:26 2023 add label 6 id 106.0
Tue Mar  7 13:30:26 2023 add label 7 id 107.0
Tue Mar  7 13:30:26 2023 add label 8 id 108.0
Tue Mar  7 13:30:26 2023 add label 9 id 109.0

Теперь закрываем терминал, даже не аварийно. Запускаем терминал заново. Запускаем второй скрипт и видим что метки получили индексы с 1, тем самым те индексы, что были получена при добавлении утеряны. Вывод: при каждом запуске терминала происходит переиндексация меток.

Tue Mar  7 13:30:02 2023 start
Tue Mar  7 13:30:02 2023 find label id 1 text 1: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 2 text 2: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 3 text 3: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 4 text 4: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 5 text 5: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 6 text 6: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 7 text 7: |||||||||||||||||||||||||||
Tue Mar  7 13:30:02 2023 find label id 8 text 8: |||||||||||||||||||||||||||
Фильтрация транзакций "своего" робота
 
Цитата
Максим написал:
Тот же вопрос всплыл с новым аспектом. Заявки, поданные через терминал руками, теперь имеют связанные транзакции, у которых есть ID. И теперь совсем не ясно как роботу отличить свои транзакции от ручных. Идеи?
Для этого лучше использовать brokerref = комментарий транзакции
Волшебное исчезание меток
 
Ну и сразу предложение:

Обязательно нужен метод ПолучитьВсеМетки - возвращает массив с индексами всех меток на указанном графике.

И желательно иметь метод ПриСдвигеМетки. Его, конечно, лучше сделать как регистрируемый колбек на метку, типа RegisterOnMoveLabel(id, chrt_id, func). Вызываемый по событию "MOUSE_RELEASED". Т.е. указателем взяли - отпустили.
Сейчас же приходится постоянно опрашивать метку на предмет новых данных - не самое лучшее занятие.
Волшебное исчезание меток
 
Все намного веселее, как оказалось.

Установил метки, запомнил их ID. Аварийно завершаю терминал. Перезапускаю терминал. Скрипт считывает метки и проверяет их.

Часть меток меняет свой id. Например, было 155 стало 162. Возможно часть меток исчезла, а может и сами как-то переиндексировались. В результате считывая метку, получаем чужие данные.

Но это очень плохо. Если нет гарантий, что id метки неизменен, то надо каждый раз искать, проверять, что метка та же, что и была.
ошибка в использовании io, вопрос по синтаксису
 
Файл может быть не доступен для записи (права доступа, заблокирован другим процессом).
Также может быть включен Контролируемый доступ к папкам Windows.
Максимальный лот для фьючерса., Подскажите формулу расчета максимального лота для фьючерсов.
 
Цитата
awkozlov написал:
Я не стремлюсь к  хирургической точности цифры, мне хотя бы порядок сделки определить.  Поэтому я сделал костыль:   1.покупаю для начала один лот,   2.записываю в файл, сколько он отъел свободной маржи после открытия позиции,  3.при следующем открытии свободные средства делю на это записанное в файл, и получаю максимальный лот.  Теперь можно хоть как-то ориентироваться в размерности ценовых координат.  Файлик обновляю при следующих сделках (на всякий случай).  Но я крайне удивлен отсутствием базовой информации о торговле в торговом терминале.  Может где-то есть стоимость лота в валюте депозита? Где это лежит?
Если речь про ГО, которое необходимое заплатить при открытии позиции по указанной цене, то это необходимо рассчитывать. Вот ветка с обсуждением https://forum.quik.ru/messages/forum10/message45889/topic5519/#message45889

А если надо просто узнать сколько максимально можно открыть по этой цене, то можно воспользоваться методом CalcBuySell  https://luaq.ru/CalcBuySell.html
вопрос к разработчикам QLUA
 
Цитата
nikolz написал:
На самом деле это вам лишь видимость. Такая игра кошки с мышкой.
Вы сами не торгуете.
Это все известно. На то он и брокер, в полном понимании этого слова. Но т.к., как Вы выразились, видимая часть разделена по субсчетам, то и указывать субсчет необходимо. Уж такая структура хранения у брокера. Не плохая, не хорошая - такая.
вопрос к разработчикам QLUA
 
Цитата
nikolz написал:
------------------------
Возможно изначально он был обязателен, но сейчас он подобен аппендиксу  у человека.
---------------------------
Типа есть, но нафиг нужен.  
Нужен. Я меня счет один, а два кода клиента. И необходимо указывать тот, с которого идет торговля. Это субсчет - на одном ИИС, другой простой. На одном есть деньги, на другом нет.
вопрос к разработчикам QLUA
 
Да, счета и субсчета (т.е. коды) у брокера. Однозначно связать счет и код клиента нельзя, т.к. в таблице кодов больше ничего нет. Но.


Смотрим на таблицу money_limits (Лимиты по денежным средствам), для нее код имеет смысл. В ней есть фирма, есть счет, есть код клиента. Так и выходит, что можно только сказать - а можно ли с этим кодом, на этом счете, по этой фирме  что-то сделать. Кодов же много может быть. На одном есть деньги, на другом нет. Хотя подать транзакцию можно, раз доступен код по фирме, счету. Ну и сколько брокеров не видел, фирма для срочного рынка отличается от фондового. По ней, как минимум, отсечь недоступные классы инструментов. И выбирая инструмент, по его классу даем список сочетаний доступных счетов, субсчетов.
вопрос к разработчикам QLUA
 
Не разработчик, но, кажется, соответствие идет от фирмы, не счета. Счет от класса инструмента. Также от класса инструмента фирма. И по уже по фирме проверяем, что код клиента и счет для одной фирмы.
Ошибка при использовании loadstring в Lua 5.4.1
 
в 5.4 для этого используется функция load
и такая дребедень Целый день
 
Цитата
Попробуйте переподключиться, чтобы попасть на другой сервер
Если я правильно помню, Сбербанк убрал второй сервер. И он один. Соединения нет, а если есть, то данные асинхронны. Вопрос в другой ветке - почему сервер допускает такое, и есть ли контроль, без ответа.
Почему-то не происходит обновления табличных данных лучший спрос и лучшее предложение (брокер СБЕР) ??, Два дня на
 
Ок. Правда с брокером Сбербанк - это бесполезная просьба. Техподдрежка не видит проблем, кроме очевидных - невозможно установить связь.


Правда я так и не понял какой ответ на вопрос: Есть ли контроль синхронности данных в серверной части. Если необходимы данные, то предположу, что нет. И каждый брокер сам решает свои проблемы. По идее, когда идет нарушение синхронности, то сервер должен просто блокировать передачу. Иначе такие данные могут навредить. Уж лучше ничего, чем такое.
Страницы: Пред. 1 2 3 4 5 6 7 8 9 10 11 ... 19 След.
Наверх