Nikolay Pavlov (Все сообщения пользователя)

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

Страницы: Пред. 1 2 3
Очередность срабатывания OnTransReply, OnOrder, OnTrade
 
Добрый день.
Цитата
Andrei2016 написал:
Nikolay, вы не совсем правильно поняли мой вопрос к разработчикам в сообщении # 11.
Я вначале рассуждал именно так, как вы и описали, однако, затем Егор Зайцев из группы поддержки ARQA в своем ответе на мои вопросы указывает:
Цитата: По второму есть уточнения. Если у пользователя два разных UID, то он получит ответ только на одном UID.
Скорее всего Егор Зайцев имел ввиду, что если у пользователя два UID с одинаковыми правами по классам, то при отправке транзакции на выставление заявки ответ (т.е. TransReply) получит только пользователь с тем UID кто подавал данную транзакцию, а пользователь со вторым UID получит только заявку. Таким образом, как я уже и писал выше, заявку в "чистом виде", т.е. c uid=0 и trans_id=0 получат ОБА пользователя, это я проверил сам лично.
Цитата
Andrei2016 написал:
Поэтому на повестке остается лишь вопрос 9 в сообщении # 13.
Я уже выше описан, что шлюзы учитывают порядок полученных транзакций на снятие заявок только в момент отправки на Биржу запроса на снятие заявки, но если сама Биржа решит ответить сначала на 2 запрос, а после на 1, шлюз НЕ БУДЕТ ждать пока биржа пришлет ответ на запрос снятия заявки №1, он сразу отправит сообщение о снятии заявки №2 на сервер Quik и соответственно в терминале Вы увидите, что заявка №2 снялась раньше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Очередность срабатывания OnTransReply, OnOrder, OnTrade
 
Добрый день.
По вопросу из #11 поста. Если на у пользователя с uid=102 и у пользователя с uid=107, допустим по классу TQBR, брокер настроил в правах одинаковую Фирму и Код клиента, то независимо от того пользователь с uid=102 или с uid=107 будет подавать заявку, они оба получат ее в "чистом виде", т.е. сначала с полем UID на заявке равным 0, а после с UID пользователя, которым была выставлена заявка. Сервер Quik при рассылке заявок/сделок смотрит не на UID пользователя, а на фирму и код клиента, которые прислал шлюз на заявке/сделке и рассылает ее всем у кого есть права на данную фирму и код клиента. При этом в терминале на заявке Вы увидите UID именно того пользователя, который выставил заявку, т.е. если выставить заявку от пользователя с uid=102, то пользователь с uid=107 получит заявку с полем UID=102.

По вопросу из #13 поста. Как уже говорилось ранее, сервер Quik пришлет сообщения о снятии заявок в том порядке, в котором ему пришлет эти сообщения шлюз Quik, т.е. опять же если система Биржи пожелает первым прислать сообщение о снятии заявки с trans_id = 107, а не trans_id = 102 (хотя 102 заявка снималась по времени раньше) шлюз ее и отправит первой на сервер Quik и соответственно Вы увидите, что заявка с trans_id = 107 снялась раньше чем заявка с trans_id = 102.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Очередность срабатывания OnTransReply, OnOrder, OnTrade
 
Добрый день.
Попробую ответить на Ваш вопрос. Ниже на картинке представлена простейшая цепочка получения рыночных данных. Сервер Quik рассылает полученные сообщения на терминалы Quik (связь "3") в том порядке, в котором они приходят со шлюза Quik (связь "2"), за одни исключением, если на сервер Quik в одно и то же время шлюз пришлет цепочку вида "Order->Trade->Order", то сервер МОЖЕТ развернуть ее в цепочку "Order->Order->Trade". В связи с тем, что различные биржи предоставляют интерфейс подключения к своим системам по разным протоколам и разным схемам (связь "1"), в некоторых заявки и сделки доставляются разными не синхронизированными потоками, а так же не нужно забывать об уже отмеченном выше факте потере пакетов. Таким образом возможны ситуации, когда шлюзы по мере получения сообщений с биржи отправляет на сервер Quik следующие цепочки "Order->TransReply", "Trade1->Trade2->Order" и т.п. Никто не будет эти сообщения выстраивать в "правильные" цепочки, такой асинхронный поток данных должен уметь обрабатывать алгоритм Вашего робота на QLua. Мы так же сталкиваемся с данной задачей при разработке модулей, которые получают поток данных с сервера Quik и так же реализовываем алгоритмы обработки асинхронного потока сообщений.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
принудительно задать путь socket
 
Добрый день.
Попробуйте следующее - положите все необходимое в C:\Program Files (x86)\Lua\5.1\ со следующей структурой каталогов:
C:\Program Files (x86)\Lua\5.1\lualib\compat-5.1.lua
C:\Program Files (x86)\Lua\5.1\lualib\ltn12.lua
C:\Program Files (x86)\Lua\5.1\lualib\socket.lua
C:\Program Files (x86)\Lua\5.1\lib\socket\core.dll
C:\Program Files (x86)\Lua\5.1\lualib\socket/http.lua
C:\Program Files (x86)\Lua\5.1\lualib\socket/tp.lua
C:\Program Files (x86)\Lua\5.1\lualib\socket/ftp.lua
C:\Program Files (x86)\Lua\5.1\lualib\socket/smtp.lua
C:\Program Files (x86)\Lua\5.1\lualib\socket/url.lua
C:\Program Files (x86)\Lua\5.1\lualib\mime.lua
C:\Program Files (x86)\Lua\5.1\lib\mime\core.dll

а в самом скрипте, где используется socket вначале пропишите:
Код
package.cpath = "C:\\Program Files (x86)\\Lua\5.1\\lib\\?.dll;" .. package.cpath
package.path = "C:\\Program Files (x86)\\Lua\5.1\\lualib\\?.lua;" .. package.path
после уже вызывайте необходимый Вам компонент и работайте с ним:
Код
sckt = require("socket")
....
smtp = require("socket.smtp")
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
принудительно задать путь socket
 
Добрый день.
Данную тему вроде уже разбирали https://forum.quik.ru/messages/forum10/message20352/topic2286/#message20352
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
При разрыве связи выбивает скрипт
 
Добрый день.
Без примера кода разобраться невозможно. Но предположу, что после разрыва связи скрипт продолжает пытаться выполнять какие-либо торговые операции и обращается к каким-либо переменным, которые после разрыва связи стали иметь значение nil. Соответственно в своем коде Вы должны анализировать события:
   OnConnected - установление связи с сервером QUIK
   OnDisconnected - отключение от сервера QUIK.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Как установить пакет socket?
 
Добрый день.
Данную тему вроде уже разбирали https://forum.quik.ru/messages/forum10/message20352/topic2286/#message20352
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Заявки не переносятся на следующий день, Проблема с переносом заявок на рынке FORTS, выставленных с использованием LUA. Не работают флаги ["Дата экспирации"] и ["Expiration date"] в SendTransaction
 
Цитата
Иван Ру написал:
Спасибо, решить проблему удалось за исключением одного нюанса.
Прежде я использовал поле ["CLIENT_CODE"] куда вписывал уникальный идентификатор, по которому находил все заявки выставленные конкретным роботом.
В версии на русском это поле использовать нельзя -- интерпретатор его не понимает и ругается. В три-файле аналога я тоже не вижу. Есть ли все-таки у него какая-либо русскоязычная альтернатива?
Добрый день.
Просто создайте необходимую транзакцию через Карман транзакций и сохраните ее в *.tri файл, как это описано в документации и Вы увидите, что код клиента для транзакций по фьючерсам FORTS заполняется в поле 'Комментарий' в универсальном формате:
TRANS_ID=1;CLASSCODE=SPBFUT;ACTION=Ввод заявки;Торговый счет=XXXXXXX;К/П=Покупка;Тип=Лимитированная;Класс=SPBFUT;Инструмент=AUM7;Цена=12.0000;Количество=22;Условие исполнения=Поставить в очередь;Комментарий=XXXXXX/test;Переносить заявку=Нет;Дата экспирации=20170503;
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
После обновления квика в очередной раз перестал работать индикатор - что опять поменяли?
 
Цитата
Русский написал:
А как происходит в программах тех.анализа? Там в коде не надо проверять пустая ли свечка
Русский, к сожалению по данному вопросу я подсказать ничего не могу.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
После обновления квика в очередной раз перестал работать индикатор - что опять поменяли?
 
Русский, до этих доработок функции C, H, L, O возвращали нули для пустых свечек, и соответственно участвовали в расчетах индикаторов, например, тот же индикатор Moving Average считался некорректно, т.к. учитывал эти пустые свечки при расчете среднего значения, если явно их не отфильтровывать по нулевом объему.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
После обновления квика в очередной раз перестал работать индикатор - что опять поменяли?
 
Цитата
Русский написал:
Т.е., если я не совмещаю графики разных инструментов, то для меня проблема пустых свечек не актуальна?
Добрый день.
Пустая свечка может появиться и не только при совмещении графиков по разным инструментам, но и на графике по одному инструменту, при условии, что в настройках диаграммы включена галочка 'Показывать пустые интервалы'. Так же пустые интервалы появятся, если на график поместить встроенный индикатор, например, 'Alligator' который рассчитывается 'в будущее', добавляя в конец графика интервалы, при этом на самом графике Цены этих свечек не будет, таки образом для Lua индикатора это будут пустые свечки.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
tri-формат? как правильно называть поля?, Какой вариант написания полей является более правильным
 
Добрый день.
Для понимания всех нюансов двух вариантов подачи транзакций из QLua, предлагаю Вам почитать раздел "4. Отправка транзакций из Lua скрипта" (документ 'Использование Lua в Рабочем месте  QUIK.pdf'. Файл можно найти, например, в архиве quik_7.4.0_upd.zip  в директории Doc\Lua).
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Заявки не переносятся на следующий день, Проблема с переносом заявок на рынке FORTS, выставленных с использованием LUA. Не работают флаги ["Дата экспирации"] и ["Expiration date"] в SendTransaction
 
Добрый день.
Принцип формирования транзакций из QLua в так называемом универсальном формате с использованием "Кармана транзакций" подробно описан в официальной документации (документ 'Использование Lua в Рабочем месте  QUIK.pdf'. Файл можно найти, например, в архиве quik_7.4.0_upd.zip  в директории Doc\Lua.), раздел "4. Отправка транзакций из Lua скрипта"
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
OnStop
 
Добрый день.
На схеме все верно указано.
Пример иллюстрирующий данное поведение:
Код
function OnStop()
  message(string.format("OnStop %s (%s)", osTime(), tostring(os.clock())))
  return 5000
end

function osTime()
  local _date = os.date("*t")
  return string.format("%02d:%02d:%02d",_date.hour, _date.min, _date.sec)
end

function main() 
  while true do
    message(string.format("main... %s (%s)", osTime(), tostring(os.clock())))
    sleep(1000)
  end
end
запустив скрипт, Вы увидите, что после вызова OnStop() поток main продолжает работать:

main... 11:46:03 (92122.959)
main... 11:46:04 (92123.959)
OnStop 11:46:05 (92124.872)
main... 11:46:05 (92124.96)
main... 11:46:06 (92125.96)
main... 11:46:07 (92126.96)
main... 11:46:08 (92127.961)
main... 11:46:09 (92128.961)
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
простой код не работает
 
Цитата
Nikolay Pavlov написал:
OnQu ote = function
OnQu ote = function... естественно без пробела, парсер форума сам зачем-то пробел добавляет.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
простой код не работает
 
Цитата
Космонавт написал:
Nikolay Pavlov,срабатывания будут происходить часто, а мне нужно обращаться к стакану существенно реже, чем приходят обновления.
Добрый день.
Язык Lua - интерпретируемый язык, Вы можете в динамике определять содержимое функции OnQuote(), и "обнулять" ее когда Вам необходимо, так можно задействовать функцию OnQuote() только на время выяснения получен ли первоначальный слепок стакана или нет. Вот пример, который Вы можете доработать под себя и свою задачу:
Код
function OnInit(script)
  is_run = true
  quotes_is_received = false
end

function OnStop()
  is_run = false
  return 2000
end

OnQu ote = function()end

function main()
  quotes = getQuoteLevel2('TQBR', 'LKOH')
  message(string.format("bid_count %s offer_count %s", quotes.bid_count, quotes.offer_count))
  My_Subscribe_Level_II_Quotes('TQBR', 'LKOH')
  
  while is_run do
    message('quotes_is_received ' .. tostring(quotes_is_received))
    quotes = getQuoteLevel2('TQBR', 'LKOH')
    message(string.format("bid_count %s offer_count %s", quotes.bid_count, quotes.offer_count))
    sleep(1000)
  end
  
end

function My_Subscribe_Level_II_Quotes(class_code, sec_code)
  quotes_is_received = false
  
  OnQu ote = function(cl_code, s_code)
    if cl_code == class_code and s_code == sec_code then
      quotes_is_received = true
      message(string.format("Слепок стакана по инструменту %s [%s] получен", class_code, sec_code))
      OnQu ote = function()end
    end
  end
  
  is_subscribe = Subscribe_Level_II_Quotes(class_code, sec_code)
end
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Двойное срабатывание OnTrade( T ), Наблюдаю при сделках двойное срабатывание OnTrade( T ) сделках
 
Цитата
Алексей Степанов написал:
Что значит обновляемые сделки?
Добрый день.
Обновляемая сделка - это значит, что некоторые поля сделки могут меняться, в частности на некоторых рынках сделки теперь можно отменять, а следовательно будет изменен статус сделки, заполнится поле UID пользователя отказавшегося от сделки и так далее, TRANS_ID теперь присутствует как в структуре заявки так и в структуре сделки. В связи с этими изменениями OnTrade() как и OnOrder() теперь может вызываться более одного раза, даже если визуально никакие поля не поменялись, т.к. не все поля структуры сделки видны через QLua.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
простой код не работает
 
Цитата
Космонавт написал:
И ещё вопрос. Он не праздный. Может быть у дохлого брокера с одним сервером это будет проблемой.

Когда я заказываю данные с сервера, например, стакан, это создаёт нагрузку на сервер брокера?
ну например бесконечный цикл:
Код
  class =  "SPBFUT"  
sec =  "SRH7" 
 for  i =  1 , 10000000000000000000   do 
 qt =  getQuoteLevel2 (class, sec)
 end   
Вредит ли это способности брокера обслуживать других клиентов?
Например отправка заявок бесконечным потоком точно вредит. У других клиентов заявки будут дольше улетать на биржу.
Добрый день.
Предполагаю, что Вы таким способом реализовываете проверку о появлении данных по стакану после его заказа с сервера? Если это так, то посоветую Вам использовать функцию обратного вызова OnQuote(), которая будет вызвана сразу после прихода слепка заказанного стакана, а уже внутри функции OnQuote(), например, запоминать флаг, что слепок по такому-то инструменту и классу получен.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Оповещение при вылете Lua скрипта
 
Цитата
Алексей Злобин написал:
Добрый день!
Как обработать ошибку возникающую при вылете Lua скрипта?
Добрый день.
Один из вариантов решения данной задачи Вы можете найти в официальной  документации (документ 'Использование Lua в Рабочем месте  QUIK.pdf'. Файл можно найти в архиве quik_7.4.0_upd.zip в директории Doc\Lua.), раздел "Использование функции PrintDbgStr() на практике"
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Как получить результат у стоп-заявки?
 
Добрый день.
Анализируйте в функции обратного вызова OnStopOrder() для Вашей стоп-заявки поле linkedorder > 0, если linkedorder виден в таблице стоп-заявок, значит он должен быть доступен и из QLua. Т.к. функция обратного вызова OnStopOrder() вызывается при каждом изменении стоп-заявки, по этой причине сначала она вызывается на изменение статуса, а после того, как биржевая заявка выставлена появляется linkedorder и соответственно OnStopOrder() снова будет вызван.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
debugview - где его взять и как им пользоваться?
 
Цитата
Sergey Denegin написал:
И можно хотя бы в двух словах объяснить, чем он отличается от обычного message?

Если я выполняю команду из примера в документации к PrintDbgStr:

PrintDbgStr("test1")
то ошибки не выдает, но и ничего нигде не выводит. В какое окно он это выводит?
Добрый день.
Ответы на эти и многие другие вопросы Вы можете найти в официальной документации, которую подготавливали специально для начинающих пользователей QLua (документ 'Использование Lua в Рабочем месте QUIK.pdf'. Файл можно найти в архиве quik_7.4.0_upd.zip в директории Doc\Lua.)
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Подключение сторонних библиотек в Lua скрипте
 
Добрый день.
Нужно соблюсти структуру каталогов, как указано в документации на библиотеку, см. раздел Directory structure:
<LDIR>/compat-5.1.lua
<LDIR>/ltn12.lua
<LDIR>/socket.lua
<CDIR>/socket/core.dll
<LDIR>/socket/http.lua
<LDIR>/socket/tp.lua
<LDIR>/socket/ftp.lua
<LDIR>/socket/smtp.lua
<LDIR>/socket/url.lua
<LDIR>/mime.lua
<CDIR>/mime/core.dll

И соответственно перед использованием require("socket.smtp") добавить эти каталоги в переменные среды, например, так:
Код
package.cpath = getScriptPath() .. "\\<CDIR>\\?.dll;" .. package.cpath
package.path = getScriptPath() .. "\\<LDIR>\\?.lua;" .. package.path
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Вопросы про CallBack
 
Цитата
Алексей Злобин написал:
И есть функция main  в которой просматривается таблица a,не может ли у нас получится  там,  что a[trade.trade_num].status=nil?
Правда чисто теоретически...но все же интересно.Потоки то разные вроде.
Добрый день.
Используйте потокобезопасные функции для работы с таблицами Lua. Подробнее смотрите в разделе "Взаимодействие потоков Lua скрипта" (документ 'Использование Lua в Рабочем месте QUIK.pdf'. Файл можно найти в архиве quik_7.4.0_upd.zip в директории Doc\Lua.)
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
про тики
 
Цитата
тот самый написал:
Цитата
Sergey Gorokhov   написал:
Это делается либо путем открытия таблицы в терминале
Цитата
Nikolay Pavlov   написал:
1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок.
Добрый день.
Да, действительно, первоначально был не учтен момент, что при ручном выставлении фильтров для обезличенных сделок в меню "Система/Заказ данных/Поток обезличенных сделок" инициацией заказа данных будет именно открытие таблицы обезличенных сделок.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
СПРАВКА ПО QLUA. ВЫЧИТКА (Версия 7.4)
 
Цитата
тот самый написал:
Вы уже второй раз ссылаетесь на этот файл о месторасположении которого НИКТО кроме Вас не знает.
Добрый день.
Скорее всего Ваш брокер не включил данную документацию в перечень обновления или же Вы ищите не в том каталоге. Файл можно найти в архиве quik_7.4.0_upd.zip в директории Doc\Lua.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
СПРАВКА ПО QLUA. ВЫЧИТКА (Версия 7.4)
 
Добрый день.
Ответы на некоторые вопросы приведены в расширенной документации по QLua (см. документ 'Использование Lua в Рабочем месте QUIK.pdf' поставляемый с терминалом версии 7.4.0).
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QLUA, вопросы начинающих.
 
Цитата
тот самый написал:
использование PrintDbgStr тут в какую степь?
Добрый день. В документе показан пример использования функции PrintDbgStr(), как вариант можно использовать и для отправки писем или передачи сообщений в другое приложение.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
QLUA, вопросы начинающих.
 
Цитата
Алексей Орешкин написал:
7. Стандартными средствами LUA я как то могу сделать так чтобы робот отправил мне смс или пуш сообщение, или на крайняк написал письмо на мыло?
Добрый день. Пример отправки письма с использованием функции PrintDbgStr() можно посмотреть в расширенной документации по QLua (см. документ 'Использование Lua в Рабочем месте QUIK.pdf' поставляемый с терминалом версии 7.4.0). По аналогии можно реализовать СМС и пуш.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
про тики
 
Цитата
Фёдор Сухов написал:
Вы про какую сейчас версию Квика пишете?
Добрый день.
Речь шла о 7 версии терминала и выше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
про тики
 
Цитата
Старатель написал:
Если нужно сопоставить сделку из ТВС с тиком на графике (например, для индикатора), то параметр count был бы как раз кстати.
Можно ведь сопоставить по AllTrade.datetime.ms и DataSource:T(indx).ms, не думаю что какая-то торговая система регистрирует две обезличенные сделки в одну микросекунду.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
про тики
 
Цитата
Старатель написал:
В OnAllTrade() же отсутствует параметр count – количество тиковых интервалов в секунду.
В OnAllTrade() параметр count и не нужен, т.к. на структуре обезличенной сделки транслируется время до микросекунд (datetime.mcs), там и так видно какая обезличенная сделка пришла первой если в конкретную секунду их было несколько. А на структуре времени свечки которую возвращает DataSource:T(indx) время транслируется до миллисекунд, там тоже можно увидеть какая из обезличенных сделок пришла первой в конкретную секунду. А параметр параметр count для обезличенных сделок не используется, т.к. он предназначен для источника данных по параметру таблицы текущих торгов, т.к. параметры данной таблицы транслируются с точностью до секунд, и там как раз и помогает count разобраться какое изменение свечки было раньше.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
про тики
 
Добрый день.
По поводу функций OnAllTrade() и колбека заданного DataSource методом SetUpdateCallback() могу сказать следующее:
1) Для срабатывания OnAllTrade() не обязательно должна быть открыта таблица обезличенных сделок, достаточно выполнить заказ обезличенных сделок в меню Система/Заказ данных/Поток обезличенных сделок. Сделать это можно вручную, проставив галочки на необходимых классах и отфильтровав инструменты, если это необходимо, или же непосредственно из скрипта Lua создав ТИКОВЫЙ источник данных для обезличенных сделок функцией CreateDataSource()  и заказать их трансляцию выполнив метод SetEmptyCallback() для созданного источника данных.
2) Если создавать источник данных функцией CreateDataSource() НЕ по тиковому интервалу, а например по минутному, заказ обезличенных сделок не выполняется, т.к. с сервера QUIK заказываются непосредственно свечки;
3) Если создавать источник данных для обезличенных сделок функцией CreateDataSource() по тиковому интервалу и при этом задать для него конкретный колбек методом SetUpdateCallback(), например SetUpdateCallback(ds_Callback), то будут срабатывать и OnAllTrade() и ds_Callback() при этом очередность не регламентируется, но из собственного исследования, могу сказать, что OnAllTrade() срабатывает первым, ds_Callback() как и OnAllTrade() обрабатывается в основном потоке терминала QUIK.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
ParamRequest vs CreateDataSource
 
Цитата
Старатель написал:
1. Является ли использование функций ParamRequest или CreateDataSource обязательным для успешного получения значений параметра через getParamEx (при условии "умного" заказа данных), когда параметр не присутствует в явном виде в списках принимаемых параметров? Под "успешным получением значения" понимается получение актуального значения, а не сохранённого когда-то в кэше.
2. То же для getParamEx2.
А в чем собственно проблема?
Актуальные значения параметров Вы получите функцией getParamEx() или getParamEx2() если подписка на получение данных параметров с сервера QUIK выполнена, а уже выполнить подписку можно следующими способами:
1. Руками, выбрав в Система/Заказ данных/Поток котировок... нужные параметры и инструменты на классе;
2. При включенном "Умном заказе" («Исходя из настроек открытых пользователем таблиц» (меню Система /  Настройки / Основные настройки..., раздел «Программа» / «Получение  данных») и открытой таблице Текущих торгов с необходимыми параметрами и инструментами на классе;
3.  При включенном "Умном заказе", автоматически из скрипта Lua с помощью функций  ParamRequest или CreateDataSource;
4. Есть еще один вариант, когда при  включенном "Умном заказе" терминал QUIK заказывает сам необходимые параметры, которые ему нужны для корректного расчета лимитов (для разного типа инструментов он заказывает разные параметры, например, для фьючерсов он обязательно закажет ГО...)

Все, если ни один из 4 вариантов заказа параметров не выполнен, то функции getParamEx() или getParamEx2() не гарантируют актуальных значений параметров, в этом случае функции вернут пустые значения или старые "из кэша" значения.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Определить очередь моей заявки в стакане в любой момент времени., Определение очереди.
 
Простого решения нет, но первая мысль, которая приходит в голову следующая:
Предположим, что Вы выставили заявку на покупку (bid) по классу SPBFUT инструмент RIZ6, по цене 123.45 (my_order_price) с количеством 10 (my_order_qty)
Код
is_run = true

_bid = {}

function OnQuote(class, sec)
  if class =="SPBFUT" and sec == "RIZ6" then
    ql2_bid = getQuoteLevel2(class, sec).bid
    table.insert(_bid, ql2_bid)
  end
end

function OnStop(signal)
  is_run = false
end

function main()
  
  while is_run do
  
    if #_bid == 1 then 
      for k,q in ipairs(_bid[1]) do
        if q.price == my_order_price and q.quantity == my_order_qty then
          message(string.format("Моя заявка %i в очереди", k))
        elseif q.price == my_order_price and q.quantity > my_order_qty then
          message(string.format("Моя заявка %i в очереди, но так же по данной цене еще %i лотов не моей заявки", k, q.quantity - my_order_qty))
        end
      end
      _bid = {}
    end
    
    sleep(100)
  end
end
Код не проверял, это просто пример логики решения задачи, ее можно расширять, с учетом, что заявка может быть не только на покупку, а так же заявка может исполниться, т.е. нужно вводить проверку, что заявка еще активна, + нужно учесть, что некоторые рынки транслируют не полный стакан, например, 10x10 и Ваша заявка может выйти за эти границы и не отображаться в стакане, тогда уже точно не узнать какая она в очереди, но точно можно будет утверждать, что она больше 10. Также если торговля по инструменту оживленная, OnQuote() может сработать очень часто, и тогда в таблице _bid будет не одна запись, и в этом случае их придется обрабатывать все в цикле. Аналогично, можно реализовать проверку очередности при срабатывании OnOrder(), т.е. в тот момент, когда Ваша заявка только выставилась.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Есть ли возможность автоматически распознать тип инструмента: акция (российская компания), фьючерс, валюта или американские бумаги?, Это нужно знать, чтобы определить с какого счета отправлять заявку
 
Цитата
Владимир Петров написал:
Не знаете, с какой версии данный параметр появился?
Данный параметр появился в версии терминала 7.0
Цитата
Владимир Петров написал:
Причем param_value = 0 везде
param_value=0 и должно быть, как я вижу по скриншоту, Вы работаете на рынке акций ММВБ, на данном рынке параметр SECTYPE является строковым значением, т.е. param_type=3, а для параметров данного типа param_value всегда будет равен 0 (см. справку по QLua).
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Есть ли возможность автоматически распознать тип инструмента: акция (российская компания), фьючерс, валюта или американские бумаги?, Это нужно знать, чтобы определить с какого счета отправлять заявку
 
Добрый день.
Цитата
Владимир Петров написал:
Пробовал его вытащить (на джуниор квике), но param_value = 0 и param_image = "" у всех инструментов.
Такой результат getParamEx() или getParamEx2() может возвращать,  когда параметр не заказан терминалом с сервера, на каком рынке (по  какому классу) пытаетесь получить значение SECTYPE? Какая версия терминала?

Цитата
Владимир Петров написал:
Где-то находил, что SECTYPE - это строка, но отладчик говорит, что там таблица.
getParamEx() и getParamEx2() возвращает таблицу Lua.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Есть ли возможность автоматически распознать тип инструмента: акция (российская компания), фьючерс, валюта или американские бумаги?, Это нужно знать, чтобы определить с какого счета отправлять заявку
 
В таблице текущих торгов для каждого инструмента транслируется параметр "Тип инструмента" (sectype), его значение можно получить функцией getParamEx(classcode, seccode, "sectype')
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
ParamRequest vs CreateDataSource
 
Функция ParamReques() заказывает данные с сервера QUIK в том случае, если в настройках терминала включен "умный" заказ данные, т.е. в настройках Рабочего места QUIK включен признак получения данных «Исходя из настроек открытых пользователем таблиц» (меню Система / Настройки / Основные настройки..., раздел «Программа» / «Получение данных»). В этом случае терминал каждые 15 секунд опрашивает плагин QLua, и если с помощью функции ParamReques() был заказан какой-либо параметр, то в меню "Заказ данных - Поток котировок" автоматически появится галочка на классе и в фильтрах будут выбраны соответствующие инструмент и параметр. После остановки скрипта заказ данных прекращается, так же подписку на параметр можно отменить с помощью функции CancelParamRequest(). Так же необходимо учесть, что если используются функции ParamReques() и CancelParamRequest(), то отписаться от заказанных параметров возможно, если в скрипте используется новая функция getParamEx2(), если будет использоваться getParamEx(), то функция CancelParamRequest() не выполнит отписку от трансляции параметра.
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
OnOrder - сколько раз произойдет вызов при частичном исполнении?
 
OnOrder в этом случае сработает минимум 101 раз.
1 раз - на выставление заявки и  100 раз - на изменение параметра "Остаток"
Перед тем как задать вопрос, убедитесь, что решение Вашей задачи не описано в официальном мануале - 'Использование Lua в Рабочем месте QUIK.pdf' https://arqatech.com/upload/Public/quik_lua.zip
Страницы: Пред. 1 2 3
Наверх