Еще ньанс: Данная ошибка выскочила всего 1 раз за год бесперебойной работы скрипта..
Сразу бы это сказали...
Цитата
Евгений написал: Хотелось бы узнать причину или как побороть данную ошибку, чтобы срипт не вылетал с ошибкой.
Вероятно при первой проверке getFuturesLimit вернул таблицу, а при второй у брокера что-нибудь глюкнуло, и getFuturesLimit вернул nil Надо было закинуть результат getFuturesLimit в переменную и ее уже проверять
function Normalize(num,step)
local a=(num+step*0.5)-(num+step*0.5)%step
return math.tointeger(a) or a
end
local bid=150.123456
local step=0.0001
local res=Normalize(bid,step)
print("res="..res)
Если Вас интересует такая возможность, мы можем зарегистрировать пожелание на соответствующую доработку. Уточните, пожалуйста, регистрируем такое пожелание?
Я хоть и не Юрий, но тоже прошу зарегистрировать пожелание реализации BOOK_OR_CANCEL для фиксированного формата
Еще бы за адекватное время реализовали. Доработка нужная, экономия на комиссии как-никак
nikolz написал: Хвалюсь. ------------------------------ Сегодня мой робот на сбере показал такую картинку с начала года.
Т е c 3.01.2024 профит 2.44%, из них 1.72 - лонг и 0.72 -шорт. Стратегия "купил и держи" дала бы 1%.
Чем тут хвалиться? Этой уродливой картинкой, по которой единственное, что можно понять, - что она опасна для глаз смотрящего? У меня цыгане на соседней улице живут, так вот от их шмоток в глазах меньше рябит.
Это Ваша проблема. Сочувствую.
Но ведь Glukator прав Думаете, что хоть один человек на форуме кроме вас может понять что на ней изображено?
Мы видим просто кучу рябящих в глазах линий, циферки какие-то и снизу надпись сбербанк )))
Просто представьте, что не вы ее создали и изначально не знаете что на ней изображено, не реально же разобраться в ней.
Посмотрите в сторону отправки Book_or_cancel заявок, похоже на то что вы ищите Реализовано правда пока что только через универсальный формат транзакций
Mark1010 написал: Можно ли его переадресовать на почту либо вовсе отключить?
Настройки двухфакторной авторизации зависит от брокера. Поройтесь в настройках личного кабинета или задайте этот вопрос непосредственно брокеру
Цитата
Mark1010 написал: Подскажите какие есть возможные варианты решения проблемы?
Когда у меня возник такой вопрос, то я решил не отключать двухфакторную авторизацию (все же это дополнительная защита денег), а автоматизировать прием и ввод смс. Подробности тут https://quik2dde.ru/viewtopic.php?id=341
Mikhail_04 написал: Мой скрипт начинает работу с подбора инструментов
Вот тут и завелась принципиальная ошибка.
У меня, например, скрипт постоянно в цикле проверяет является ли текущее время рабочим для биржи, установлено ли соединение с сервером, состояние торговой сессии, соответствие локального времени и времени последней свечи, корректность получения необходимых параметров рабочих бумаг. И только если все его устраивает, то запускается торговый функционал.
Короче, обвешайте свой скрипт дополнительными проверками.
Когда истекает её таймфрейм. Лично я с незакрытыми свечами вообще не работаю, а анализирую их именно в момент закрытия.
Вы что-то уже сами себе противоречите, то утверждаете что на все эти секунды миллисекунды болт забили, то вдруг анализируете свечи в определенный момент.Я вот тоже на незакрытые свечи внимания особого не обращаю, но ловить моменты закрытия.. нахрен надо. Анализируем все кроме последней (они по определению уже закрытые) и не страдаем ерундой.
На данный момент ввод заявки с признаком "Только пассивная" с помощью функции sendTransaction возможен при использовании универсального формата транзакций. Чтобы получить необходимое описание в данном формате, Вы можете в Рабочем месте QUIK в "Кармане транзакций" ввести требуемую транзакцию и сохранить ее в .tri-файл, после чего использовать полученные параметры в вызове sendTransaction.
Примите пожелание на реализацию функционала подачи пассивной заявки через фиксированный формат транзакций.
PS: Вот удивляюсь я с вашего наименования форматов. Тот что в квике называется универсальным нифига не универсальный и зависит от выбранного языка терминала. А формат который действительно универсальный, в квике называете фиксированным. Л - ЛОГИКА )))
Олег123 написал: Первые шаги на QPILE, буду рад комментариям по приложенному коду.
Вот не с того вы первые шаги делаете... Разрабы давно уже отказались от поддержки QPILE, развиваться язык больше не будет. Хочется программировать под QUIK пишите на LUA, а трупик QPILE совершенно нет смысла пинать
Roman Koledin написал: Спасибо за Ваше мнение - но позвольте (Отсутствие линии входа на графике и отсутствие истории Вы относите к СВИСТЕЛКАМ и ПЕРДЕЛКАМ) - как ?! То что главное и первое на что смотрится МОЖНО отнести к перделкам - повторюсь ЭТО ОСНОВА ОСНОВ в любой платформе!
Без обид, но для меня, например, это совершенно не важно. Зайдите в раздел пожеланий по развитию квика, почитайте, наверняка каждый второй свое пожелание считает критически важным. И много из этого реализовали? Да ничего практически. Раздел бесполезный, чисто поболтать. Исключения, когда пишут не про пожелания, а указывают на ошибки, это иногда реально исправляют.
Quik позиционирует себя как торговый терминал Инфа об инструментах есть, график есть, стакан есть, поручения работают. Все остальное и есть свистелки с перделками, которые реализуются самостоятельно.
Цитата
Roman Koledin написал: PS - И еще писать на LUA я к сожалению не умею - а устанавливать свистелки и перделки "созданные кем то" нет желания
Ну можете надеяться на разработчиков, когда через несколько лет надоест ждать, мнение, возможно, поменятся.
Вангую. Скоро в теме появится представитель разработчика, напишет, что "Ваше пожелание зарегистрировано бла-бла-бла". Потом еще раз появится и напишет "Мы рассмотрели Ваше пожелание бла-бла-бла реализация пожелания признана потенциально целесообразной и т.д." Через несколько лет кто-нибудь в теме спросит где же реализация Зайдет очередной представитель разраба и напишет "Реализация всех пожеланий происходит согласно нашему регламенту и т.д.", короче ждите Как-то так
Алексей А. написал: Не подскажете, при помощи чего можно сделать цикл перебора инструментов?
Да хотя бы так
Код
instruments={{"class1","sec1"},{"class2","sec2"},{"class3","sec3"},{"class4","sec4"}}
for _,val in ipairs(instruments) do
message(val[1].." "..val[2])
end
Цитата
Алексей А. написал: С "вечным циклом" и проверками разобрался.
Разобрался, говорите? На счет проверок вас впереди ждет не мало "сюрпризов", скоро это поймете.
Алексей А. написал: Подскажите, пожалуйста, что добавить в скрипт, чтобы можно было запустить его один раз, чтобы постоянно мониторил цену, пока не отключишь его.
Если вкратце, то Добавить цикл который будет крутить майн пока не остановите Добавить цикл перебора инструментов Добавить 100500 проверок, чтобы скрипт не скупил все растущие бумаги на все деньги ))
Сергей написал: Руками я могу и без QLUA торговать. Мне нужно эту штуку в другую штуку встроить и получить полный автомат :)))
Причем тут руки? Вроде как все понимают, что обсуждается логика робота.
Цитата
Сергей написал: Советника делаю, а плох тот советник, который сначала даст сигнал на лонг, а потом несколько сигналов на закрытие сделки.
Ну это весьма спорный вопрос. Появился сигнал на покупку - купили. Появился сигнал на продажу - продали. Появился второй сигнал на продажу, а продавать уже нечего - проигнорировали. Не вижу тут никакой проблемы, все логично и просто.
Цитата
Сергей написал: Вы сначала даете детсадовские советы, затем задаете вопросы, которые меня настораживают.
Так если вы задаете "детсадовские" вопросы, какого ответа вы ожидаете то? Готовый код робота ждете что ли?
nikolz один вариант предложил, я другой, чем недовольны непонятно
Сформулируйте вопрос нормально, получите другой ответ.
Определяем сколькими лотами торгуем, от этого и пляшем. У меня это рассчитывает функция, в зависимости от ГО, волантильности и остатка на счете.
Решили, например, торговать 10 лотов
Далее все просто
Если с шортами торгуем Есть сигнал на покупку и у вас меньше 10 лотов, докупаем до +10 лотов Есть сигнал на продажу и у вас больше -10 лотов, допродаем до -10 лотов
Если без шортов Есть сигнал на покупку и у вас меньше 10 лотов, докупаем до +10 лотов Есть сигнал на продажу и у вас больше 0 лотов, допродаем до 0 лотов
Библиотека bit32 стала нежелательной. Легко загрузить совместимую внешнюю библиотеку или лучше заменить её функции соответствующими битовыми операторами. (Помните, что bit32 оперирует с 32-битными целыми, а битовые операторы Lua 5.3 оперируют с целыми Lua, которые по умолчанию имеют 64 бита.)
Так что ваш вариант хоть и рабочий, но использовать его не рекомендуется.
У меня, например, проверка происходит примерно так:
Сергей написал: Прошу пояснить, по какой причине указан бит 0, и следующий сразу бит 2. Почему нет бита 1?
Исторически так сложилось.
Раньше, если память не изменяет, и для заявок и для сделок использовался один набор битовых флагов (загляните в справку по 7.x версии, например), потом из разделили. В любом случае смысла забивать этим голову нет, работаем с тем что имеем
Anton Belonogov написал: Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Тоже считаю возможность создавать пассивные заявки через sendTransaction весьма нужным функционалом. Надеюсь реализовывать будете не 10 лет.
Читаю тему и складывается такое ощущение, что друг друга просто не понимаете.
Цитата из руководства пользователя QUIK
Цитата
CLIENT_CODE 20-ти символьное составное поле, может содержать код клиента и текстовый комментарий (поле «Комментарий») с тем же разделителем, что и при вводе заявки вручную. Необязательный параметр
Проще говоря, то что мы помещаем в параметр CLIENT_CODE при формировании транзакции, должно попасть в поле "комментарий" в таблице заявок. Собственно, так оно и работает, и это весьма удобно для отслеживания и нахождения нужных заявок.
ТС же столкнулся с ситуацией, что вне зависимости от того что помещаешь в параметр CLIENT_CODE транзакции, в поле "Комментарии" в таблице заявок прилетает Номер счета. И весь вопрос в том кто в этом виноват, брокер или терминал.
Конечно есть вариант попроще. Тут на форуме есть пользователь Антон, его библиотека умеет выдергивать все возможные параметры из квика http://qgcp.totalh.net/
Параметр отвечающий за дату закрытия реестра называется dividenddate
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Как вам ответить, ленивый я, и люблю максимально автоматизировать все что можно. Чтобы не было необходимости постоянного ручного контроля. Не хочу я каждое утро включать комп как вы, у меня он всегда включен. Бывают же проблемы у провайдера, например порвалась интернет сессия потом восстановилась. В моем случае скрипт просто заново подключится к брокеру. А у вас? Руками подключаться, пропустив время торговли, когда возможно были удачные моменты для входа?
Ну или у меня настроено автоматическое получение обновлений винды, после которых при необходимости по ночам перезагружается система. Абсолютно пофигу, комп перезагрузится, пользователь автоматом залогинится, квик стартанет и подключится к брокеру, а утром продолжит торговлю как ни в чем не бывало.
Да даже банально свет выключили, а ИБП не выдержала долгого отключения. Когда дадут свет, все заведется и будет работать.
Или на месяц свалить на отдых и быть уверенным что торговля идет как и задумано.
По мне так сплошные плюсы
Цитата
Владимир написал: зачем автоматизировать потенциально аварийную ситуацию?
А где тут вы увидели "потенциально аварийную ситуацию"? Пару лет, если не больше работает так, аварий не наблюдал ни разу.
Цитата
Владимир написал: Не говоря уже про двухфакторную аутентификацию - там ведь и обратную связь нужно иметь, причём по независимому каналу.
Вот тут есть ваша правда, полностью независимого канала я этим лишился, комп имеет доступ к СМСкам, но это осознанные потери. Скажем так, автоматическая двухфакторная авторизация лучше чем полное отсутствие двухфакторной авторизации, но хуже чем через независимый канал.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: Какое отношение скрипт имеет к авторизации? Это дело Квика, но никак не скрипта - автоматическая авторизация не может быть реализована на любом языке.
Ну если квик не умеет автоматическую авторизацию, то приходится реализовывать это самостоятельно.
Цитата
Владимир написал: А скрипту она совершенно по барабану (моему, во всяком случае).
Так моему тоже )))
Есть торговый скрипт, а есть скрипт для авторизации. И это совершенно разные скрипты с разным функционалом.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: А что, собссно, нельзя реализовать на луа?
Например автологин и прохождение двухфакторной авторизации на "чистом" луа без доп. библиотек и сторонних утилит даже на представляю как сделать. А это весьма нужный функционал для автоматизации на мой взгляд.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: КАКИЕ ИМЕННО "костыли" позволяют добиться стабильной работы?
Шутить изволите? Да у меня значительную часть кода занимают костыли, которыми проверяю как факт доставки, так и корректность получаемых данных и даже передаваемых данных. Ну как пример
Код
local param=getParamEx2(class_code,sec_code,"LAST")
if(param.result=="1")and(param.param_image~="")and(param.param_type=="1")and(tonumber(param.param_value)~=0)then params["LAST"]=tonumber(param.param_value) end
и вот без подобных проверок на каждый чих замучаешься потом ошибки ловить, и будешь кричать на весь форум что квик говно.
У квика, на мой взгляд, основная беда в том, что нет гарантии что ты получишь данные, а если получил их, то это еще не значит, что они будут корректными. С отправляемыми данными из-за динамической типизации та же беда, надо всегда убеждаться что они корректные. Зато если убедился что с данными полный порядок, то скипт как-то стабильно работает, ну если руки не из жопы, конечно.
Цитата
Владимир написал: А вот Квик я как раз поменял, с девятой версии снова на восьмую. Десятку даже не пытался ставить, но по здешним отзывам она хуже даже девятки.
Всегда обновлялся практически сразу, как только арка обнову выкатывала. По-крайней мере всё что мне надо, работает начиная с седьмой и по десятую.
Цитата
Владимир написал: И что Луа есть полное дерьмо, но писать нужно именно на нём, тоже говорил.
Предпочтительно писать на луа, это да. Но далеко не все можно реализовать на луа. Я не про непосредственно торговлю, а про автоматизацию торговли, чтобы не сидеть перед монитором постоянно.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Владимир написал: Здесь ни в чём нельзя быть уверенным наверняка, и никакие костыли от этого не спасут.
Ну зачем так категорично-то? Спору нет, в Квике проблем хватает, но с помощью "костылей" вполне можно добиться стабильной работы. Я так уже и не помню когда в свои скрипты последний раз серьезные правки вносил, только мелочи всякие причесываю, да стратегию немного корректирую под текущие условия. Торгуют роботы, деньгу приносят и никаких проблем не наблюдается.
Цитата
Владимир написал: Я уже приводил пример, что данные портфеля ЧАСАМИ могут лежать неправильными.
Я бы после подобного брокера сменил.
Зачем постоянно на квик ругаться? Вы же тут сами постоянно пишете, что ваш робот 100500 инструментов одновременно торгует и зарабатывает. Квик это ж всего лишь инструмент, со своими, конечно, косяками, но работать на нем вполне можно.
Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?, Как из скрипта lua узначть что терминал QUIK загрузился полностью и подгрузил данные эккаунта ?
Рустем написал: Что является для программы триггером что можно начать анализировать данные и торговать ?
Нет четкого триггера. Есть только определенная вероятность того, что данные получены.
Я, например, опрашиваю таблицу, пока ее размер не станет больше нуля, но не дольше заданного времени. Если время прошло, а таблица все-еще пустая, то считаем что позиций нет.
Код
function FuturesClientHolding() -- Первоначальное заполнение позиций по срочному рынку
params["TOTALNET"] = 0 -- Текушие позиции
params["OPENSELLS"] = 0 -- Активная продажа
params["OPENBUYS"] = 0 -- Активная покупка
local n=0
while (runStatus==3)and(n<try_count)and(getNumberOf('FUTURES_CLIENT_HOLDING')==0) do -- Ждем заполнения таблицы "Позиции по клиентским счетам (фьючерсы)"
if(n==0)then message("["..account.."] Ждем... Позиции по клиентским счетам") end
sleep(loop_timeout) n=n+1
end
if(getNumberOf('FUTURES_CLIENT_HOLDING')>0)then -- Таблица "Позиции по клиентским счетам (фьючерсы)" заполнена
for i=0,getNumberOf('FUTURES_CLIENT_HOLDING')-1 do
local tbl=getItem('FUTURES_CLIENT_HOLDING', i)
if(type(tbl)=="table")and(tbl['firmid']==firmid)and(tbl['trdaccid']==account)and(tbl['sec_code']==sec_code)and(tbl['type']==0)then
params["TOTALNET"] = tbl['totalnet']
params["OPENSELLS"] = tbl['opensells']
params["OPENBUYS"] = tbl['openbuys']
end
end
end
message("["..account.."] Позиции: Текущие="..params["TOTALNET"].." Покупка="..params["OPENBUYS"].." Продажа="..params["OPENSELLS"])
end
Метод весьма далек от идеала, но лучшего не нашел.
PS: В свое время рассматривал еще один вариант. Перед проверками поставить один лот на покупку по минимально возможной цене (чтобы точно не сработала заявка), и тут же снять его. После чего ждать пока в таблице позиций не появится нужный инструмент, а он обязан будет появиться.
Предварительная проверка наличия в базе Quik инструмента (опциона), Subscribe_Level_II_Quotes и getParamEx не существующего опциона приводят к зависанию Quik
BlaZed написал: Можно в основном цикле сравнивать локальное время компа с вашими требованиями к работе скрипта по времени. При соответствии выполнять функционал, при несоответствии крутить пустой цикл.
вместо пустого цикла используйте sleep(время ожидания до следующего запуска)
Естественно пустой цикл со слипом, я просто не стал очевидные вещи расписывать
Можно в основном цикле сравнивать локальное время компа с вашими требованиями к работе скрипта по времени. При соответствии выполнять функционал, при несоответствии крутить пустой цикл.
- У меня квик виснет - Сделайте первое и второе и предоставьте нам информацию для анализа проблемы - Ничего не буду делать, я тут деньги теряю, догадайтесь сами что у меня поломалось
PS: ошибки в скриптах могут быть логическими, и проявляться только при определенных условиях, так что 99% времени работает стабильно, а потом виснет, вполне реальное поведение при ошибках в скриптах.