Сергей С. (Все сообщения пользователя)

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

Страницы: 1
Момент реального зачисления USD
 
Немного ввел в заблуждение.
CalcBuySell всегда возвращает 0 (купить нельзя).
getBuySellInfo всегда возвращает 1 (купить можно 1 штуку).
При попытке купить - ошибка "Скорректированное значение НПР1 меньше 0. Непокрытая позиция по неликвидному инструменту."
Момент реального зачисления USD
 
Добрый день.

Столкнулся с проблемой. Чтобы купить актив за USD, надо купить эти самые USD. Раньше момент зачисления USD в портфель ловил функцией:
getMoneyEx(Firm_ID, Client_code, "EQTV", "USD", 1).currentbal.
Эта функция работает и сейчас, и показывает, что USD зачислены. Но при попытке на следующем этапе купить актив за USD выпадает сообщение об ошибке: "Скорректированное значение НПР1 - меньше 0". Это говорит о том, что деньги еще не зачислены. И действительно, если зайти вручную в режим покупки, то через 1-2-3 сек появляется доступное количество для покупки - 0 становится 1 прямо на глазах.
При этом, если не заходить в ручном режиме в диалог покупки актива, а пользоваться функцией:
_qty, _comiss = CalcBuySell(_market_buy, _ticker_buy, Client_code, Account, 0, true, true)
то эта функция будет возвращать _qty = 0 ВЕЧНО !!!!!!
Кстати, функция getBuySellInfo(Firm_ID, Client_code, _market_buy, ticker_buy, 0).can_buy тоже возвращает 0 постоянно и в течение бесконечного времени.
Как определить момент реального зачисления USD в портфель?
Задержка при зачислении бумаг
 
Можно только этот скрипт запустить, а покупку бумаг делать руками. Результат такой же.
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Цитата
Сергей С. написал:
 
Цитата
nikolz  написал:
 
Цитата
 Сергей С.   написал:
  По вашей ссылки какой-то форум и там много чего написано.
   

Поместите сюда тот скрипт, результаты которого выложили. .
 -- Флаг поддержания работы скриптаIsRun = true;
Это пустой скрипт.
в нем ничего не выставляется.
Поясните, что вы им тестируете и каким образом.
Запускаю этот скрипт и свой скрипт. Смотрю сообщения с зафиксированным временем сообщений от колбеков.
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Цитата
Сергей С. написал:
По вашей ссылки какой-то форум и там много чего написано.
   

Поместите сюда тот скрипт, результаты которого выложили. .
-- Флаг поддержания работы скриптаIsRun = true;

function main()
  -- Цикл будет выполнятся, пока IsRun == true
  while IsRun do
     sleep(1000);
  end;  
end;

function OnAccountBalance()
  message("OnAccountBalance - изменение позиции по счету "..tostring(os.clock()));
end;
function OnAccountPosition()
  message("OnAccountPosition - изменение позиции по счету "..tostring(os.clock()));
end;
function OnAllTrade()
  --message("OnAllTrade - новая обезличенная сделка "..tostring(os.clock()));
end;
function OnCleanUp()
  message("OnCleanUp - смена торговой сессии и при выгрузке файла qlua.dll "..tostring(os.clock()));
end;
function OnClose()
  message("OnClose - закрытие терминала QUIK "..tostring(os.clock()));
end;
function OnConnected()
  message("OnConnected - установление связи с сервером QUIK "..tostring(os.clock()));
end;
function OnDepoLimit()
  message("OnDepoLimit - изменение бумажного лимита "..tostring(os.clock()));
end;
function OnDepoLimitDelete()
  message("OnDepoLimitDelete - удаление бумажного лимита "..tostring(os.clock()));
end;
function OnDisconnected()
  message("OnDisconnected - отключение от сервера QUIK "..tostring(os.clock()));
end;
function OnFirm()
  message("OnFirm - описание новой фирмы "..tostring(os.clock()));
end;
function OnFuturesClientHolding()
  message("OnFuturesClientHolding - изменение позиции по срочному рынку "..tostring(os.clock()));
end;
function OnFuturesLimitChange()
  message("OnFuturesLimitChange - изменение ограничений по срочному рынку "..tostring(os.clock()));
end;
function OnFuturesLimitDelete()
  message("OnFuturesLimitDelete - удаление лимита по срочному рынку "..tostring(os.clock()));
end;
function OnInit()
  message("OnInit - инициализация функции main "..tostring(os.clock()));
end;
function OnMoneyLimit()
  message("OnMoneyLimit - изменение денежного лимита "..tostring(os.clock()));
end;
function OnMoneyLimitDelete()
  message("OnMoneyLimitDelete - удаление денежного лимита "..tostring(os.clock()));
end;
function OnNegDeal()
  message("OnNegDeal - новая заявка на внебиржевую сделку "..tostring(os.clock()));
end;
function OnNegTrade()
  message("OnNegTrade - новая сделка для исполнения "..tostring(os.clock()));
end;
function OnOrder()
  message("OnOrder - новая заявка или изменение параметров существующей заявки "..tostring(os.clock()));
end;
function OnParam()
  --message("OnParam - изменение текущих параметров "..tostring(os.clock()));
end;
function OnQuote()
  --message("OnQuote - изменение стакана котировок "..tostring(os.clock()));
end;
function OnStop()
  message("OnStop - остановка скрипта из диалога управления "..tostring(os.clock()));
  -- Останавливает цикл в функции main
  IsRun = false;
end;
function OnStopOrder()
  message("OnStopOrder - новая стоп-заявка или изменение параметров существующей стоп-заявки "..tostring(os.clock()));
end;
function OnTrade()
  message("OnTrade - новая сделка "..tostring(os.clock()));
end;
function OnTransReply()
  message("OnTransReply - ответ на транзакцию "..tostring(os.clock()));
end;
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Серегей, Я вам выложил скрипт и результат.  У меня никаких запаздываний нет.------------------------Как я понял теперь у Вас другая проблема.Раньше вы писали о задержке  между таблицей и функцией getDepoEx  ------------Теперь Вы лукавите, это у вас другая задержка -------------------------------Если хотите, то выложите свой скрипт я его проверю.
У меня тоже никаких запаздываний не будет, если в этот торговый день я уже делал операции с этой бумагой. Проблема только в самой первой покупке. Не понимаю, в чем тут лукавство с моей стороны. С помощью getDepoEx я ловил момент зачисления бумаг в портфель. Вы предложили другой способ - по колбеку. Я его проверил - проблема осталась. Мне кажется причина кроется не в скрипте или методе проверки факта зачисления, а в самом клиентском квике, может быть какая-то настройка, галочка и т.п.
Запустите тестовый скрипт из ссылки выше и проверьте. Только обращаю еще раз ваше внимание, бумага для теста должна быть выбрана такая, торговли которой в этот день еще не было.
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
сделал тест.
вот результат:
Код
  Tue Aug  29   11 : 21 : 47   2023 , getDepo Ex currentbal =  0.0 
Tue Aug  29   11 : 21 : 47   2023 ,выставляем заявку
Tue Aug  29   11 : 21 : 48   2023 , getDepo Ex currentbal =  10.0 
Tue Aug  29   11 : 21 : 48   2023 ,OnDepolimit currentbal =  10.0 
  
1 строка - до выставления заявки
2 строка выставили заявку по рынку и купили
3 строка  getDepoEx  ответ в колбеке
4 строка  - колбек  OnDepoLimit
--------------------
Резюме:
Задержка менее 1 секунды. .    
Попробовал с колбеком. Запустил Скрипт отслеживания работы функций обратного вызова:
https://quikluacsharp.ru/qlua-osnovy/funktsii-obratnogo-vyzova-vstroennye-v-qlua/

И вот результат:
1 29.08.2023 13:16:35 OnInit - инициализация функции main 15702.911
2 29.08.2023 13:19:40 (162) Заявка на покупку N 38404828165 зарегистрирована (1 удовлетворено).
3 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.112
...
8 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.145
9 29.08.2023 13:19:40 OnOrder - новая заявка или изменение параметров существующей заявки 15888.149
10 29.08.2023 13:19:40 OnOrder - новая заявка или изменение параметров существующей заявки 15888.151
11 29.08.2023 13:19:40 OnTrade - новая сделка 15888.152
12 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.155
...
17 29.08.2023 13:19:40 OnMoneyLimit - изменение денежного лимита 15888.185
18 29.08.2023 13:19:45 OnDepoLimit - изменение бумажного лимита 15893.151
...
23 29.08.2023 13:19:45 OnDepoLimit - изменение бумажного лимита 15893.168
24 29.08.2023 13:20:08 (163) Заявка на продажу N 38404864243 зарегистрирована (1 удовлетворено).
25 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15915.868
...
36 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15915.934
37 29.08.2023 13:20:08 OnOrder - новая заявка или изменение параметров существующей заявки 15915.958
38 29.08.2023 13:20:08 OnOrder - новая заявка или изменение параметров существующей заявки 15915.961
39 29.08.2023 13:20:08 OnTrade - новая сделка 15915.962
40 29.08.2023 13:20:08 OnMoneyLimit - изменение денежного лимита 15915.964
...
45 29.08.2023 13:20:08 OnMoneyLimit - изменение денежного лимита 15915.994
46 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15915.995
...
57 29.08.2023 13:20:08 OnDepoLimit - изменение бумажного лимита 15916.039

Строки 17 и 18 - это покупка бумаги. Как раз та самая 5-секундная пауза, которую я и наблюдаю. Обратите внимание, строки 45, 46  - это  продажа бумаги. Паузы уже нет. Это реальный счет, не демо. Пример для покупки SBER.
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Вы тоже не видите ошибку, пока ее не найдете.Если хотите помощь, выложите пример с результатом.  
round_trip = os.clock()
TransBuy(_market_buy, _ticker_buy)
while getDepoEx(Firm_ID, Client_code, _ticker_buy, Account, 2) == nil
do
   sleep(100)
end
while tonumber(getDepoEx(Firm_ID, Client_code, _ticker_buy, Account, 2).currentbal) < 1
do
   sleep(100)
end
round_trip = os.clock() - round_trip
str = string.format("%.3f", round_trip)
round_trip_file:write(os.date().."\t".._ticker_buy.."(".._market_buy..")\tBuy\t"..str.." сек\n")

function TransBuy(class_code, sec_code)
local _res
trans_id = os.time()
Transaction_buy = {
["ACCOUNT"] = Account,
["CLIENT_CODE"] = Client_code,
["TYPE"] = "M",
["TRANS_ID"] = tostring(trans_id),
["CLASSCODE"] = class_code,
["SECCODE"] = sec_code,
["ACTION"] = "NEW_ORDER",
["OPERATION"] = "B",
["PRICE"] = "0",
["QUANTITY"] = "1"
}

_res = sendTransaction(Transaction_buy)
if _res ~= "" then
    message("Ошибка транзакции покупки:".._res)
end
end
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Что-то у Вас не так, возможно в Вашем скрипте Функция  getDepoEx лишь берет данные из архива терминала , откуда Вы и видите в таблице их.
Я бы согласился с тем, что проблемы в моем скрипте, если бы не было разницы между первой и последующими сделками. Ведь скрипт не видит разницу между ними, для него все сделки одинаковы.
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Как Вы определяете, "quik на моей стороне говорит, что бумага зачислена, с опозданием в 5 сек"В настройках есть параметр   установки времени пересчета клиентского портфеля.  Уменьшите это время. или поставьте флаг пересчитывать при изменении позиции, если смотрите в портфеле.
Определяю по разнице времени между появлением сделки в Таблице сделок и getDepoEx(<Firm_ID>, <Client_code>, <ticker>, <Account>, 2).currentbal) > 0.
Эта разница больше 5 сек.
В настройках Квика стоят обе галочки - пересчитывать при изменении позиции и пересчитывать раз в 10 сек.
Задержка при зачислении бумаг
 
Цитата
nikolz написал:
Цитата
Сергей С. написал:
А может кто-то пробовал, что быстрее будет работать для получения информации о зачислении бумаг в портфель: getDepoEx().currentbal,  или цикл по getNumberOf("depo_limits") с перебором getItem("depo_limits", i).currentbal ?
Работать будет одинаково, так как обращение к архиву. Быстрее будет работать колбек.
Но разница будет не в секундах, а в ms.
-------------
Цикл при этом лишний, так как эти таблицы не увеличиваются в размере.
---------------
Если у Вас изменение портфеля всегда так долго, то что-то не так в настройках или в канале связи.
Ищите, где не так.
Нет, зачисление не всегда так долго. А только самая первая сделка по бумаге. Потом все изменения портфеля по этой бумаге проходят быстро - 100-200 мс.
Заявки рыночные. На сервере брокера все происходит быстро, т.к. в Таблице заявок и в Таблице сделок время одинаковое. Но по факту, quik на моей стороне говорит, что бумага зачислена, с опозданием в 5 сек. Только для первого раза.
По всей видимости, задержка связана с проверкой getDepoEx(<Firm_ID>, <Client_code>, <ticker>, <Account>, 2) ~= nil. Пять (!!!) секунд создается структура в клиентском quik.
Вот можно ли это это как-то ускорить?
Задержка при зачислении бумаг
 
А может кто-то пробовал, что быстрее будет работать для получения информации о зачислении бумаг в портфель: getDepoEx().currentbal,  или цикл по getNumberOf("depo_limits") с перебором getItem("depo_limits", i).currentbal ?
Задержка при зачислении бумаг
 
Цитата
Владимир написал:
Сергей С., Дались Вам эти несчастные 5 секунд. У меня тикеры держатся в портфеле месяцами и годами, а тут секунды. ЗАЧЕМ с этим что-то делать?
Была идея немного поарбитражить в квике... но, видимо, для этой цели квик не подходит.
Задержка при зачислении бумаг
 
Цитата
swerg написал:
А без Lua скрипта, если руками выставить заявку - изменение в таблице лимитов по бумагам происходит тоже только через 5 секунд? Или эта проблема только в скрипте?
Да, руками тоже задержка при первой покупке бумаги.
Задержка при зачислении бумаг
 
Цитата
Владимир написал:
Сергей С., Ну хотя бы потому, что под новый тикер, видимо, заводится какая-то структура, а под уже имеющийся она уже заведена. Может, проверить надо, можно ли Вам вообще этим тикером торговать. В любом случае, это РАЗНЫЕ ситуации. Лично у меня добавлене тикера в портфель или удаление из него довольно редкая операция, но алгоритмы работы заметно отличаются от обычных сделок, когда тикер был и остаётся в портфеле.
Да, скорее всего задержка связана именно с создание новой структуры в клиенте QUIK. Попробовал этот же самый скрипт у другого брокера - результата такой же - задержка 5 сек при покупке актива в первый раз.
Тогда, наверное, это вопрос к разработчикам - можно ли с этим что-то сделать?
Задержка при зачислении бумаг
 
Цитата
Nikolay написал:
Это Вы про реальный торговый счет спрашиваете? На демо счете ARQA это такая особенность. На реальных счетах разных брокеров особой задержки не наблюдал. Впрочем, от брокера зависит, конечно.
Да, это реальный торговый счет. Сначала этот вопрос я адресовал брокеру. На что он сказал, что это проблемы на стороне клиента Квик. Брокер ФИНАМ. У других брокеров есть такая особенность первой сделки?
Задержка при зачислении бумаг
 
Цитата
Владимир написал:
Сергей С., Квику по барабану - это разве что брокер может что-то там запретить. Да и вообще: лично я покупаю бумаги для того, чтобы они приносили прибыль, а не для того, чтобы её через секунду продать. Многие бумаги могут лежать в портфеле днями, неделями, месяцами - уж как-нить успеют их зачислить.
Спасибо за ваше мнение, но мне непонятно, почему в Quik первая транзакция всегда с задержкой зачисления, а все последующие по этой бумаге - нет. И можно ли с этим что-то сделать? Или это принципиальная "фича" Quik?
Задержка при зачислении бумаг
 
Цитата
Владимир написал:
Сергей С., Ведите САМИ свой портфель и кошелёк и забудьте про getDepoEx
Все бы хорошо, но пока Quik не поймет, что бумага зачислена, ее нельзя продать.
Задержка при зачислении бумаг
 
Проблема такая: при первой покупке бумаг происходит задержка между отправкой транзакции на покупку и фактическим зачислением в портфель. Эта задержка составляет примерно 5 секунд. При последующих покупках этой же бумаги такой большой задержки нет.
Но стоит переключиться на покупку другой бумаги - все повторяется: при первой покупке снова задержка >5 сек, при последующих покупках задержка стандартная.
Как измерял задержку:
Старт: os.clock() перед sendTransaction()
Окончание: изменение os.clock() после tonumber(getDepoEx(<Firm_ID>, <Client_code>, <ticker_buy>, <Account>, 2).currentbal) > 1
Страницы: 1
Наверх