Добрый день, всем, Хотя о том, про что буду рассказывать знаю с момента появления LUA VM в КВИКЕ и думал, что эту подлянку давно поборол, однако она снова дала о себе знать. --------------------- В частности примерно это же недавно обнаружил посетитель по нику Старатель. -------------------- Так как я давно казалось бы проблему решил, поэтому на его вопрос особо не обратил внимание. =============== но вот недавно столкнулся с проблемой удваивания заявок-близнецов. ================= Хотя ничего хорошего мне на форуме как обычно не посоветовали, но вредные советы тоже пригодились. =============== Например, представитель разработчиков гневно заявил, что мол надо все обнулять при index=1 в индикаторах. Благодарю его за его вредный совет. ------------------ Действительно, верно говорят -выслушай совет на Красной площади и сделай наоборот. ---------------------------- Поэтому я обратил внимание, что именно по index=1 я обнулил лог файл. ------------- продолжение следует..
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
29.07.2022 13:48:36
теперь все х'океу:
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
написал: Если хотите удалить все метки при срабатывании OnDestroy
Нужно удалить не все, а только те метки, что были выставлены из индикатора.
тогда в цикле DelLabel(STRING chart_tag, NUMBER label_id)
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
29.07.2022 09:04:15
Проблему решил. Всем спасибо.
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
29.07.2022 08:43:23
таблица заявок:
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
29.07.2022 08:40:36
Цитата
swerg написал: Николз, нужен полный код. Для возможности анализа, повторения. За фрагменты на любом форуме посылают лесом, порой в грубой форме. Здесь напрасно нянькаются.
попробую сделать короткий вариант. но прежде сделаю еще одну попытку объяснить. Это тест-индикатор и запускается он на демо сервере. в нет три функции 1- проверяет есть ли неисполненные транзакции эта функция ничего не отсылает, а выдает лишь число активных транзакций 2- посылает транзакцию на выставление заявки если функция 1 выдала 0 3- проверяет есть ли активные заявки и если есть снимает их --------------------- Таким образом , в on Calculate крутятся эти три функции ----------------- В этих функциях есть два места вывода транзакций в функции 3- в выставлении заявки вот это место ---------------------------
Код
id=id+1; t1.TRANS_ID=tostring(id); -- Уникальный идентификационный номер заявки, от «1» до «2 147 483 647»
local str=sendTransaction(t1); --отправить транзакцию
Log:write("str="..tostring(str)..",id="..tostring(id).."\n"); Log:flush()
Обратите внимание на следующее: id- идентификатор всегда увеличивается на 1 перед записью в транзакцию Сразу после отсылки транзакции выводится в лог сообщение транзакции и id ---------------- таким образом, если в этом месте будет выдано две транзакции то они будут иметь разные id и в лог файле будет две записи ========== второе место отсылки транзакции в функции 2 ------------------ вот это место
Код
id=id+1; t1.TRANS_ID=tostring(id); -- Уникальный идентификационный номер заявки
local str=sendTransaction(t1); --отправить транзакцию
Log:write("str2="..tostring(str)..",id2="..tostring(id).."\n"); Log:flush()
логика та же, что и выше. ========================== смотрим лог файл:
Код
str=,id=2173
str2=,id2=2174
str2=,id2=2175
Есть одно сообщение о выставлении заявки с id=2173 и далее два сообщения (id=2174 и id=2175) о снятии двух заявок. а это таблица заявок
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
написал: Вы видите там вторую транзакцию?Ау , где вторая транзакция, кто тут ее посылает?
Если Вы не видите, это не значит что ее нет. Жаль то приходятся в пятый раз повторять:
Цитата
написал: Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
Надо принять это как незыблемую аксиому. И пока Вы этого не сделаете, разобрать вообще никак не получится.
Цитата
написал: Возможно врач забыл скальпель в желудке пациента .
Посмотрите как сделано в документации, глава описания функции CandleExist там не зря указано обнуление переменных при indx == 1 Возможно у Вас та же история, попробуйте обнулять переменные при первом индексе
про обнуление при indx=1 вот вам фрагмент кода. --------------- if i==1 then nkInit(); i_old=1; return end ----------- а вот вам и обнуление -------------
Код
local function initT(sec,clas,account,client)
tS={}; tS[0]=0; for i=1,7 do tS[i]={0,0} end --стоп заяки
tO={}; tO[0]=0; for i=1,7 do tO[i]={0,0} end -- заявки
tOi={};tOi[0]=0; for i=1,7 do tOi[i]={0,0} end --транзакции заявок
tSi={};tSi[0]=0; for i=1,7 do tSi[i]={0,0} end --транзакции стоп-заявок
id,nOrder,nStop,obal,tbal,nto,nts=0,0,0,0,0,0,0; jD=-1;
step,lot_size,scale=0,0,0;
-- Log:write("sec="..tostring(sec)..",clas="..tostring(clas)..",tS0="..tostring(tS[0])..",tO0="..tostring(tO[0]).."\n"); Log:flush()
-----------------
end
---------------
local function nkInit()
-- DelAllLabels(tag);
tinfo=getDataSourceInfo();
clas=tinfo.class_code; sec=tinfo.sec_code; tag=sec; pname=tinfo.param;
interval=tinfo.interval;
Log=io.open(path_Log..name..sec..".log","w")
client=Settings.client;
-- Log:write("sec="..tostring(sec)..",clas="..tostring(clas)..",client="..tostring(client).."\n"); Log:flush()
t_acc={};
--- определяем торговый счет
local N=getNumberOf("trade_accounts");
for i=0,N-1 do z=getItem("trade_accounts", i);
if string.find(z.class_codes,clas,1,true) and z.status==0 then
firmid=z.firmid; account=z.trdaccid; break;
end
end
-----------------------------
end
У меня к Вам просьба. в будущем, когда у Вас возникнет желание ответить на мои вопросы, не надо мне рассказывать банальные вещи в программировании. ------------------- Если не можете что-то подсказать дельное по существу вопроса, то лучше молчите. -------------------- Я профессионально разрабатывал и более крутые системы РВ и ИИ. ----------------- Если бы вы, как все серьезные разработчики выложили API к QUIK и описали ее работу, то я бы Вас не спрашивал а сам разобрался бы( да и разберусь) ---------- Пока же Вы за более чем 20 лет нагородили большой "черный ящик", теперь засунули туда виртуальную машину которая потока не безопасная и работает в в окружении десятка потоков, ----------------------- Поэтому спрашиваю Вас про Ваш "черный ящик", под названием QUIK.
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
написал: Зачем двойная последовательность вызов функции OnCalculate(index)?
Вопрос задан две недели назад. Выложен код демонстрирующий ситуацию. В ветке по ссылки мучается пользователь.
Где ответ поддержки?
Это другой случай. В моем примере, повторный вызов приведет к отправке транзакции с другим id на 1 больше так как id увеличивается в следующем операторе после транзакции.
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 19:25:11
и еще поясню. У вас на демо сервере сделки идут не чаще 1 раз в секунду. если бы эта сделка была бы на следующем цикле, то время сделок отличалось бы на секунду а там близнецы -сестры.
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
написал: как в индикаторе можно отправить вторую заявку из другого места?
При чем тут индикаторы? Вы наверное считаете что раз пишите индикатор, то все на форуме в курсе про это? Ну допустим. Если речь про индикаторы то OnCalculate может сработать несколько раз, смотрите в эту сторону Или может у Вас несколько разных индикаторов с одним алгоритмом, кто знает
И еще раз, а то вдруг не понятно
Цитата
написал: Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически.
Хорошо, уточняю. Это индикатор, который делает тест на демо сервере - выставляет заявку по этой транзакции и когда она выставиться снимет ее по KILL ------------------ Еще раз медленно объясняю ========================== Oncalculate выглядит так:
Код
function OnCalculate(i)
--------------------
Order("orders",0); --снять заявку, если она есть
------------------
if conX("orders")==0 then
buy_sel(1,1,-1); --выставить заявку на покупку 1 лота, если ее нет
end
---------------
end
Индикатор демо загружен один на одном графике и по имени этого инструмента создается лог файл. -------------------- СЛЕДИТЕ ВНИМАТЕЛЬНО за объяснением ------------------ В приведенном выше фрагменте написано ============= t1.TRANS_ID=tostring(id+1); -- присваиваем транзакции уникальный id ====================== local str=sendTransaction(t1); --отправить транзакцию ============= if str=="" then id=id+1;... -- здесь этот id увеличивается на 1 ========================= Таким образом, в следующем цикле id будет на 1 больше ================= Вторая транзакция с таким же номером должна быть отослана на сервер между этими двумя операторами. ================ Вы видите там вторую транзакцию? Ау , где вторая транзакция, кто тут ее посылает? =============== Так как это индикатор, а не скрипт , то нет никаких параллельных потоков. ================ Но сильно не напрягайтесь, так и скажите, что понятия не имеете почему так происходит. За более чем 20 лет что только вы не написали в квике. -------------------- Возможно врач забыл скальпель в желудке пациента . И так бывает.
робот в индикаторе
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 13:17:36
Цитата
Владимир написал: , Всё никак не уймётесь, лапуль? Говно этот Ваш индикатор, ИДЕОЛОГИЧЕСКОЕ говно. И Вы абсолютный чайник, сподобившийся тут ликбезы проводить. Шли бы Вы из программистов, лапуль, куда-нибудь, где Вы ХОТЬ ЧТО-ТО соображаете.
говно у Вас в голове и поэтому словесный понос на форуме.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 13:16:04
Цитата
Илья написал: , , ,спасибо за советы. Демо счет уже открыл и не демо тоже) Сейчас у меня получилось через DDE в Excel выгружать данные (по строчно) с интервалом раз в 1 минуту.
Еще раз, окончательный вопрос звучит так: Как из QUIK получать данные из стандарных столбцов приземляя их например в Python для дальнейшего анализа? Куда копать?
Для подобных задач использую DDE и mapping file.
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
написал: по одной транзакции выставились две заявки близнецы.
Еще раз
Цитата
написал: Значит было две транзакции, а не одна. Найдите кто отправил вторую транзакцию
Не бывает по одной sendTransaction две заявки с разными номерами. Даже теоретически. Однозначно было две транзакции
Я Вам привел фрагмент кода и данные из лог файла. ID в коде меняется следом за посылкой транзакции. ================== Намекните, как в индикаторе можно отправить вторую заявку из другого места? в каком месте индикатора есть дополнительные потоки, исполняющиеся параллельно с этим фрагментом кода?
робот в индикаторе
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 10:10:54
Добрый день, Всем В качестве ликбеза для буратин и чайников, привожу результаты тестирования скорости исполнения выставления и снятия заявки в роботе, который реализован в индикаторе. ------------- кратко в чем преимущество такой реализации относительно реализации в виде скриптов. ================ 1) нет надобности писать колбеки и разбираться в них. ---------------- 2) робот можно сделать одинаковым для любых инструментов Например робот автомат управления стопом. --------------------- 3) проще реализовать, так как нет надобности заморачиваться с фильтрацией инструментов. На какой график кинете этого робота, на том инструменте он и будет работать. ================= А теперь о скорости его работы. Тест, в котором выставляется заявка, когда она выставится, робот ее снимает. при этом он проверяет таблицу стоп-заявок, заявок и депо. ================= На выставление заявки уходит примерно 0.006 сек На проверку активной заявки и выставление заявки на снятие уходит примерно выставление заявки на снятие уходит примерно 0.004 сек -------------------------- время в мкс:
Не понятно, что значит забивает присутствием. Поставьте вывод занятой памяти перед ней и после нее. ------------------------- что колбек , что не колбек - на память не влияет.
Удваиваются заявки. Версия 9.7.1.10., Вопрос разработчикам QUIK
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 09:02:49
Тестирую в демо версии выставление заявок фрагмент кода такой:
Код
t1.PRICE=tostring(price);
t1.QUANTITY=tostring(Q);
t1.TRANS_ID=tostring(id+1); -- Уникальный идентификационный номер заявки, от «1» до «2 147 483 647»
local str=sendTransaction(t1); --отправить транзакцию
Log:write("сообщение"..str.."\n"); Log:flush() -- вывод сообщения в файл
if str=="" then id=id+1; ji=ji+1; ti[ji]={id,0}; ti[0]=ji;
Log:write("заявка id"..tostring(id)..",ji="..tostring(ji).."\n"); Log:flush()
end ---если сообщение пустое то в файл выводится id транзакции
Поясняю. Разработчикам просьба внимательно читать пояснения. Все тщательно разжую. ================ Выполняется: str=sendTransaction(t1) строка str выводится в файл если сообщения нет , то id увеличивается на 1 и становится равным id транзакции и выводится в файл ===================== ВНИМАНИЕ!!! Таким образом, исключается передача транзакции с одинаковым id и контролируется количество переданных транзакций. =================== В лог файле при выполнении транзакции получаем:
Код
сообщение
заявка id31,ji=1
Т. е. ожидаем одну заявку с id=31 ---------------- ВНИМАНИЕ!!! смотрим в таблицу заявок:
Однако, наблюдаем по две заявки с одинаковыми id одинаковыми параметрами и в одно и тоже время. ------------------------ Что не так?
Подписка на стакан OnQuote в quik 9.7.1
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 02:27:18
Цитата
Дмитрий написал: quik 9.7.1 простой код, за несколько минут занимаемая память разбухает до более 10 Мб, запускается в lua 5.4.1
Код
function main ()
while true do
sleep ( 1000 )
end
end
function OnQuote (class, sec)
if ((class = = "SPBFUT" ) and (sec = = "SiU2" )) then
local ql2 = getQuoteLevel2 (class, sec)
-- что-то делаем
end
end
попробуйте тоже на другой версии. возможно так задумано уже давно?
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 02:26:15
Цитата
Glukator написал: Может, я чего-то не понимаю, но нахрен такие сложности? Откройте демо-счет с квиком у любого брокера и отлаживайте свои скрипты, покуда терпения хватит.
Вы вопрос читали? Тогда отвечайте на вопрос, а не рассказывайте очевидные вещи. открыть демо счет или у другого брокера - это ответ для дебилов, которые совсем уж ничего не знают, но это не ответ на вопрос. ------------------ Если предложить по существу вопроса не можете так зачем выпендриваться?
Получить строки таблицы Текущие торги.
Пользователь
Сообщений: Регистрация: 30.01.2015
28.07.2022 02:21:19
Цитата
Алексей написал: Об этом я в курсе. Задумка была такая, в эту таблицу я загоняю интересующие меня инструменты, а уже из нее я скриптом считываю только их и ничего больше. Может есть другой путь? Сама таблица "Текущие торги" меня вообще не интересует, принципиально я могу скриптом создать таблицу, но как в нее загнать интересующие меня инструменты? Понятно что скриптом без проблем, но принцип должен быть тот же, что и с таблицей "Текущие торги". Т.е. по сути, таблица должна указывать скрипту с чем работать, а инструменты добавляю и удаляю я сам из рабочего пространства Quik.
есть два варианта, но они не на lua. рассказать?
Получить строки таблицы Текущие торги.
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 17:33:30
Цитата
Алексей написал: Всем доброго времени суток. Есть такой вопрос. В терминале Quik есть таблица "Текущие торги #2". Создана прямо из оболочки Создать таблицу -> Текущие торги. В этой таблице находится весь список инструментов меня интересующих. Задача. Могу ли я получить из этой таблицы как минимум class_code и sec_code по каждому инструменту из этой таблицы? Или это в принципе невозможно? Зная идентификатор таблицы я думаю можно без проблем проделать такой фокус, но я его не знаю и понятия не имею где его достать.
непосредственно из таблице нет, но все инструменты и классы разрешенные Вам в терминале , т е то, что Вы можете выбрать в эту таблицу вы можете получить функциями из библиотеки QLua. Все есть в документации на эту библиотеку. см раздел Функции для обращения к строкам произвольных таблиц QUIK если каких то параметров не хватает то можно дозаказать см раздел Функции для заказа параметров Таблицы текущих торгов
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 17:18:35
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 17:18:03
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 12:17:28
Евгений Васильевич, но возможно, что вы не учли комиссионные сборы брокера и биржи и в итоге получите среднюю 96,66 -------------------- К сожалению, а этим показателем вообще не заморачиваюсь. поэтому не удержался от "погадать" ================ Мой совет, оцениваете успешность сделок по количеству денег на счете.
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 12:14:15
Евгений Васильевич, waprice - транслируется биржей и это цена на бирже всех сделок. ------------------ В вашем случае, средняя цена Вашей покупки 96,59, говорит, что вы купили ниже средней по рынку 96,66. С чем Вас и поздравляю.
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 12:10:59
Евгений Васильевич, Возможно , что это средневзвешенная цена для облигаций на рынке, а не для вашей покупки.
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 12:09:04
вообще-то
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 12:03:34
, И на вашей улице будет праздник. если использовать правило, "когда все сломал, то читай инструкцию", то Вот что пишет для Вас биржа: ======================================== Ценовые показатели на Фондовом рынке Московской Биржи
Особенности порядка расчета ценовых показателей
Особенности расчета ценовых показателей для инструментов, сделки с которыми могут заключаться в разных валютах
Если сделки с ценными бумагами заключаются в нескольких валютах, то осуществляется пересчет в рубли по курсу Банка России на дату заключения сделки.
Для облигаций цена сделок выражается в % от номинальной стоимости облигации
Попробуйте пересчитать цену Ваших облигаций и затем средневзвешенную. ------------------ Как говориться в Уставе КА: "О выполнении доложить"
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
27.07.2022 11:54:40
Цитата
Евгений Васильевич написал: nikolz, ------------------------ Я прав или нет? ------------------------ Да, прав, прав. Расчет тут абсолютно верен. Давайте больше формулу расчета средневзвешенного значения не обсуждать. Мы говорим об одном и том же. =) Проблема в том, что не сходятся эти расчеты со значениями в QUIK. Я всё про свой пример. Две облигации по 96,4 и одна по 96,98 (96,4*2 + 96,98)/3 = 96,59, но не 96,66 (которые рассчитал мне QUIK). Вот в чем вопрос. И вот еще: "если по итогам торгового дня Средневзвешенная цена не была рассчитана, она не приравнивается к Средневзвешенной цене предыдущего торгового дня" Это еще как понимать? Вчера я купил акции и рассчитал Средневзвешенную цену, а сегодня не покупал и уже не могу оперировать вчерашним значением ...
Судя по документу, средневзвешенная цена рассчитывается на торговый день. --------------------------- Если Вы хотите учитывать предыдущие расчеты, то делайте это своими руками. Очевидно это связано с тем, что биржа не хранит историю Ваших сделок. Поэтому у биржи нет возможности пересчитать цену с учетом истории. --------------------------------------------- Но разработчики квика могут это допилить при желании. -------------------- Про покупку Вами облигаций сказать ничего невозможно , так как надо видеть реальные данные сделок, а не то, что "вчера коза сказала". ------------------------ Телепатии не обучен, а гадать нет желания.
написал: средневзвешенная цена - это средняя цена, рассчитанная как арифметическое среднее. ------------ т е складываете все цены всех сделок и делите на число сделок. ------------------ Так как Вы считает не все сразу а по частям, то ранее рассчитанное вы снова восстанавливаете и снова все считаете для этого каждый раз все пересчитываете к новому количеству. ----------------- Но суть результата - сумму всех цен сделок делите на число сделок. ------------------------ Знаний в объеме ЦПШ или 4 классов начальной школы достаточно. --------------------------- Надо знать всего две арифметические операции -сложить и поделить (любимые операции финансистов) операции - отнять и приумножить (любимые фискальщиков) знать не обязательно.
.
Спасибо за ответ, но если честно, всю жизнь думал что среднее арифметическое и средневзвешенное это немного разные вещи. привела формулу для средневзвешенного и это не среднее арифметическое. Я полностью с ней согласен. Отличия лучше всего показать на примере. Одна акция по 100 рублей и 10 акций по 10 рублей дают среднее арифметическое в 55 рублей за акцию. В то же время, одна акция по 100 рублей и 10 акций по 10 рублей дают средневзвешенное примерно в 18,18 рублей за акцию. В этом примере дешевых акций больше и вес их в среднем больше. Вот и требуется средневзвешенное. Это на уровне моей ЦПШ. Если в чем-то не прав, уважаемый nikolz, поправьте. =)
написал: средневзвешенная цена - это средняя цена, рассчитанная как арифметическое среднее. ------------ т е складываете все цены всех сделок и делите на число сделок. ------------------ Так как Вы считает не все сразу а по частям, то ранее рассчитанное вы снова восстанавливаете и снова все считаете для этого каждый раз все пересчитываете к новому количеству. ----------------- Но суть результата - сумму всех цен сделок делите на число сделок. ------------------------ Знаний в объеме ЦПШ или 4 классов начальной школы достаточно. --------------------------- Надо знать всего две арифметические операции -сложить и поделить (любимые операции финансистов) операции - отнять и приумножить (любимые фискальщиков) знать не обязательно.
.
Спасибо за ответ, но если честно, всю жизнь думал что среднее арифметическое и средневзвешенное это немного разные вещи. привела формулу для средневзвешенного и это не среднее арифметическое. Я полностью с ней согласен. Отличия лучше всего показать на примере. Одна акция по 100 рублей и 10 акций по 10 рублей дают среднее арифметическое в 55 рублей за акцию. В то же время, одна акция по 100 рублей и 10 акций по 10 рублей дают средневзвешенное примерно в 18,18 рублей за акцию. В этом примере дешевых акций больше и вес их в среднем больше. Вот и требуется средневзвешенное. Это на уровне моей ЦПШ. Если в чем-то не прав, уважаемый nikolz, поправьте. =)
чтобы понять , кто прав рассмотрим следующий пример: Совершено 3 сделки: 3 акции по 1 руб , 3 акции по 3 руб , и 6 акций по 4 руб по моему мнению средневзвешенная цена считается так: (1*3+3*3+4*6)/(3+3+6)=3 рубля. ------------------------ Я прав или нет? Ответ на этот вопрос очень простой. В таких случаях я говорю буратинам и чайникам - Читайте документацию. ----------------- Читаем? Угу. ---------------- Вот выдержка из документов биржи по этому вопросу:
Помогите разобраться: почему не выставляется заявка на покупку?
Пользователь
Сообщений: Регистрация: 30.01.2015
26.07.2022 19:23:07
Цитата
Аркадий написал: Здесь в сообщении просто не скопировалась. Причем, если переменной Z присвоить конкретное значение - то работает. А через функцию - нет
возможно у вас неправильное число десятичных знаков в цене получается после вычитания
Расчёт средней цены
Пользователь
Сообщений: Регистрация: 30.01.2015
26.07.2022 16:41:40
средневзвешенная цена - это средняя цена, рассчитанная как арифметическое среднее. ------------ т е складываете все цены всех сделок и делите на число сделок. ------------------ Так как Вы считает не все сразу а по частям, то ранее рассчитанное вы снова восстанавливаете и снова все считаете для этого каждый раз все пересчитываете к новому количеству. ----------------- Но суть результата - сумму всех цен сделок делите на число сделок. ------------------------ Знаний в объеме ЦПШ или 4 классов начальной школы достаточно. --------------------------- Надо знать всего две арифметические операции -сложить и поделить (любимые операции финансистов) операции - отнять и приумножить (любимые фискальщиков) знать не обязательно.
.
Помогите с кодом индикатора Spred
Пользователь
Сообщений: Регистрация: 30.01.2015
26.07.2022 10:31:53
так работает моя программа арбитража.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Пользователь
Сообщений: Регистрация: 30.01.2015
26.07.2022 07:23:10
понятно, что Буратинам всегда хочется на халяву стать миллиардером.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
написал: вам надо создать сервер доступный из интернет. далее используя socket транслируете данные на сервер.
И заплатить ещё программисту за создание этого сервера.
Цитата
написал: Задача дать стороннему (!) программисту данные о торгах по акциям в реальном времени (ну или хотя бы минутными свечами) желательно без права выставления ордеров
У некоторых брокеров можно запросить ещё один аккаунт для квика, иногда за доп. плату. Спросите своего брокера о возможности предоставления вам "просмотрового" аккаунта.
Если я правильно понял автора, он хочет данные передать в реальном времени разработчику робота. Не знаю, доступно ли программирование в луа при просмотровом аккаунте.
Какая функция читает ДОСКУ ОПЦИОНОВ ?
Пользователь
Сообщений: Регистрация: 30.01.2015
26.07.2022 07:19:20
вариант решения может быть такой: Например, написал dll, которая подгружает DDE сервер в КВИК. Это позволяет получить в lua любую таблицу КВИК, в том числе доску опционов.
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 18:13:01
поставьте sleep хотя бы на 100 ms
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 18:11:54
У вас в main нет задержки поэтому сервер работает в цикле Main Посмотрите загрузку процессора должно быть много.
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 18:10:25
Какая у вас версия КВИК
Помогите с кодом индикатора Spred
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 18:08:36
сделайте вычисления на предыдущей свече и все будет нормально.
написал: Если график перезагрузить, то max/low рассчитываются как надо - по закрытию.
Я имел ввиду на истории! А новые свечи, после перезагрузки, опять идут по high/low... У Вас л/с есть полный код, можете потестить. Он рабочий.
Я Вам написал выше вариант. Вы опять слепили свое. и где у вас второй инструмент? Если пишите сове, то должно быть не больше, чем у меня выше.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 16:28:06
Например, когда делал подобный сервер то скорость в тесте составляла 50 тысяч соединений в секунду.
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 16:25:00
Цитата
Илья написал: nikolz, Какая будет при этом скорость обмена? (для моих задач достаточно настраиваемой в QUIK от 1 сек до 1 минуты устроит).
такая же как у вас сейчас с брокером. можете сделать еще быстрее для этого Вам надо поставить сервер на компе с квиком и затем сделать к нему доступ из интернета.
Помогите с кодом индикатора Spred
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 16:23:05
Цитата
Юрий написал: Если график перезагрузить, то max/low рассчитываются как надо - по закрытию.
сделайте нормальную картинку. Для этого поместите этот индикатор в окошко под графиком свечей
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?
Пользователь
Сообщений: Регистрация: 30.01.2015
25.07.2022 16:18:17
Цитата
Boris написал: Есть исправно работающий обработчик стаканов. Хочется прикрутить вывод информации из Quik в сторонние приложения по средством организации передачи данных через socket сервер. Постоянно запускающаяся зацикленная функция вызываемая из main производит обработку и складирование данных в массив. Socket сервер - должен периодически выдавать эту информацию по запросу подключившегося клиента.
Для запуска в Quik сервера используется библиотека luasocket (под lua 5.4.1). Запуск ожидания коннекта ServerRun() - так же запускается из main. При этом после выполнения server:accept() - выполнение какого либо кода прекращается. Прекращается до тех пор пока на сервер не поступит запрос - он не выдаст ответ и только тогда функция table.load(var, 1000) будет запущена повторно. И тоже застопорится до поступления следующего запроса от socket клиента. client:settimeout(2) - должен вроде как прерывать ожидание коннекта и закрывать коннект - что поспособствовало бы продолжению выполнения иного кода, но этого не происходит. Пробовал многое - но ничего не помогло. Где бы в коде не запускалась server:accept() - она останавливает выполнение любых других функций. Как организовать запуск table.load(var, 1000) и ServerRun() - в раздельных потоках - так чтобы выполнение одной функции не останавливалось на период работы другой ? Код для примера (сильно сокращён)
Код
socket = require ( "socket" )
IPAddr = "127.0.0.1" --IP Адрес
IPPort = 3585 --IP Port
client = nil
function main ()
while is_run do
table.load (var, 1000 )
end
ServerRun()
end
function ServerRun ()
while is_run do
client = server:accept()
client:settimeout( 2 )
local line, err = client:receive()
local result = evalString(line)
if not err then client:send(result .. "\n") end
client:close()
end
end
function OnInit (quik_path)
server = assert( socket.bind ( "127.0.0.1" , IPPort))
end
У вас сервер запускает когда main завершает работу. Т е если main работает то сервер не запускается Вы должны его вставить в цикл main
ParamRequest и CancelParamRequest в индикаторах, ACCESS VIOLATION
Settings = {
Name = 'ParamRequest' ,
line = {
{ Name = 'ParamRequest' }
}
}
function Init ()
return # Settings.line
end
local class_code, sec_code
function OnChangeSettings ()
OnDestroy()
local DSI = getDataSourceInfo ()
class_code = DSI.class_code
sec_code = DSI.sec_code
PrintDbgStr (tostring(sec_code))
ParamRequest(class_code, sec_code, 'LAST' )
end
function OnCalculate (index)
if index = = 1 then
ParamRequest(class_code, sec_code, 'LAST' )
end
return nil
end
function OnDestroy ()
if sec_code then
CancelParamRequest(class_code, sec_code, 'LAST' )
end
end
При добавлении / удалении индикатора возникают ошибки:
Цитата
Function OnChangeSettings: ACCESS VIOLATION at address 000007FC524B89CC ACCESS VIOLATION at address 000007FC524B89CC
Что не так?
Предположу, что функция getDataSourceInfo вернула nil. Все дальнейшие действия привели к попытке обратится к несуществующему адресу памяти.
Скорее всего эта ошибка связана с функцией PrintDbgStr
Посоветуйте как правильно передавать данные?, доступ в квик стороннему программиста без права выставления реальных ордеров (для тестирования стратегии)
Подскажите пожалуйста как правильно дать доступ к данным и в каком формате?
Задача дать стороннему (!) программисту данные о торгах по акциям в реальном времени (ну или хотя бы минутными свечами) желательно без права выставления ордеров
Исходные данные находятся в настраиваемых колонках квика на примере Акций - Торговля (Код инструмента — Цена открытия — Количество сделок и тп) Для решении задачи сторонние API не подходят и нужен именно квик.
Интересует название самой технологии и примерный порядок действий.
Саму ТС уже придумал но нужно тестировать на реальных потоковых данных. Обратный тест на истории не подходит так как там есть только цена и временные интервалы.
Буду благодарен тому кто скажет в какую сторону "копать". Спасибо.
если сторонний пользователь удаленный, то вам надо создать сервер доступный из интернет. далее используя socket транслируете данные на сервер. сторонний подключается к серверу и получает от него данные. можно использовать технологию MQTT. Примерно так.
Luasocket сервер - останавливает выполнение кода, Возможен ли асинхронный запуск нескольких функций в Quik lua ?