Зависает Quik при обработке событий в таблице, если прямо в функции сделать цикл на проверку изменения заявки.
Порядок действий. Запускаем скрипт - открывается окно.
Двойной щелчок левой мыши по 1-й строчке таблицы - выставляется заявка
Еще двойной левой мыши - должна сняться заявка, но квик виснет из-за цикла проверки заявки в функции KillOrder()
Порядок действий. Запускаем скрипт - открывается окно.
Двойной щелчок левой мыши по 1-й строчке таблицы - выставляется заявка
Еще двойной левой мыши - должна сняться заявка, но квик виснет из-за цикла проверки заявки в функции KillOrder()
Код |
---|
Account = "7618xxx" -- Код счета CLASS_CODE = "SPBFUT" -- Код класса SEC_CODE = "VBZ9" -- Код инструмента trans_id = os.time() -- Текущие дата и время в секундах хорошо подходят для уникальных номеров транзакций IsRun = true firstRun = 0 -- флаг первого запуска flag = 0 function main() while IsRun do if firstRun==0 then priceMin = getParamEx(CLASS_CODE, SEC_CODE, "PRICEMIN").param_value+0 -- Цена выставления заявки CreateTable() firstRun=1 end SetTableNotificationCallback(t_id, Touch) --ждем двойного щелчка мыши, чтобы выставить заявку или удалить end end function KillOrderS() local N = getNumberOf("orders")-1 for i = N, 0 , -1 do order = getItem("orders", i) if order.account==Account and order.balance>0 and order.sec_code==SEC_CODE and order.flags==25 then trans_id = os.time() local tkill = { ["CLASSCODE"]=CLASS_CODE, ["SECCODE"]=SEC_CODE, ["ACTION"]="KILL_ORDER", ["ACCOUNT"]=Account, ["TRANS_ID"]=tostring(trans_id), ["ORDER_KEY"]=tostring(order.order_num) } local res=sendTransaction(tkill) if res ~= '' then message('KillOrderS(): Ошибка отправки транзакции: '..res) else message('KillOrderS(): Транзакция отправлена') end sleep(5000) while getItem("orders", i).flags==25 do message("flags = "..getItem("orders", i).flags) sleep(1000) end end end end function Touch(t_id, msg, par1, par2) if msg==QTABLE_LBUTTONDBLCLK and par1==1 then local On Off = "Off" if flag==0 then flag = 1 On Off = "On" SetColor(t_id, 1, 1, RGB(0,255,0), RGB(0,0,0), RGB(0,200,0), RGB(0,0,0)); TransOpenPos() else flag = 0 SetColor(t_id, 1, 1, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR, QTABLE_DEFAULT_COLOR); KillOrderS() end SetCell(t_id, par1, par2, OnOff) end end function CreateTable() t_id = AllocTable(); -- Получает доступный id для создания AddColumn(t_id, 1, "ХЗ", true, QTABLE_CACHED_STRING_TYPE, 7); t = CreateWindow(t_id); -- Создаем SetWindowCaption(t_id, "ХЗ"); -- Даем заголовок SetWindowPos(t_id, 0, 0, 100, 100) -- Положение окна InsertRow(t_id, -1); -- добавляем countLineFileSave строк SetCell(t_id, 1, 1, tostring(flag)) end function TransOpenPos() trans_id = os.time() local Transaction={ ['TRANS_ID'] = tostring(trans_id), -- Номер транзакции ['ACCOUNT'] = Account, -- Код счета ['CLASSCODE'] = CLASS_CODE, -- Код класса ['SECCODE'] = SEC_CODE, -- Код инструмента ['ACTION'] = 'NEW_ORDER', -- Тип транзакции ('NEW_ORDER' - новая заявка) ['OPERATION'] = 'B', -- Операция ('B' - buy, или 'S' - sell) ['TYPE'] = 'L', -- Тип ('L' - лимитированная, 'M' - рыночная) ['QUANTITY'] = '1', -- Количество ['PRICE'] = tostring(priceMin) -- Цена } -- Отправляет транзакцию local Res = sendTransaction(Transaction) if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена') end end |