Суть вопроса в том что "10:00:05" это серверное время и торги по времени уже начались, а функция status == false не дает торговать каое-то время. В принципе меня этот вопрос не особо волнует т.к. для опционов время в боте стоит - старт торгов в "10:01:00", финиш в "18:44:00" (вечерняя сессия по аналогии), но все же хотелось бы понять почему status живет своей жизнью. Был еще такой момент у одного из товарищей (писал об этом в другой ветке), бот торгует - у фьюча status == true в течение всей торговой сессии, а вот у опционов с утра все норм, а ближе к вечеру (точное время уже не помню) - status == false - и понятное дело бот не торгует опционы, а торговля то идет.
Да и сама эта функция как то странно себя ведет: время "10:00:05", а status == false, (на 3-5 сек. на старте торгов задерживается), время "18:45:33", а status == true. Прокомментируете?
Рекомендуем проверить статусы инструментов/классов, в момент создания транзакции. Это касается таких параметров, как "Состояние сессии" и "Статус торговли инструментом" в таблице текущих торгов. Если "Сессия" покажет "закрыта" и/или "Статус" будет "не торгуется", то транзакция не выполнится. Можете прописать в коде скрипта условие на проверку этих двух статусов перед отправкой.
Код
if round(getParamEx(statusClass, statusCode, "status").param_value) == 1 then status = true else status = false end -- Торговля разрешена/не разрешена
Во всех скриптах вот такая проверка стоит, если status == false, то транзакция не уйдет и тем не менее однажды вылезла ошибка описанная здесь.
Да я так и не понял в чем подвох был, а здесь то написал с целью привлечения внимания общественности - глядишь может кто и откликнется - подскажет в чем дело и как с этим быть.
Поддержу вопрос. В Открытии статус фьючерсов и опционов - проблем нет - все работает, а в БКС например фьючи - работает, а опционы к вечеру статус = 0, хотя все торгуется.
nikolz написал: (как правило за символическую плату)
От себя добавлю - бесплатно - там же всего то надо чтобы было вот так и так, а сейчас просто на просто как то оно не так работает. Там все просто - "пару строк поправить" - делов то)))
function GetClassBySec(code) -- Функция возвращает код класса по коду инструмента
--------------------------------------------------------------------------------------------------------------------------
for class in string_gmatch("STOCK_USA,SPBXM,FQBR,TQBR,QJSIM,SPBFUT,", "(%P*_*%P*),") do
for sec in string_gmatch(getClassSecurities(class), "(%P*%.*%P*-*%P*),") do
if sec == code then return class end
end
end
--------------------------------------------------------------------------------------------------------------------------
end
function GetClassBySec(code) -- Функция возвращает код класса по коду инструмента
--------------------------------------------------------------------------------------------------------------------------
for class in string_gmatch("STOCK_USA,SPBXM,FQBR,TQBR,QJSIM,SPBFUT,", "(%P*),") do
for sec in string_gmatch(getClassSecurities(class), "(%P*_*%P*_*%P*),") do
if sec == code then return class end
end
end
--------------------------------------------------------------------------------------------------------------------------
end
Здравствуйте. Функция не возвращает код класса: "STOCK_USA" и "FQBR" ("SPBXM" - не проверял). В чем подвох?
Вероятно таблица создается function OnInit(script_path) -- Функция вызывается терминалом QUIK перед вызовом функции main() здесь end Создайте ее вот function main() -- Функция, реализующая основной поток выполнения в скрипте здесь end
А может ответы на ваши вопросы внимательнее изучать?)))
Цитата
В какой лимитной заявке? Когда выставляется стоп, ни какой лимитной заявки нет. Лимитная заявка выставляется только после того, как условия выполнились согласно указанным условиям в стоп заявке или в тейке.
Все верно. Теперь нам нужно
Цитата
Всё бы хорошо, но я не могу отловить сам результат выполнения стоп заявки, когда стоп исполнился. В моём понимании когда срабатывает стоп, создаётся новая заявка с новым номером заявки которая не равна номеру стопа. Хотелось бы увидеть схему OnStopOrder -> ... -> ... -> здесь признак того что стоп сработал.
Сработала стоп-заявка - нужно это действие отследить, так? В таблице стоп-заявок есть поля: Номер и Номер заявки. Поле Номер - это номер нашей стоп-заявки, поле Номер заявки - это номер лимитной заявки - данное поле при выставлении стоп-заявки пустое, как только наша стоп-заявка превратится в лимитную - это поле заполнится - номер лимитной заявки - все.
Демидков Юрий написал: Дальше где-то откопать номер выставленной лимитированной заявки.
Пример для таблицы заявок. linkedorder - в таблице стоп-заявок и есть номер лимитки.
Код
function CheckOrders() -- Функция проверяет таблицу заявок
local gNOf = getNumberOf("orders")-1 -- Номер последней строки в таблице заявок
for i = NumLineTO+1, gNOf, 1 do -- Перебирает строки в таблице заявок начиная от NumLineTO+1
local orders = getItem("orders",i) -- Параметры заявки
...
local num = 0 -- Номер заявки
if bit.test(orders.flags, 0) then -- Заявка активна
num = orders.order_num -- Контроль заявки
end
local stopNum = orders.linkedorder -- Номер стоп-заявки
...
end
end
Для id = 3 333 333 333 - транзакция уходит - и в таблице транзакций видим не 3 333 333 333, а присваивается № 2 147 483 647. Для id = 4 444 444 444 - ошибка - Неправильно указан идентификатор транзакции: "4444444444". По этому и возник вопрос. Ладно формат ххх ххх ххх - будет достаточно. Всем спасибо.
Из описания QLUA.chm: TRANS_ID -- Уникальный идентификационный номер заявки, значение от «1» до «2 147 483 647» Реальное максимально допустимое значение на сегодня?
Дмитрий написал: Не знаю, может что делаю не правильно, но код выдает ошибку
Код
function Round(num, n) -- Функция округляет до указанного количества знаков
local n = (n or 0)
return tonumber(string_format("%."..n.."f", num))
end
Эту функцию еще добавить надо. В принципе то можно без нее. Но тогда вот так
Код
Status = tonumber(getParamEx(CLASS_CODE, SEC_CODE , "status").param_value)
но опять результат будет = 1.0 например (8.5 квик). А функция Round - .0 уберет, это у меня бзик - по "феншую" должно быть и все))). А так эта функция в основном то нужна сейчас для объема и цены - приходит объем 3.0, цена по РТС например 100 000.0 - не порядок.
Egor Zaytsev написал: С данным вопросом нужно разбираться. Попробуйте запустить QUIK от имени администратора, нажав правой кнопкой мыши по ярлыку с программой и выбрав "запуск от имени администратора"
Картина та же. Запустил 4 скрипта. 1,2,3,4. 2й - удалил. На место 2ого встал 3й скрипт, на место 3ого - 4й - все правильно, но только "зеленые треугольники" - осталось = 4. Далее удалил все скрипты - в терминале в РАБОЧЕМ состоянии остался один скрипт, при этом в поле Загруженные скрипты - НЕТ ни одного скрипта. Попытался добавить вновь удаленный скрипт пишет - "Выбранный скрипт уже был загружен. Добавить его еще раз?" На первом добавлении скриптов - 3й скрипт с ошибкой - специально посмотреть на вывод ошибки - да выводит ошибку в поле "Ошибки выполнения скрипта" - все хорошо. После удаления из "Доступные скрипты" всех скриптов и повторном добавлении - 3ого (с ошибкой) скрипта - в поле "Ошибки выполнения скрипта" - сообщения об ошибке нет. Удалил все скрипты - закрыл терминал - открыл терминал - все ранее добавленные скрипты - оказались загруженными. Заходил от имени администратора как вы и предложили.
SPBOPT - класс опционов, месяц, неделя OPTW - класс недельного опциона у некоторых брокеров А по большому счету эта функция нужна для корректного ввода инструмента из меню. Есть инструмент - все работает - нет инструмента - класс - nil - подсветка о ошибке ввода и ничего не работает.
function GetClassBySec(sec_code) -- Функция возвращает код класса по коду инструмента
for class_code in string_gmatch("QJSIM,TQBR,SPBFUT,SPBOPT,CETS,OPTW,", "(%P*),") do -- Добавить код если надо
for sec in string_gmatch(getClassSecurities(class_code), "(%P*_*%P*_*%P*),") do
if sec == sec_code then return class_code end
end
end
end
Заявка на покупку акции после определённого отката вниз от определённой цены., Заявка на покупку акции после определённого отката вниз от определённой цены.
swerg написал: Этот колхоз имени 8 марта меня искренне поражает.
Я сам коды пишу на Lua. Прекрасно понимаю что такое процесс написания. В процессе - ошибки есть и будут - это нормально, но на выходе проверка идет тотальная - проверятся все от и до - чтобы все работало как надо. Понятное дело что все мы люди и ошибки какие то могут быть допущены. НО здесь то явно не скрытая ошибка которую тяжело выявить, здесь реальный косяк на лицо. Удалил все скрипты из таблица Загруженные скрипты - выключил терминал - включил - все скрипты на месте как будто и не удалял. Я пишу здесь не с целью критики или обвинений, а с целью обращения вашего внимания на явный недочет и скорейшее устранение этих неполадок.
Квик 8.5.2.11. Беда прямо с этой таблицей. Уважаемые разработчики пожалуйста приведите в порядок. Добавляем несколько скриптов - при удалении из "середины" - начинается "карусель". При добавлении скрипта - пишет что этот скрипт уже есть. В общем там много сюрпризов. Это касается и демо и реала.
Imersio Arrigo написал: То ли я спрашивать не умею, то ли что...
Лыжи не едут)))
Цитата
Imersio Arrigo написал: Не понимаю КОГДА это происходит?Просто в основном цикле main?
Да просто в main. При дисконекте какие там события, то? А так обрыв связи - лимитка прошла - связь восстановлена - проверили таблицу и 100% ни чего не потеряли.
Imersio Arrigo написал: Когда и как вы решаете, что пора проверить кол-во строк в таблице?
Пример уже приводил. Когда getNumberOf("trades")-1 (Номер последней строки в таблице сделок) станет больше чем NumLineTT (Запомнили последнюю строку таблицы сделок)
Иван написал: идентификатор в поле комментарий при открытии/закрытии позиций
На одном инструменте хоть сто роботов могут торговать и каждый по свой логике. Фильтр по комментарию как раз дает такую возможность - новый бот - новый уникальный комент. У меня имя робота - это комментарий к заявке - если имена ботов разные - торгуем хоть миллиард стратегий на одном инструменте.
Максим написал: у меня еще скриптов много в Квике просто...
Скриптов у меня то же предостаточно (в данный момент 10 запущено). Версия 8.3.2.4 - раз в сутки примерно квик зависает и ни как не реагирует. Перезапуск только через Диспетчер задач. Об этом ни хотел даже писать все равно на 8.5 скоро переходить. Так вот раньше такого то же не было. На более ранних версиях гораздо больше скриптов работало и все нормально было. В общем одни претензии у этих пользователей, понапишут скриптов, а потом жалуются)))
У вас Финам, у меня Открытие. Наводит на мысль что действительно дело не в серверах, а в квике? Пишу не просто так, а для того чтобы разработчики обратили внимание и сделали орг. выводы - надо что то делать.