Николай Камынин пишет: Попробуйте так: ------------------------------ local t=getSecurityInfo('',left .name) if t~=nil then local ClassCode=t .class_code if ClassCode~=nil and type(ClassCode~="table") and ClassCode~="" then Subscribe_Level_II_Quotes (ClssCode, left .name) end end
Да Николай! Так действительно помогло! Скрипт не останавливается. Большое спасибо!
Юрий пишет: getSecurityInfo('',left .name).class_code
Искать код класса по коду бумаги не очень хорошая идея, можно запросто получить неверный результат. Судя по коду бумаги, проще явно указать код класса "SPBFUT"
Хочется универсальности - сегодня торгую фьючерсы, а завтра акции - вот и проблема с явным указанием кода класса.
Нет изменений - скрипт останавливается! Сделал так:
function main() if isConnected() then for i = 1, #left do Subscribe_Level_II_Quotes (getSecurityInfo('',left[i].name).class_code, left[i].name) -- заказ стаканов через цикл end while aRun do oprosstakanov() -- опрос стаканов --остальной код end end end
Потом так: function main() while QRun do if isConnected() then --делал и так: if isConnected() == 1 then QRun = fals for i = 1, #left do Subscribe_Level_II_Quotes (getSecurityInfo('',left[i].name).class_code, left[i].name) -- заказ стаканов через цикл end end end while aRun do oprosstakanov() -- опрос стаканов --остальной код end end
Всем доброго! Подскажите в чем может быть причина остановки скрипта по ошибке: "attempt to index a nil value" (попытка индекса нулевой стоимости)? Скрипт останавливается только при запуске Квика (скрипт не выключаю - только закрываю и открываю квик)? local left = -- эмитенты в таблице left задаем в самом начале { { name = "SiU5" } } function oprosstakanov() -- функция получения данных стакана работает не прекращая for i = 1,#left do -- здесь перебираются эмитенты local b = getQuoteLevel2(getSecurityInfo('',left[i].name).class_code, left[i].name) -- ОШИБКА в этой строке if b.bid and b.bid_count+0>0 then local a = tonumber(b.bid[tonumber(b.bid_count)].price) * left[i].quantity ------ end end end
Если запускать скрипт, при запущенном Квике - все в полном порядке.
а в чем вопрос: infinity = 1/0 if a == infinity or a == -infinity then print("Неожиданный результат") end - работает. Все получилось, Не совсем понял почему у меня 1.#IND с минусом получается, но из статьи http://habrahabr.ru/post/171203/ видно, что не все однозначно. Будем проверять и с + и с -.
пожалуйста подскажите, как идентифицировать переменную с ошибкой: -1.#IND a = 0; a = b + c - в результате (понятно по какой причине) получаем -1.#IND пробую так: 1) if a == "-1.#IND" - не получается; 2) if a == -1.#IND - не получается; 3) if a == nil - не получается;
хорошо. Еще подскажите в таком случае: 1) скрипт запоминает время getInfoParam("SERVERTIME"), как я понимаю время последней сделки и т.д. из ТПП перед моими действиями 2) далее я что-то делаю 3) я обращаюсь к данным из таблицы, пусть Сделок (ведь моя сделка все равно будет не раньше чем придут данные из ТПП даже если это будет моя сделка), ссылаясь на время равное или более того, что запомнил SERVERTIME.
В этом случае все равно могут возникнуть проблемы из-за разницы времени биржи и сервера?
Если да, то может мне тогда брать из ТПП время последней сделки, ведь это уже будет время биржи?
Ну вот развели демагогию, а умный человек подсказал, что все действительно придумано до нас: getInfoParam("SERVERTIME") - время сервера, а с миллисекундами: в таблице «Таблица сделок» («trades») в datetime есть поле с миллисекундами и поле с микросекундами, т.е. getItem(«trades»,e).datetime.ms и getItem(«trades»,e).datetime.mcs соответственно. Вот и все.
Я конечно не силен в программировании, да и логика насколько позволяет, так задачи и решаю. Просто у меня идет серия сделок и через номер сделки приходится создавать кучу доп кода (а оно же может лень, а может не хватает знаний). Понятно что все проблемы можно решить разными способами и я их решаю, но не иметь возможности получить точное время, согласно которого я могу ориентироваться для меня не понять.
Сделал по совету sam063rus (синхронизация времени причем с разных серверов пробовал). На глаз видно разница 0,5 сек Квика и компа. А потом еще ИНТЕРЕСНЕЕ: на компе стоит 2 платформы Квика одного брокера и у них тоже секунды тикают в разницу пол секунды. Вот прикол! Жаль, придется решать задачи другими способами. К разработчикам: зарегистрируйте пожелание получения времени (типа os.time() ) именно платформы (конечно если это время будет совпадать со временем в таблице сделок)
Перед выставлением ряда заявок запоминаю время t = os.time(). Далее после делаю "проверку" всех сделок из табл Сделок, время которых позже t :
for e = 0,getNumberOf("trades") - 1 do if os.time(getItem("trades",e).datetime)>= t and getItem("trades",e).sec_code ==name then
Так вот: скрипт не находит некоторые сделки, т.к. время в таблице Сделок меньше, чем t , которое было сделано ранее (перед выставлением заявки). Вопрос: 1) какое отличие между t = os.time() и временем в таблице сделок. 2) постоянная ли это величина 3) как это обойти? (
а при перестановке заявки статус№3 - Заявка успешно переставлена (фраза не точная) с указанием номера заявки. Может статус зависит от вида транзакции. Вот приходится гадать, а нужна верная информация. Если все-таки зависит от вида транзакции, то меня интересуют: маркет ордера, лимитные, перестановка и снятие заявок. Разработчики пожалуйста выдайте. Ждемс.
Сегодня биржа не работает и не могу точно указать № статуса, но фраза (я по ней фильтрую, т.к. не знаю расшифровки всех номеров) "Не найдена активная заявка для перестановки" (скорее всего №4)
да на опционах тоже снимается хорошо, но есть функция перестановки! Работает она? все равно не понимаю на сегодняшние вопросы поддержка находит время отвечать, а на вчерашние нет!!!
подскажите пож-та, где ошибка? Скрипт выставляет одну лимитную заявку на ФОРТС (по опционам) - определяем ее № (OrderNum_OPT) - order.order_num далее надо переставить эту заявку на другую цену. Делаю так:
function perestavit_order_OPT() local trans_id=math.random (1,999999) local transaction = { ["ACTION"]= "MOVE_ORDERS", ["TRANS_ID"]= tostring(trans_id), ["CLASSCODE"]=tostring(CLASS_CODE), ["SECCODE"]=tostring(SEC_CODE), ["FIRM_ID"]=tostring(FIRM_ID), -- берем из табл. Сделок "Дилер" ["MODE"]="0", ["FIRST_ORDER_NUMBER"]=tostring(OrderNum_OPT), --№ ранее выставленной заявки ["FIRST_ORDER_NEW_PRICE"]="3200", -- новая цена для лимитной заявки ["FIRST_ORDER_NEW_QUANTITY"]="0" } local res=sendTransaction(transaction)
if res~="" then return nil, "send_LimitFUT():"..res else return trans_id end end
Здравствуйте! Сюда же еще несколько вопросов: 1) "FIRST_ORDER_NUMBER" мы взяли order.order_num , а "SECOND_ORDER_NUMBER" - можно подставить тот же номер и тогда при новом обращении order.order_num мы получим тот же номер. Это я правильно понимаю? 2) если 1-я лимит. заявка была выставлена на 2 лота, в OnOrder(order) программа увидела, что прошла сделка на один лот - я могу переставить на другую цену только оставшийся лот, указав "FIRST_ORDER_NEW_QUANTITY" = "2", а "SECOND_ORDER_NEW_QUANTITY" = "1" ? 3) что произойдет (что выдаст res=sendTransaction(transaction), если я, не проверяя исполнился ли второй лот, буду вызывать эту функцию (пытаться делать перестановку множество раз, меняя цену - для гарантированного получения второго лота)? в программе пытаюсь сделать так:
NotBuy_OPT = true function OnOrder(order) -- Если исполнилась заявка полностью if order.trans_id == trans_id_OPT and order.balance == 0 then -- Меняет значение флага NotBuy_OPT = false end
function perestavit_order_OPT() local transaction = { ["ACTION"]= "MOVE_ORDERS", -- изменить количество в заявках на новые ["TRANS_ID"]= tostring(trans_id_OPT), ["CLASSCODE"]=tostring(classcode), ["SECCODE"]=tostring(seccode), ["FIRM_ID"]="UNIKA", ["MODE"]="1", ["FIRST_ORDER_NUMBER"]=tostring(OrderNum_OPT_), ["FIRST_ORDER_NEW_PRICE"]=tostring(price_put), ["FIRST_ORDER_NEW_QUANTITY"]=tostring(vol_kratno), ["SECOND_ORDER_NUMBER"]= ? ["SECOND_ORDER_NEW_PRICE"]=tostring(price_put+10), ["SECOND_ORDER_NEW_QUANTITY"]="1" } local res=sendTransaction(transaction) sleep (50) if NotBuy_OPT then price_put = price_put + 10 local res=sendTransaction(transaction) end; sleep (50); if NotBuy_OPT then price_put = price_put + 10 local res=sendTransaction(transaction) end; sleep (50); if NotBuy_OPT then price_put = price_put + 10 local res=sendTransaction(transaction) end; sleep (50); if NotBuy_OPT then price_put = price_put + 10 local res=sendTransaction(transaction) end; sleep (50); local res=sendTransaction(transaction) if res~="" then return nil, "send_LimitFUT():"..res else return trans_id end end 4) Хотя в программе и идет проверка на полное исполнение заявки (and order.balance == 0), но суть в быстром получении второго лота после первого и не использование маркет ордера 5) если думаю неправильно, пожалуйста подскажите (может пример) 6) возможно ли не использовать в примере sleep (50)?
Такое ощущение, что я задал вопрос сверх какой-то сложности! Если бы я не начал изучать Lua 2 недели назад я бы его не задавал. По-моему здесь на форуме только те кто пишут программы. Простой вопрос - почему не получить простой пример? "Вы думаете не правильно, надо вот так ..."
С правилами ввода заявок на СРОЧНОМ рынке Вы можете ознакомиться в правилах торгов на СРОЧНОМ рынке
Я не о правилах ввода заявки вручную, я спрашиваю как это реализовать QLua. Неужели нельзя сделать примеры всех видов заявок - ВСЕ ни одного вопроса не найдется.
sam063rus неужели нельзя не выделываться, а хотя бы один раз ответить на вопрос (у вас же все такие коменты)? ну знаешь - отлично, поделись с другими. Зачем писать вещи которые знают только "знающие". например что такое RFC и LUA.org (на английском языке)?
EXECUTION_CONDITION Условие исполнения заявки, необязательный параметр. Возможные значения: «PUT_IN_QUEUE» – поставить в очередь (по умолчанию), «FILL_OR_KILL» – немедленно или отклонить, «KILL_BALANCE» – снять остаток
Как не ведомо, я же не просто так убрал с вопроса вообще слово "QL"? Это Ваша документация. а т.к. она скудненькая (в том числе по работе с заявками), я понимаю надо искать похожее - вот нашел в документации QPile (я подумал это в ряде случаев идентичные вещи). Выборка из Вашей документации:
EXECUTION_CONDITION Условие исполнения заявки, необязательный параметр. Возможные значения: [img]file:///G:/%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F/%D0%A0%D0%BE%D0%B1%D0%BE%D1%82%D1%8B/Qpile/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F/PicExportError[/img] «PUT_IN_QUEUE» – поставить в очередь (по умолчанию), [img]file:///G:/%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F/%D0%A0%D0%BE%D0%B1%D0%BE%D1%82%D1%8B/Qpile/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F/PicExportError[/img] «FILL_OR_KILL» – немедленно или отклонить, [img]file:///G:/%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D1%8F/%D0%A0%D0%BE%D0%B1%D0%BE%D1%82%D1%8B/Qpile/%D0%98%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%86%D0%B8%D1%8F/PicExportError[/img] «KILL_BALANCE» – снять остаток Поэтому повторно и задал вопросы.
Пож-та скажите где можно ознакомится с привилами ввода заявок на СРОЧНОМ рынке (интересуют фьючерсы и опционы). Заявки использую лимитные и маркетом.
просто надо по другому задать вопрос: В признаке execution_condition - KILL_BALANCE (Снять остаток) - как работает при указании цены лимитной заявки и количества? 1) если не дали сразу по лимитной цене, значит сделка отменяется; 2) если дали половину объема , то остальная часть отменяется; 3) надо ли параметр KILL_BALANCE указывать в " " 4) признак expire_date - TODAY (до окончания текущей торговой сессии) надо ли указывать в " "
Здравствуйте. Функция библиотеки QL sendLimitFO. в признаке execution_condition - KILL_BALANCE (Снять остаток) - как работает при указании цены лимитной заявки и количества? 1) если не дали сразу по лимитной цене, значит сделка отменяется; 2) если дали половину объема , то остальная часть отменяется; 3) надо ли параметр KILL_BALANCE указывать в " " 4) признак expire_date - TODAY (до окончания текущей торговой сессии) надо ли указывать в " "