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

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

Страницы: Пред. 1 ... 33 34 35 36 37 38 39 40 41 42 43 ... 72 След.
Запуск скрипта из примера подвешивает терминал Quik
 
если  комп с несколькими ядрами, то ничего не вешает.
---------------------
Я использую системные события для синхронизации потоков.
-------------------------
Без синхронизации загрузка процессора 33%
с синхронизацией  1-5%.
---------------------
Использование sleep не лучшее решение.
--------------------------
Проще и лучше, если не используете системное событие , использовать флаги.
Сдвиг массива без цикла for или while, Возможно ли сдвинуть массив без цикла for или while, если количество строк массива может изменяться?
 
Цитата
Айдар написал:
Подскажите, пожалуйста, для понимания вот полный код:
Например так:
---------------------------
table.remove(t,1)  
не все то золото, что блестит
 
таблица не очень
поэтому повторю ее еще раз:
Код
_tk(us)=1.2
SBER(us)=3089.9
__tk(us)=3124.1
TransReply t(us)=2.3
Order t(us)=6.3
TransReply t(us)=0.9
Order t(us)=5.0
SBER(us)=165.5
__tk(us)=199.4
Order t(us)=3.3
Order t(us)=2.6
__tk(us)=1.4
__tk(us)=1.3
__tk(us)=11.1
SBER(us)=182.7
__tk(us)=221.2
FLOT(us)=3879.5
__tk(us)=3916.3
TransReply t(us)=7.2
__tk(us)=119.8
FLOT(us)=547.5
__tk(us)=587.2
Order t(us)=11.5
Order t(us)=9.0
LKOH(us)=4958.5
__tk(us)=3586.8
__tk(us)=2.1
__tk(us)=0.9
TransReply t(us)=7.2
TransReply t(us)=1.1
Order t(us)=3.4
FLOT(us)=224.7
__tk(us)=397.8
LKOH(us)=540.6
__tk(us)=687.2
Order t(us)=6.2
Order t(us)=2.7
Order t(us)=2.4
__tk(us)=1.6
__tk(us)=1.4
SBER(us)=190.5
__tk(us)=223.0
__tk(us)=0.9
SBER(us)=199.9
__tk(us)=344.4
__tk(us)=0.9
SBER(us)=224.4
__tk(us)=268.7
SBER(us)=217.0
__tk(us)=255.2
SBER(us)=223.6
__tk(us)=263.0
__tk(us)=1.1
LKOH(us)=362.7
__tk(us)=406.7
SBER(us)=216.2
__tk(us)=236.4
__tk(us)=1.0
CHMF(us)=4883.2
__tk(us)=4917.7
TransReply t(us)=7.9
__tk(us)=2.1
__tk(us)=1.6
CHMF(us)=733.1
__tk(us)=774.4
SBER(us)=169.0
__tk(us)=185.8
Order t(us)=3.3
Order t(us)=2.4
TransReply t(us)=2.7
Order t(us)=3.8
CHMF(us)=614.0
__tk(us)=834.3
RNFT(us)=3410.1
__tk(us)=3447.4
Order t(us)=8.0
__tk(us)=1.8
__tk(us)=11.0
TransReply t(us)=10.4
TransReply t(us)=2.3
__tk(us)=2.3
__tk(us)=1.6
__tk(us)=1.4
__tk(us)=1.4
CHMF(us)=482.3
__tk(us)=660.0
RNFT(us)=441.2
__tk(us)=459.7
__tk(us)=0.9
Order t(us)=3.6
Order t(us)=2.9
Order t(us)=2.8
Order t(us)=2.8
TransReply t(us)=2.9
__tk(us)=1.8
TransReply t(us)=1.6
Order t(us)=3.3
CHMF(us)=620.0
__tk(us)=797.2
SBER(us)=187.0
__tk(us)=208.0
__tk(us)=1.0
Order t(us)=3.8
Order t(us)=3.1
Order t(us)=2.9
__tk(us)=1.9
__tk(us)=1.6
TransReply t(us)=6.9
__tk(us)=2.4
__tk(us)=1.8
AFKS(us)=3926.4
__tk(us)=3960.6
Order t(us)=5.9
Order t(us)=2.4
TransReply t(us)=8.5
__tk(us)=1.8
AFKS(us)=501.9
__tk(us)=538.4
LKOH(us)=163.5
__tk(us)=183.6
SBER(us)=159.5
__tk(us)=180.2
__tk(us)=1.1
Order t(us)=4.2
Order t(us)=3.2
TransReply t(us)=3.7
Order t(us)=4.2
AFKS(us)=348.4
__tk(us)=524.3
Order t(us)=5.0
SGZH(us)=4205.9
__tk(us)=3090.5
__tk(us)=1.9
__tk(us)=0.7
TransReply t(us)=5.9
TransReply t(us)=2.2
Order t(us)=4.3
AFKS(us)=503.0
__tk(us)=605.1
MRKV(us)=1123.5
__tk(us)=1239.7
__tk(us)=1.0
Order t(us)=3.7
Order t(us)=3.1
Order t(us)=2.7
__tk(us)=1.9
__tk(us)=1.6
__tk(us)=1.8
TransReply t(us)=11.4
TransReply t(us)=1.7
__tk(us)=2.3
__tk(us)=1.4
AFKS(us)=440.4
__tk(us)=600.9
SBER(us)=138.8
__tk(us)=158.4
__tk(us)=0.9
Order t(us)=6.9
Order t(us)=3.1
Order t(us)=2.8
Order t(us)=2.7
__tk(us)=2.2
TransReply t(us)=11.2
AFKS(us)=629.5
__tk(us)=663.4
SBER(us)=131.6
__tk(us)=214.6
Order t(us)=3.3
Order t(us)=2.5
TransReply t(us)=3.8
Order t(us)=3.6
AFKS(us)=498.4
__tk(us)=624.5
SBER(us)=99.7
__tk(us)=111.3
Order t(us)=8.7
SNGS(us)=3741.5
__tk(us)=2769.7
TransReply t(us)=8.1
TransReply t(us)=1.1
__tk(us)=1.8
__tk(us)=1.3
__tk(us)=1.3
AFKS(us)=582.5
__tk(us)=733.9
Order t(us)=4.7
Order t(us)=5.1
Order t(us)=4.0
SNGS(us)=2139.4
Order t(us)=3.8
__tk(us)=19.6
TransReply t(us)=3.8
__tk(us)=2.4
TransReply t(us)=1.9
Order t(us)=6.5
AFKS(us)=458.8
__tk(us)=650.8
ROSN(us)=4161.7
__tk(us)=4191.7
Order t(us)=8.0
Order t(us)=4.3
Order t(us)=3.2
__tk(us)=2.2
TransReply t(us)=2.5
__tk(us)=2.5
TransReply t(us)=2.0
Order t(us)=4.2
AFKS(us)=642.0
__tk(us)=825.9
__tk(us)=1.3
Order t(us)=3.3
Order t(us)=3.0
Order t(us)=2.6
__tk(us)=1.7
__tk(us)=1.3
TransReply t(us)=11.8
__tk(us)=2.9
AFKS(us)=584.2
__tk(us)=623.6
SBER(us)=140.5
__tk(us)=154.1
Order t(us)=4.2
Order t(us)=3.0
TransReply t(us)=4.7
Order t(us)=6.7
не все то золото, что блестит
 
В качестве информации и для сравнения,
выкладываю время работы колбеков и main скрипта на тестовом сервере QUIK.
---------------------
В данном тесте  роботу задана работа по 36 инструментам.
----------------------------------
При получении колбека onParam по инструменту,
робот вычисляет свечи 4 таймов,
снимает ранее выставленную заявку
и выставляет новую.
и так далее
----------------------------
В приведенной ниже таблице результата обозначено:
_tk -время main ;
если указан инструмент,
то это время получения свечей 1 минута и формирование на их основе свечей 5 мин 30 мин и 1 день.
Время колбеков содержит их имя.

--------------------------------
Скрытый текст
Время сервера, время последней сделки., Разное время передаваемое с сервера.
 
Цитата
Nikolay написал:
Прямо сейчас наблюдаю такую картину. Время сервера отстает на минуту от текущего времени (оно синхронизировано и корректно).
При  этом время последней сделки на минуту впереди времени сервера и близко к  правильному текущему времени, т.е. тоже опережает время сервера.

Я  могу понять, что это проблема брокера (Сбербанк), но с какой стати  время сделки в будущем относительно времени сервера брокера и времени  пакета?
Т.е. я понимаю, что время сделки просто транслирует биржа, но  серверная часть должна же не просто транслировать, но и как-то  контролировать, что она транслирует.
сервер брокера никак не контролирует то, что транслирует с биржи.
его задача работать со заявками клиентов, проверять достаточность средств и формат заявок и отправлять их на сервер биржи.
время сервера иногда гуляет относительно времени биржи.
не все то золото, что блестит
 
Расскажу Вам об одном заблуждении,
которое бытует не столько у чайников, как  у  профи, ваяющих роботов на луа.
--------------  
Постановка задачи :
---------------------
Есть инструмент X и его параметр  P.
Надо сделать таблицу инструментов и их параметров.
Периодически надо искать параметры конкретного инструмента  X в этой таблице.
------------------
Вопрос:
Как  быстрее сделать поиск нужного элемента таблицы.
-----------------------
есть как минимум два способа организации таблицы
-------------
Вариант 1 использовании хэш индексов.
В этом случае для записи параметра P  инструмента X  таблицу  T,  пишем  T[X]=P , чтобы прочитать параметр P надо записать P=T[X]
----------------------------------
Вариант 2  -любимый тех писателей роботов, которые плохо  знают  луа, но писали на других языках программирования.
В этом случае используем два индексных массива  T1 и T2, в которых под одинаковыми номерами j пишем T1[j]=X; T2[j]=P
=============
Теперь для поиска параметра P элемента X во втором варианте надо перебрать в цикле по индексу массив T1 и найти X
потом по этому индексу прочитать параметр из массива T2
===========
Какой вариант быстрее?
Давайте сравним на следующем тесте:
------------
заполняем три массива
Код
local t,t1,t2={},{},{}
local N=1000
for i=1,N do local x="a"..i; local x1="b"..i; t[i]=x; t1[i]=x1;   t2[x]=x1 end
считаем время по первому варианту:
Код
 local Tm1=0;
for i=1,N do local x="a"..i;
nklib.startA();
local s=t2[x];
 Tm1=Tm1+nklib.stopA();
 end
 print(0.1*Tm1);
считаем время по второму варианту :
Код
local Tm2=0;
for i=1,N do local j; local x="a"..i;
nklib.startA();
 for n=1,N do if t[n]==x then j=i; break end end
 local s=t1[j];
 Tm2=Tm2+nklib.stopA();
 end
  print(0.1*Tm2);
print(Tm2/Tm1)
Результат:

Вариант 1:  58 мкс
Вариант 2: 8027 мкс
------------------  
Резюме:    Вариант 2 в 138 раз медленнее, чем Вариант 1.
не все то золото, что блестит
 
Цитата
Владимир написал:
nikolz, Чушь полная.

1. Вероятность того, что все клиенты одновременно выставляют заявки РАВНА нулю.

2. Даже в этом случае данные от клиентов обрабатываются последовательно, и очередь (системная) одна: даже просто для того, чтобы раскидать пакеты по серверам, нужно принимать какие-то решения на уровне диспетчера, даже если эти решения принимаются на аппаратном уровне.

3. Заявка клиента будет стоять в очереди до тех пор, пока не будет исполнена или снята, а никакие не "8 секунд". Если же под "заявкой" подразумевается любая транзакция, то время её обработки наверняка будет зависеть от её вида.

4. Брокер, у которого столько клиентов, не может быть стеснён в деньгах по определению, и с радостью расширит свою пропускную способность до любых требуемых величин. Возможно даже, он часть заявок своих клиентов замкнёт друг на друга у себя, связываясь с биржей лишь в остальных случаях.

5. В любом случае "реальное время" у робота на клиенте нужно измерять В СЕКУНДАХ, а не в МИЛЛИсекундах и не в МИКРОсекундах. Dixi.
Владимир,
----------------  
Я хотя бы привожу свое со ссылкой на числовые данные доступные на отчетах конференций разработчиков QUIK.
Вы же голословно рассуждаете.
-----------------------
Все Ваши домыслы полная хрень.
-------------------------
Вот лишь доказательство  этого  п.4:
----------------
По существу замечу следующее (читайте ФЗ "о рынке ЦБ" и ГК РФ)
----------------  
Брокер не имеет право замыкать сделки между клиентами, если они не дали согласие на внебиржевые сделки.
Но и в этом случае  клиенты должны подать соответствующие поручения.
-----------------
Остальные пункты даже критиковать не буду. Мало ли что на заборе пишут.
Как получить значение индикатора на предыдущей свече
 
пишите значения индикатора в массив и читайте со смещением
------------------
Пример:
local t={ }
-----
local x=indicator(i)
----------------------
if x then t[i]=x else if #t>0 then t[i]=t[i-1] end end   -- если значения нет, то пишем предыдущее значение
-------------------
local M=#t;
local x1;  if M>0 then x1=t[M-1] end  --читаем  предыдущее значение
-------------------
local x2;  if M>01 then x1=tM-2] end  --читаем  предпредыдущее значение
не все то золото, что блестит
 
Цитата
r написал:
Цитата
nikolz написал:
Это означает, что данные мы получаем не чаще чем один раз в 0.7 секунды в виде пакета,
Потом этот пакет пересылается нам в колбеки.
В итоге вам кажется, что вы получаете данные в реальном времени, а в действительности с задержкой на 0.7 секунды.
В реальных торгах задержка возможно и меньше, но передачу пакетом никто не отменял.

По моему опыту мне кажется, что данные я получаю чаще, чем один раз в 0.7 секунды.
Но, как говорится, частота получения данных и задержка - это две большие разницы.
В реальных торгах задержка может достигать нескольких секунд или более. Хоть получать вы можете данные с высокой частотой, но это будут "старые" данные с большой задержкой.
У меня данные с сервера приходят с задержкой 0.03 сек - это задержка канала связи (смотрим  в информационном окне терминала QUIK в расширенном режиме) .
-----------------------------------
Но как быстро обновляются данные в пакетах среза - это вопрос открытый.
----------------------------------
Ранее встречал информацию, что биржа рассылает широковещательно информацию с интервалом 0.5 сек.
=================  
При большой очереди к серверу брокера задержка реакции на транзакцию может составить и секунды.
------------------------
Сами разработчики QUIK сообщали ранее, что скорость обслуживания транзакции сервером QUIK составляет 0.001 сек.
==============  
Пример задержки реакции сервера брокера на транзакцию клиента.
-----------------------
У известного брокера число клиентов 800 тысяч.
Предположим, у него 100 серверов.
Предположим, что все клиенты выставляют заявки.
В среднем на каждом сервере будет очередь 8000.  
-----------------------------------------
Последний в очереди будет стоять в очереди 8 секунд.
Интеграция Quik и TWS
 
Цитата
Нафатаил написал:
TWS
TWS - это терминал как и QUIK
Терминал к терминалу подключать смысла нет.
----------------------------
Вам надо терминал QUIK подключать к серверу TWS.
Но это вам не дадут сделать разработчики QUIK
------------------------
Если Вы хотите сделать робота для TWS то для этого  их API - аналог QLUA в терминале  QUIK
---------------------
тейк профит, отступ от мах, мин.
 
Цитата
Алексей написал:
Здравствуйте, почитал пост но все равно не разобрался. Помогите пожалуйста. Оставлял тейк профит заявку на покупку одного лота AGRO по цене 865 отступ и спред стояли 0,стояла галочка "купить по рыночной цене" в итоге цена пришла на 864 заявка висит как исполнена но лот не купился. Указано "Не прошла контроль лимитов"
Если не сложно покажите на примере какие параметры заявки тейк профит на покупку должны стоять если я хочу взять 1 лот по цене 865. Заранее спасибо
У Вас пробема в том, что Вы указали -купить по рынку. Поставьте конкретную цену и все будет OK
Кривые шибки в QLua
 
Цитата
Старатель написал:
QUIK 9.3.1.11, Lua 5.4
Ещё парочка "неуловимых" косяков. Обе ошибки были в main. Никаких сторонних библиотек не подключено, только QLua-код.

1.  
Код
   local  Time  =  tonumber(( os.date ( '%H%M' )))
 if  Time  >  =   2300   then   
Ошибка:
Цитата
attempt to compare number with nil

2.  
Код
   local  Param  =   getParamEx 2( 'SPBFUT' ,  'SRZ1' ,  'STEPPRICE' )
tonumber(Param.param_value)   -- вернул nil   
Во время ошибки в лог было записано состояние самой таблицы Param:
Код
  {result =  "1" , param_type =  "1" , param_image =  "1,000000" , param_value =  "1.000000" }  
Вопрос к любителям ловли ошибок в QLUA
-----------------
Представим , что в момент вывода функцией main  параметров некоторой таблицы QUIK
происходит вызов терминалом колбека QLUA и изменение этой таблицы.,
------------
Вопросы:
1) что будет выводить функция main в этом случае, то что было до вызова колбека или то, что осталось после вызова.
-------------------------------
2) если будут в параметрах nil,  то это ошибка QLUA, или ошибка писателя main, который использует потоко не безопасные функции в ней?
Например, использовал функцию  getParamEx.
Кривые шибки в QLua
 
Цитата
Игорь Б написал:
Вот простой код
Вот простой код
Код
function main()
  a = {};--массив
  a[1] = 1;
  a[2] = 3;
  a[3] = 5;
  a[4] = 7;
  a[5] = 9;  
  length = #a;--размер/длина массива
  message("a[1]="..tostring(a[1])..
     "\na[2]="..tostring(a[2])..
     "\na[3]="..tostring(a[3])..
     "\na[4]="..tostring(a[4])..
     "\na[5]="..tostring(a[5])..
     "\na[6]="..tostring(a[6])..
     "\nlength="..tostring(length));
     
end;
Если его запустить, то length = 5.
Если закомментировать a[4]  length = 3.
Если закомментировать a[2] или a[3], то сразу или с какого то раза length = 5.
Все работает правильно.
Чтобы проверить это набираем Ваш пример в Scite -редакторе текста со встроенным отладчиком версия
вот ваш скрипт:
Код
   a = {};--массив
   a[1] = 1;
   a[2] = 3;
   a[3] = 5;
   a[4] = 7;
   a[5] = 9;
   length = #a;--размер/длина массива
   print("a[1]="..tostring(a[1])..
      "\na[2]="..tostring(a[2])..
      "\na[3]="..tostring(a[3])..
      "\na[4]="..tostring(a[4])..
      "\na[5]="..tostring(a[5])..
      "\na[6]="..tostring(a[6])..
      "\nlength="..tostring(length));
Если его запустить, то length = 5.
-----------------
a[1]=1
a[2]=3
a[3]=5
a[4]=7
a[5]=9
a[6]=nil
length=5
>Exit code: 0
>D:/lua54/lua54.exe -e "io.stdout:setvbuf 'no'" "test_.lua"
=====================
Если закомментировать a[4]  length = 3.
a[1]=1
a[2]=3
a[3]=5
a[4]=nil
a[5]=9
a[6]=nil
length=3
>Exit code: 0
==========================
Т е QLUA  не виновата
__________________
В документации на Lua Вы можете прочитать, что
длина массив #a  - не является действительной длиной, если в массиве есть дырки - nil
--------------------------


[CODE][/CODE]
доработка таблицы Позиции по инструментам
 
Цитата
s_mike@rambler.ru написал:
Вы должны сами решить, в каком классе из возможных продавать ваши бумаги. Кроме вас, никто об этом не знает.

вы сами писали в первом сообщении, что можете перебрать доступные торговому счету классы и найти там тот в котором можно продать ваши бумаги. Ну и делайте так, если все равно, как превратить бумаги в деньги.
ваш ответ, еще больше усилил проблему.
то, что можно найти класс не решает проблемы совершения сделки по рынку.
Например, как Вы пишите,
докупили в классе не полных лотов.
И при поиске класса нашли именно его
В нем Вы и выставите стоп  по рыночной цене.
А когда стоп сработает, то там либо будет мало ликвидности либо ее вообще нет.
И Ваш робот огребет по полной.
как Вам такой расклад?
Найдите, где правильно?, Вопрос к разработчикам QUIK
 
плечо - это то же самое что риск (почти тоже самое)
Найдите, где правильно?, Вопрос к разработчикам QUIK
 
Добрый день,

Вопрос к разработчикам:

Что считает терминал QUIK в таблице купить/продать  и что же считает функция getBuySellInfo .
-------------------  
Казалось бы должны считать одно и тоже.  
======================
Если -нет, то дайте ссылку на документацию.
===============  
Проверяем:
Берем данные из таблицы терминала купить продать
и по этим данным считаем функцией getBuySellInfo
===========
результат ниже:
Сумма - это произведение цены на количество.
---------------------------------
Отличия:
1) Все суммы различные  , даже там , где цена и количество одинаковые
Например
===========================================
28MGNT420171298 27171298 662
=============================================


2)  QUIK для всех акций считает как не маржинальные,
а формула очевидно  учитывает маржинальные
Но учитывает как то странно
Например:

==================================================
3AFLT38.147867300 047465761 760 5735.9
============================================

Риск 5.9, но для физ лиц не может быть более 5, а для юр. лиц может быть аж 8.
Откуда 5.9 ?
------------------------
Там, где риск=1, количество не совпадает в большинстве случаях.


Например:

================================================
20ISKJ85.23512299 2223518299 8041.0
================================================
QUIK    ПозицииgetBuySellInfo плечо
Код инструментаЦенаКупитьСуммаКупитьСуммаРиск
2AFKS13.82121709300 04062013855 2832.9
3AFLT38.147867300 047465761 760 5735.9
4AGRO1041288299 808288299 5201.0
5ALRS933226300 018189211 759 6535.9
6BANEP671445298 5951250843 7502.8
7BSPB63.124753300 0094753299 7721.0
8CHMF1077.4278299 51716271 753 9065.8
9CNTL10.228685292 58729394299 8191.0
10DSKY85.313515299 8653527299 7951.0
11ENRU0.5283567206299 655564219299 8261.0
12ETLN71.584177298 9904166299 7851.0
13FIVE1360220299 200223299 3781.0
14FLOT53.275632300 0175634299 7851.0
15GAZP242.81234299 61571101 728 8685.8
16GCHE3197.593297 36893297 1821.0
17GLTR384781299 904781299 8261.0
18HYDR0.7816381357298 06922032751 727 3685.8
19IRAO2.678112043300 051112206299 8261.0
20ISKJ85.23512299 2223518299 8041.0
21KAZT474.8631299 599639299 6911.0
22KMAZ101.32947298 5312959299 7471.0
23KZOSP21.5113801296 86013906299 8131.0
24LKOH5306.556297 1643261 733 9945.8
25LSRG540555299 700555299 7001.0
26MAGN43.346919299 8696893299 8111.0
27MDMG597500298 500500299 2501.0
28MGNT420171298 27171298 6621.0
29MOEX104.22872299 2622869299 8111.0
30MRKC0.26221131419296 6581135705299 8261.0
31MRKP0.17181731404297 4551744205299 8291.0
32MSNG1.78168568300 051168633299 8291.0
33MTLR102.22935299 9572956299 7681.0
34MTLRP195.81525298 5951524299 6951.0
35MTSS217.81376299 6931375299 7501.0
36MVID248.81205299 8041200299 6401.0
37NKNCP81.183696300 0413699299 7671.0
38NLMK161.91852299 8391852299 7281.0
39NMTP4.9460191297 34460510299 8271.0
40NVTK1288232298 816232299 4661.0
41OGKB0.4179718000300 052720558299 8241.0
42OKEY27.9310735299 82910738299 8051.0
43OZON1302.5230299 575232299 2801.0
44PIKK589.9508299 669510299 6251.0
45PLZL13479.522296 54922296 4721.0
46POGR12.6923644300 04223608299 8221.0
47POLY942.3318299 651318299 8101.0
48POSI1051.8285299 763285299 8201.0
49QIWI443.5675299 363674299 7281.0
50RASP389771299 919771299 8031.0
51RENI46.986386300 0146382299 8261.0
52RNFT103.42901299 9632910299 7301.0
53ROSN407737299 959736299 5521.0
54RSTI0.7177417842299 885417528299 8271.0
55RTKM62.354793298 8444833299 7911.0
56RTKMP62.654785299 78013640854 5462.8
57RUAL70.744238299 7964243299 7681.0
58RUGR25.211906300 03112260299 8061.0
59SBER145.862055299 742120761 760 5605.9
60SBERP153.341956299 9331949299 7371.0
61SELG46.866403300 0456434299 8241.0
62SFTL2891038299 9821037299 5891.0
63SGZH9.29832267300 01932347299 8241.0
64SIBN434.95689299 681692299 7051.0
65SMLT2709110297 990110299 2331.0
66SNGS26.1311483300 05111395299 8251.0
67SNGSP35.158535300 0058528299 8021.0
68TATN395.5758299 789758299 7891.0
69TATNP348861299 628861299 6281.0
70TCSG354284297 52884298 7461.0
71UPRO1.647181410298 782181935299 8291.0
72VKCO511.4586299 680581299 6801.0
73VTBR0.02283513140021300 05213225443299 8211.0
74YNDX2108.4142299 393142298 6541.0
доработка таблицы Позиции по инструментам
 
Цитата
s_mike@rambler.ru написал:
Вы должны сами решить, в каком классе из возможных продавать ваши бумаги. Кроме вас, никто об этом не знает.

вы сами писали в первом сообщении, что можете перебрать доступные торговому счету классы и найти там тот в котором можно продать ваши бумаги. Ну и делайте так, если все равно, как превратить бумаги в деньги.
я и решаю сам.
Но предложение мое направлено на то, чтобы не заниматься этим .
Никто не мешает поставить туда класс по которому куплена  первое количество, либо последнее количество,
А если кому-то хочется поплясать с бубном, так никто не запрещает.
 
Цена последней сделки
 
Цитата
Андрей написал:
Коллеги, подскажите, пожалуйста, как будет полностью выглядеть скрит Qlua для получения последней цены фьючерса? Заранее спасибо
local last = getParamEx(class,  sec, "last").param_value;
Задержка в выставлении заявок.
 
Цитата
Сергей написал:
Добрый день! Вчера, начиная с 18:20 не выставлялись заявки на срочном рынке, при этом терминал никаких ошибок не выдавал(но заявки в таблице заявок не появлялись), свечи обновлялись. sendTransaction ошибок не выдавал.
OnTransReply - тоже ничего не зафиксировал, как будто заявок и не было. В 18:44 попытался выйти в деньги и выставить заявку вручную - тоже не получилось. В 19:00 посыпались ошибки "невозможно выставить заявку т.к. сессия неактивна".
Брокер(Альфа-директ) сообщил, что у них всё работало штатно, проблема, вероятно, с моей стороны.
Что это могло быть, и как избежать подобных ситуаций.
выводите сообщения транзакций и колбеков в лог-файл.
сможете разобраться что и как было и почему.
Чудно считает CalcBuySell
 
Цитата
Старатель написал:
Цитата
nikolz написал:
Для тех,кто не понял либо не знает

Дисконты применяются только при  маржинальной  торговле.
 
 
nikolz, как обычно, сел в лужу  
как обычно, это вы из нее вылезли ,чтобы прокукарекать чушь.
------------------
Вы прочитайте внимательно.
речь идет о функции, которая при расчетах дает не то, что дает терминал КВИК.
А он считает без учета плечей,
----------------------
Про заемные средства Вы тоже не в теме.
----------------------
Если У вас нет никаких бумаг то нахрен Вам дисконты.
----------------------
Заемные средства считаются лишь с учетом плеча.
---------------------------
Торгую с маржинальными сделками давно.
=================
но в данной теме никакие плечи не учитываются,
а дисконты вообще применять можно лишь к тупой голове, так как акций для залога в данном расчете нет.
---------------------------
Тему уже засрали все, кому не лень, аА объяснить на числах, почему формула и КВИК дает разные результаты никто не может.
===================
Хотелось бы услышать автора этой формулы.
Просьба разработчиков рассказать , что эта формула считает и почему такое расхождение в результатах расчета КВИКа и этой формулы.
чтобы это значило?
 
Читаем таблицу, которую получает колбек OnDepoLimit
----------------
currentbal=0.0
locked_sell=0.0
locked_buy=0.0
wa_position_price=0.0
sec_code=CNTL
firmid=NC0011100000
client_code=1737
limit_kind=-3
locked_buy_value=9.96
awg_position_price=0.0
wa_price_currency=SUR
openbal=0.0
trdaccid=NL0011100043
locked_sell_value=-1e+48  -- Стоимость инструментов , заблокированных на продажу
currentlimit=0.0
openlimit=0.0
-----------------------
Вопрос к знатокам:
сколько стоят инструменты, заблокированные  на продажу?
доработка таблицы Позиции по инструментам
 
да, напомню, что в документации по квику сказано:
CLASSCODEКод класса, по которому выполняется транзакция, например TQBR. Обязательный  параметр
доработка таблицы Позиции по инструментам
 
Цитата
s_mike@rambler.ru написал:
Акции в вашем портфеле не привязаны к классам. Это кажется необычным, но это так. Акци. Лукойла теоретически вы можете купить в разных классах, при этом они будут учтены вместе одним количеством.

стандартный случай, когда вы купили тот же Лукойл в классе tqbr и потом догнались тем же лукойлом в классе неполных лотов
Вот именно.
Но Вы не поняли проблемы.
Вопрос в том, как выставить заявку на число акций в позиции, если класс вам не известен?
или вы можете выставить заявку без указания класса?
доработка таблицы Позиции по инструментам
 
Добрый день,
Предлагаю зарегистрировать следующее пожелание.
Добавить в таблицу "Позиции по инструментам"   class_code.
--------------------
Объясняю в чем проблема.
=================  
При написании скриптов
возникает необходимость получить параметры по инструментам, чтобы выставлять какие-либо заявки.
-------------
Для формирования заявки по позиции инструмента нужен класс этого инструмента,
а его в таблице позиций нет.
----------------
В результате, чтобы найти класс надо делать "танцы с бубном"
извлекать клиента
по нему находить торговый счет
по счету находить фирму и получать список торгуемых классов
потом в классах  искать тот, в каком есть данный инструмент.
-----------------
Напоминает наблюдение гланд через зад.
Занятие занятное , но бесполезное.
=================
Спасибо
Таких глюков ещё не было. брокер Открытие, В таблице отображаются не существующие заявки, которые нельзя не увидеть, не снять.
 
Цитата
Boris Litvinov написал:
https://youtu.be/UPzt5LC53E4
В таблице отображаются не существующие заявки, которые нельзя не увидеть, не снять
А короткая продажа на фьючерсе сейчас разрешена?
Чудно считает CalcBuySell
 
Для тех,кто не понял либо не знает, но что-то  советует.
--------------------  
Показываю, что считает QUIK
----------------
Квик считает именно так, как посчитал Я.
---------------------------
Сумма 300 тысяч.


Дисконты вообще не из той оперы.
----------------------------------
Удивляюсь, как Вы вообще торгуете,
если ничего не понимаете, но даете советы.
сильно тормозит quik
 
Цитата
Павел написал:
P.S.S. Торгую через Сбербанк, ВТБ, ПСБ. Картина везде одинаковая.

посмотрите в информационном окне задержку обмена с сервером.
сильно тормозит quik
 
Цитата
Павел написал:
P.S.S. Торгую через Сбербанк, ВТБ, ПСБ. Картина везде одинаковая.
посмотрите пинг до сервера брокера,
а также в диспетчере задач загрузку процессора и использование памяти.
и напишите результат.
Два Quik с одним брокером, Конфликты ?
 
Цитата
Александр П написал:
добрый день. подскажите, а возможно ли установить один квик и в нём уже переключаться между двумя-тремя брокерами?

PS: не нашел подходящей темы, поэтому пишу тут)
Интересно, как терминал будет создавать архивы под разных брокеров и защищенные каналы связи.
сейчас все брокеры используют двухфакторное соединение, Тоже прикольно посмотреть как QUIK с этим справится.
---------------
Проще откройте кучу квиков, но в одном окна и все индикаторы, а в других лишь стаканы торгуемых интсрументов.
и будет Вам счастье.
Программа не запускается, не хватает памяти под объекты
 
Цитата
Вячеслав написал:
При запуске приложения ошибка , пишет не хватает памяти под объекты, без которых приложение не может работать.  Памяти на компьютере свободной дост аточно, программ запущенных больше нет. Как это все можно исправить ?
Можно, надо показать, что Вы написали.
 
Не могу заставить работать функцию Subscribe_Level_II_Quotes()
 
Цитата
Вася написал:
function Subscribe(list) for i = 1, #list do    local classCode = list[1]    local secCode = list[2]    local x = Subscribe_Level_II_Quotes(class_code, sec_code)    while not x do     sleep(10)    end    Calculate(classCode, secCode)  endendВ ней я по очереди подписываюсь на котировки по каждому инструменту функцией Subscribe_Level_II_Quotes(). Дальше цикл (на всякий случай), чтобы убедиться, что функция вернула true. И дальше какое-то вычисление.Здесь у меня все работает нормально.Дальше я прохожусь циклом по этому же списку, чтобы отписаться от каждой котировки.function Unsubscribe(list)  for i = 1, 100 do    local classCode = list[1]    local secCode = list[2]    local x =Unsubscribe_Level_II_Quotes(class_code, sec_code)    while not x do      sleep(10)    end  endendЗдесь на первом же элементе из списка я застреваю в цикле while. Если цикл убрать, то функция отрабатывает, а отписка не происходит.Подскажите как справиться с этой проблемой. Нужно сначала подписаться на инструменты, потом отписаться от них.Версия квика 9.2.3.15. Может дело не в моих кривых руках, а в версии?
если актуально, то ловите  решение:
--------------------------
фрагмент скрипта  
Код
while Subscribe_Level_II_Quotes(cl,se)==false do sleep(5) end  --подписываемся на стакан
local z=IsSubscribed_Level_II_Quotes (cl,se);                          --проверяем подписку
Log:write(tostring(cl)..","..tostring(se)..",z="..tostring(z).."\n");   --выводим в файл результат
while Unsubscribe_Level_II_Quotes(cl,se)==false do  sleep(5) end   -- отписываемся от стакана
z=IsSubscribed_Level_II_Quotes (cl,se);                               --проверяем отписку        
Log:write(tostring(cl)..","..tostring(se)..",z="..tostring(z).."\n");   --выводим в лог файл результат
результат:
---------------------------
QJSIM,VTBR,z=true
QJSIM,VTBR,z=false
QJSIM,ABRD,z=true
QJSIM,ABRD,z=false
QJSIM,CHMF,z=true
QJSIM,CHMF,z=false
QJSIM,AFKS,z=true
QJSIM,AFKS,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,GAZP,z=true
QJSIM,GAZP,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFLT,z=true
QJSIM,AFLT,z=false
QJSIM,AFKS,z=true
QJSIM,AFKS,z=false
QJSIM,AFKS,z=true
QJSIM,AFKS,z=false
QJSIM,AFKS,z=true
QJSIM,AFKS,z=false
Чудно считает CalcBuySell
 
Что думают по этому поводу разработчики этой функции?
---------------------------
Хотелось бы услышать начальника транспортного цеха.
Чудно считает CalcBuySell
 
Цитата
Дмитрий написал:
nikolz,а что не так? Бумаги маржинальные, соответственно, и покупка больше, чем на 300 тыс.
Откройте таблицу Купить/Продать и сравните
На учебном сервере плечо 2.
Т е максимум 600 тысяч, но не 1 млн.759тыс982.
Даже, если предположить, что плечо максимальное (для квалифицированных инвесторов, которым я являюсь, плечо 5 ) , то все равно не выходит каменная чаша.
Чудно считает CalcBuySell
 
Добрый день,
--------------
Вопрос к знатокам:
-----------------------------
Вычисляю функцией CalcBuySell сколько акций можно купить.

фрагмент кода:
local qty1,comis1=CalcBuySell(clas, sec,"1737","NL0011100043",price, true,false);
-------------------------
Поясняю, что ожидаю:
------------------
На учебном сервере денежных средств 300 тысяч рублей.
----------------
Данная функция должна считать комиссию и число лотов для покупки по указанной цене.
Полагаю, что коммиссия должна быть примерно одинаковой (сумма денег одна)
А число акций умноженное на цену одной и на количество их в лоте должна составлять примерно 300 тыс рублей
-------------------
Для проверки, считаю количество и комиссию по формуле.
--------------------------
В результате обозначено:
-------------------
qt1,comis1 - расчет функции
qt,comis -  расчет формулы
m - сумма денег исходная
m1- расчет суммы денег по результатам функции
-----------------------
результат вычисления:
=============
акции, для которых результат функции и по формуле примерно одинаковый:
------------------
TATNP,m=299983, lotsize=1., qty1=937, m1=299881, qty=935, comis1=229.26, comis=749, price=319.8
ROSN,m=299983, lotsize=1., qty1=844, m1=299887, qty=842, comis1=225.54, comis=749, price=355.05
-------------
"чудеса в решете":
--------------------
CHMF,m=299983, lotsize=1., qty1=1530, m1=1759940, qty=260, comis1=746.54, comis=749, price=1149.8
----------
при цене 1150 рублей
по формуле можно купить 260 акций, что вполне похоже на правду.
-----------------------------
функция считает, что можно купить 1530 акций,
при этом комиссия примерно одинаковая, что указывает что затрачено примено 300 тыс рубг
----------------------
следующее чудо:
SBER,m=299983, lotsize=10., qty1=1349, m1=1759982, qty=229, comis1=751.81, comis=749, price=130.41
-----------
Сбербанк  акция 130 рублей по формуле можно купить 229 лотов или 2290 акций, что правда.
функция считает, что можно купить 1349 лотов, на сумму 1млн759 тыс 982 рублей
Величина комиссии указывает что ее считали с  суммы 300 тысяч.
---------------------
еще один прикол:
AFLT,m=299983, lotsize=10., qty1=6567, m1=1760716, qty=1116, comis1=760.2, comis=749, price=26.8
==================  
Кто сие может объяснить?
Спасибо
не все то золото, что блестит
 
Цитата
Старатель написал:
Цитата
nikolz написал:
вычисления без этой функции можно ускорить, если запомнить размер лота и не извлекать его из хранилища
а также не извлекать размер свободных денежных средств а рассчитывать их при совершении сделки и иногда сверять с портфелем.
Чтобы поделить количество свободных денежных средств на цену действительно не нужна никакая функция.
Но существует такая вещь, как маржинальная торговля. Есть бумаги разного типа: маржинальные/не маржинальные, принимаемые и не принимаемые в в обеспечение маржинального кредита и пр.
Почитайте, узнаете много интересного.
Я это знаю, но торгую лишь ликвидом, которые принимают. Поэтому такой проблемы нет.  
При расчете количества учитываю плечо.
--------------------
Обратил внимание, что эта функция в некоторых случаях дает завышенные результаты.
Как это объяснить не знаю.
не все то золото, что блестит
 
Цитата
Старатель написал:
Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
вычисления без этой функции можно ускорить, если запомнить размер лота и не извлекать его из хранилища
а также не извлекать размер свободных денежных средств а рассчитывать их при совершении сделки и иногда сверять с портфелем.
-----------------  
результат теста  для этого варианта позволяет  укорить рассчеты примерно в 10..20  раз.
AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)39.7
DSKY,money=299983,lot=10,qty=399,price=74.88,comis=749,,time(мкс)38.8
PHOR,money=299983,lot=1,qty=43,price=6900.0,comis=749,,time(мкс)12.7
SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)38.7
AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)20.3
LKOH,money=299983,lot=1,qty=56,price=5332.5,comis=749,,time(мкс)17.3
RUAL,money=299983,lot=10,qty=449,price=66.5,comis=749,,time(мкс)17.5
TATN,money=299983,lot=1,qty=706,price=423.5,comis=749,,time(мкс)14.5
AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)14.8
LKOH,money=299983,lot=1,qty=56,price=5320.5,comis=749,,time(мкс)13.7
SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)20.9
AFLT,money=299983,lot=10,qty=1136,price=26.32,comis=749,,time(мкс)84.9
LKOH,money=299983,lot=1,qty=56,price=5320.5,comis=749,,time(мкс)81.3
ROSN,money=299983,lot=1,qty=831,price=360.0,comis=749,,time(мкс)22.5
SBER,money=299983,lot=10,qty=227,price=131.43,comis=749,,time(мкс)27.2
не все то золото, что блестит
 
Цитата
Старатель написал:
Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
если  вместо CalcBuySell  считать по параметрам портфеля и инструмента, то получится примерно в 2 раза быстрее.
результат теста:
AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)213.1
GAZP,money=299983,lot=10,qty=124,price=240.2,comis=749,,time(мкс)174.3
MOEX,money=299983,lot=10,qty=309,price=96.68,comis=749,,time(мкс)124.6
SBER,money=299983,lot=10,qty=227,price=131.35,comis=749,,time(мкс)171.2
AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)384.6
GAZP,money=299983,lot=10,qty=124,price=240.08,comis=749,,time(мкс)144.3
NVTK,money=299983,lot=1,qty=221,price=1349.0,comis=749,,time(мкс)139.0
ROSN,money=299983,lot=1,qty=832,price=359.5,comis=749,,time(мкс)101.5
SBER,money=299983,lot=10,qty=227,price=131.35,comis=749,,time(мкс)136.4
AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)294.6
LKOH,money=299983,lot=1,qty=55,price=5370.0,comis=749,,time(мкс)195.8
MOEX,money=299983,lot=10,qty=309,price=96.68,comis=749,,time(мкс)198.0
SBER,money=299983,lot=10,qty=227,price=131.36,comis=749,,time(мкс)186.5
AFLT,money=299983,lot=10,qty=1138,price=26.28,comis=749,,time(мкс)239.0
IRAO,money=299983,lot=100,qty=1306,price=2.2895,comis=749,,time(мкс)116.6
MAGN,money=299983,lot=10,qty=650,price=46.0,comis=749,,time(мкс)150.9
SBER,money=299983,lot=10,qty=227,price=131.4,comis=749,,time(мкс)117.3
не все то золото, что блестит
 
есть еще функция

TABLE getBuySellInfo (STRING firm_id, STRING client_code, STRING  class_code, STRING sec_code, NUMBER price)

она считает купить и продать

вот результат  теста:

AFLT,buy_q=69184,sel_g==68444,price=25.44,,time(мкс)837.9

NLMK,buy_q=1684,sel_g==0,price=178.0,,time(мкс)487.5

AFLT,buy_q=69184,sel_g==68444,price=25.44,,time(мкс)483.4

AFKS,buy_q=66537,sel_g==66537,price=12.86,,time(мкс)684.2

SBER,buy_q=13398,sel_g==13384,price=131.37,,time(мкс)511.0

AFKS,buy_q=66537,sel_g==66358,price=12.86,,time(мкс)596.0

PHOR,buy_q=43,sel_g==0,price=6895.0,,time(мкс)474.2

AFLT,buy_q=69184,sel_g==68444,price=25.44,,time(мкс)447.3

VTBR,buy_q=17060775,sel_g==0,price=0.01757,,time(мкс)482.7

AFLT,buy_q=69184,sel_g==68444,price=25.44,,time(мкс)657.4

VTBR,buy_q=17065631,sel_g==0,price=0.017565,,time(мкс)348.6

AFLT,buy_q=69184,sel_g==68444,price=25.44,,time(мкс)415.5

не все то золото, что блестит
 
Цитата
Старатель написал:
Теперь напишите функцию CalcBuySell, чтобы время её выполнения составляло единицы (на худой конец - десятки) микросекунд, а то у Арки не получается.
сделал тест (фрагмент)
Код
local is_buy=true;
local is_market=true;
nklib.startA();
local qty,comis=CalcBuySell(clas, sec,"1737","NL0011100043", 0, is_buy, is_market);
x1=nklib.stopA();
Log:write(tostring(sec)..",qty="..tostring(qty)..",comis="..tostring(comis)..","..",time(мкс)"..tostring(0.1*x1).."\n");Log:flush()

на демо сервере получилось:  
время расчета не более 0.0005 сек.
т е не более 500 микросекунд при расчете по рынку.
-----------------------------------------
AFLT,qty=4309,comis=487.23,,time(мкс)412.3
MOEX,qty=277,comis=203.15,,time(мкс)259.2
SBER,qty=876,comis=490.81,,time(мкс)333.9
AFLT,qty=4309,comis=487.23,,time(мкс)542.0
ROSN,qty=786,comis=207.33,,time(мкс)468.0
AFLT,qty=4309,comis=487.23,,time(мкс)459.4
AFLT,qty=4309,comis=487.23,,time(мкс)418.2
ROSN,qty=786,comis=207.33,,time(мкс)321.3
AFLT,qty=4309,comis=487.23,,time(мкс)344.7
AFLT,qty=4309,comis=487.23,,time(мкс)314.1
NVTK,qty=206,comis=204.82,,time(мкс)206.1
TATN,qty=648,comis=208.2,,time(мкс)188.9
AFLT,qty=4309,comis=487.23,,time(мкс)240.8
AFLT,qty=4309,comis=487.23,,time(мкс)515.5
LKOH,qty=210,comis=483.08,,time(мкс)434.5
AFLT,qty=4309,comis=487.23,,time(мкс)435.4
VTBR,qty=1558,comis=207.15,,time(мкс)562.9
AFKS,qty=528,comis=394.79,,time(мкс)296.8
MGNT,qty=80,comis=203.1,,time(мкс)206.1
ROSN,qty=786,comis=207.33,,time(мкс)204.5
AFLT,qty=4309,comis=487.23,,time(мкс)237.7
AFKS,qty=528,comis=394.79,,time(мкс)364.7
LKOH,qty=210,comis=483.08,,time(мкс)290.4
ROSN,qty=786,comis=207.33,,time(мкс)264.4
AFLT,qty=4309,comis=487.23,,time(мкс)288.6
sleep
 
Цитата
Старатель написал:
sleep с отрицательным числом, видимо длится бесконечно долго.
    Скрытый текст       То, что в sleep попало отрицательное число - моя ошибка. Но реализация слипа - ошибка ваша.
Читаем документацию  у майкрософт на функцию sleep
Значение INFINITE указывает, что время ожидания приостановки не должно истекать.
INFINITE =-1
предположу, что любое отрицательное число даст тоже самое
т е время ожидания - вечность.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
 
сделал тестовый скрипт:
Код
name="main";
paths = "D:/QUIK_SCRIPT/"

function cb(i)
 O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i);   V=ds:V(i) Ti=ds:T(i)
   Log:write("ds "..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."\n");Log:flush()
end


function cb1(i)
 O=ds1:O(i); H=ds1:H(i); L=ds1:L(i); C=ds1:C(i);   V=ds1:V(i) Ti=ds1:T(i)
   Log:write("ds1 "..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."\n");Log:flush()
end

function main()
  while true do
   sleep(10);
      if ds==nil then  ds=CreateDataSource("QJSIM","SBER",INTERVAL_M1)
      Log:write("ds="..tostring(ds).."\n");Log:flush()
      ds: SetUpdateCallback (cb)
      end

      if ds1==nil then  ds1=CreateDataSource("QJSIM","SBER",INTERVAL_M1,"Last")
      Log:write("ds1="..tostring(ds1).."\n");Log:flush()
      ds1: SetUpdateCallback (cb1)
      end

   if ds~=nil    then local count=ds:Size();
      local i=count;   O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i);   V=ds:V(i) Ti=ds:T(i)
      Log:write("ds:count="..count..","..tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(i).."\n");Log:flush()
   end

   if ds1~=nil then local count=ds1:Size();
      local i=count O=ds1:O(i); H=ds1:H(i); L=ds1:L(i); C=ds1:C(i);   V=ds1:V(i) Ti=ds1:T(i)    i=i+1;
      Log:write("ds1:coint="..count..","..O..","..H..","..L..","..C.."/"..i.."\n");Log:flush()
   end
 end
end

--------------
function OnInit(pfile)
   Log=io.open(paths..name..".log","w")
end
В тесте открываются два источника:
ds - это свечи обычные
d1- это свечи "Last"
тест пускаем на демо сервере.
-----------------
Результаты ниже.
Поясню что там.
сначала смотрим ds и ds1 - они есть значит подписались
------------------
потом смотрим результат
обычные свечи - есть
а свечи last - нет
----------------------------
ds=table: 00000119201F8290
ds1=table: 00000119201F8BD0
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
ds1:coint=0,0.0,0.0,0.0,0.0/1
ds:count=823,132.0,132.0,132.0,132.0/823
------------------------  
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
 
Цитата
s_mike@rambler.ru написал:
nikolz,

терминал на графике может нарисовать как свечи котировок, так и свечи параметров. Для получения свечей параметров необходимо в качестве источника указать один из параметров инструментов при построении графика. Вы можете это сами попробовать и (наверное) вы сможете это сделать.

функция createdatasource при указании названия параметра инструмента выводит не свечи котировок инструмента, а свечи истории этого параметра.

формат возвращаемых данных тот же самый и вы его правильно скопировали из документации.

таким образом, вы можете получать историю параметров в том же самом виде и формате, как и историю котировок.

спорить не стоит, но если потребуется помощь, спрашивайте.
правильно Вас понял, что без рисования принять параметры невозможно?
--------------  
и еще вопрос.  
При прорисовке параметров на графиках КВИК  создает файл хранения истории данного параметра. Как правило это огромный файл на диске. Верно?
не все то золото, что блестит
 
К вопросу о скорости передачи по DDE
----------------------
Переписал сервер DDE для LUA 5.4.
----------------------  
Время передачи обезличенных сделок 16385 сделок по 8 параметров составляет 750 мкс.
===============
Переписал программу обращения к источнику данных ds.   Работает на 30% быстрее, чем исходная QLUA, но не быстрее DDE.
------------------------------
Время передачи 6 параметров свечи составляет 3 мкс,
=====================
Время передачи по  DDE 6 сделок по 8 параметров  составляет 0.3 мкс.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
 
смотрим документацию:
Функция CreateDataSource возвращает таблицу Lua с параметрами:

т е в таблице нет каких либо других функций. Возможно функция возвращает параметры, но читать их очевидно надо этими функциями.
Попытка вызвать с параметром Last на демо сервере дает нули, а свечи выдает нормально.
ПараметрТипОписание
SetUpdateCallbackfunctionПозволяет задать пользователю функцию обратного вызова для обработки  изменившихся свечек
O

function

Получить значение Open для указанной свечи
HfunctionПолучить значение High для указанной свечи
LfunctionПолучить значение Low для указанной свечи
Cfunction

Получить значение Close для указанной свечи

V

function

Получить значение Volume для указанной свечи
TfunctionПолучить значение Time для указанной свечи
SizefunctionВозвращает текущий размер (количество свечек в источнике данных)
Closefunction

Удаляет источник данных, отписывается от получения данных

SetEmptyCallbackfunction

Позволяет получать данные с сервера без указания функции обратного вызова  

Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
 
Цитата
s_mike@rambler.ru написал:
У функции createdatasource есть последний параметр.

если вы его не указываете, функция возвращает свечи котировок инструмента. Если укажете ("bid" например), то будут свечи истории параметров инструментов.

таблица обезличенных сделок тут не при чем
Вопрос был, как прочитать то, что получили.
Пример приведите.
Значения param из функции CreateDataSource, Получение значений param из функции CreateDataSource
 
Цитата
BENDER написал:
Здравствуйте. Только начал изучать LUA. Есть функция CreateDataSource (class_code, sec_code, interval , param);
В описании говорится param      - (STRING) необязательный параметр. Если параметр не задан, то заказываются данные на основании таблицы всех сделок.

Есть список param для акций
"LOTSIZE"            -- Размер лота
"BID"                -- Лучшая цена спроса
"BIDDEPTH"           -- Спрос по лучшей цене
"BIDDEPTHT"          -- Суммарный спрос
"NUMBIDS"            -- Количество заявок на покупку
"OFFER"              -- Лучшая цена предложения
"OFFERDEPTH"         -- Предложение по лучшей цене
"OFFERDEPTHT"        -- Суммарное предложение
"NUMOFFERS"          -- Количество заявок на продажу
"OPEN"               -- Цена открытия
"HIGH"               -- Максимальная цена сделки
"LOW"                -- Минимальная цена сделки
"LAST"               -- Цена последней сделки
"CHANGE"             -- Разница цены последней
это неполный список.

Пишу простейшую функцию по извлечению данных
Код
  ds  =   CreateDataSource ( "TQBR" ,  "SBER" , INTERVAL_TICK)
 sleep ( 1000 )
 local   Size   =  ds: Size ()
  
данные из секции Open, High, Low,Close,Time получаю без проблем. Даже миллисекунды выдаёт.  
Код
   for  i  =   1 ,  Size ,  1   do  
ds:T(i).ms
 end ;  
Но вот как мне из ds получить значения параметров для акций, к примеру "LAST"  ?
функция  CreateDataSource посволяет получить данные либо свечей либо из таблицы обезличенных сделок.
Она создает таблицу  ds функция  CИ:
T,function:
C,function:
H,function:
V,function:
SetEmptyCallback,function:
_DataSource,_dataline_data_metatablegc:
L,function:
Size,function:
SetUpdateCallback,function:
Close,function:
O,function:
-------------------------
Поэтому , читать данные Вы можете лишь обращаясь к этим функциям, вне зависимости от заказанного параметра.
===============  
В таблице обезличенных сделок нет параметра
"BID" -- Лучшая цена спроса
"BIDDEPTH" -- Спрос по лучшей цене
"BIDDEPTHT" -- Суммарный спрос
"NUMBIDS" -- Количество заявок на покупку
"OFFER" -- Лучшая цена предложения
"OFFERDEPTH" -- Предложение по лучшей цене
"OFFERDEPTHT" -- Суммарное предложение
"NUMOFFERS" -- Количество заявок на продажу
поэтому их Вы этой функцией не получите.
------------------------
Параметр Last - это close последней свечи.
лишний элемент или так задумано?
 
Делаем список фирм и список счетов
Код
local s=""; for i=0,getNumberOf("firms")-1 do local x=getItem("firms",i); s=s.." "..x.firmid;   end;    message(s);
s=""  for i=0,getNumberOf("trade_accounts")-1 do local x=getItem("trade_accounts",i);   s=s.." "..x.firmid.."/"..x.trdaccid; end   message(s);
результат:
SMS_FIRM NC0014500000 MB1000100000 ALGO
NC0011100000/NL0011100043 SPBFUT000000/SPBFUT001qm
======================
Вопросы к разработчикам:
------------------------
1) Почему в таблице фирм отсутствуют фирмы, которые есть в таблице торговых счетов?
--------------------------------
2) Если так задумано, то где об этом написано.
-------------------
3) Зачем в таблице фирм указаны фирмы,у которых нет торговых счетов?
Где об этом написано .
------------------------
Спасибо
лишний элемент или так задумано?
 
Добрый день
На учебном сервере
версия 9.4
l-------------------
читаем код клиента
Код
message("всего=.. getNumberOf("client_codes") );
for i=0,getNumberOf("client_codes")-1 do
local x=getItem("client_codes",i);
message("i="..i..",cod="..tostring(x) );
end
получаем результат:
всего=2
i=0,cod=1737
i=1,cod=  
--------------------
если я правильно понял, то должен быть всего один код клиента.
и  действительно  код i=0,cod= 1737
но почему-то их два, i=1, cod=пусто.
------------------------
Что не так я делаю?
Какой в этом пустом коде тайный смысл?
=======================================
Огласите весь список, п..жалуста, в каких еще таблицах так сделано.
Спасибо.
Самое слабое место QLUA
 
Цитата
s_mike@rambler.ru написал:
Nikolz,  используйте классы в луа стиле. Все получится само собой.  

Полагаю Вы либо не поняли, либо ошибаетесь.
---------------
поясню на примере.
В функции main делаем цикл чтения свечей и замеряем время .
примерно так:
Код
      nklib.startA();
      while count>=i do
      nklib.startB();
       O=ds:O(i); H=ds:H(i); L=ds:L(i); C=ds:C(i);   V=ds:V(i) Ti=ds:T(i)
      x=nklib.stopB();
      i=i+1;
      m1=m1+1;
      tx[i]={O,H,L,C,V,Ti}
      end
   x2=nklib.stopA();
Log:write(tostring(O)..","..tostring(H)..","..tostring(L)..","..tostring(C).."/"..tostring(m1)..","..tostring(0.1*x2).." "..tsoc[m].."\n");Log:flush()               --
В колбеке oпParam ставим цикл записи данных в таблицу
примерно так:
Код
function OnParam (c,s)  for m=1,10000 do t_[14]={c,s}; end
ncb=14; ESet(event);  end -- изменение текущих параметров
После этого делаем три пуска программы.
1. без цикла 2. с циклом до 10 и 3. с циклом до 10000
-------------------  
Что мы ожидаем получить:
Если колбеки не влияют на функцию main то время получения свечей должно быть примерно одинаковым для одинакового числа свечей.
=====================  
Вот что получили
1.136.34,136.34,136.31,136.31/828,2511.1 SBER
2.136.3,136.3,136.29,136.29/829,6201.2 GAZP
3.136.27,136.27,136.26,136.26/830,27710.4 GAZP
=============  
Как видно время работы колбека влияет на время потока MAIN .  
без  цикла = 2511
с циклом 10 = 6200
с циклом 10000= 27710
==================
Никакие пляски с бубном в написании классов Вам ничего не дадут.
так как классы это всего-навсего массив в котором есть указатели на функции и данные.
==============  
а данная проблема связана с блокировкой  глобального стека виртуальной машины луа.
об этом я и рассказал ранее в этой теме.
Самое слабое место QLUA
 
Известно, что колбеки в QLUA  блокируют основной поток терминала QUIK.
Решение изначально было спорное, но в ту пору попытка переубедить разработчиков в их ошибке была безрезультатна.
-----------------------
Как мера, якобы устраняющая данную проблему, по задумке разработчика QLUA  был введен еще один поток для  функции main.
-----------------------
Поэтому Всем известна рекомендация разработчиков делать минимальные вычисления в колбеках и выполнять основные расчеты в функции main.
==================
Однако, это кажущееся ускорение вычислений легко можно свести к нулю, что уверен и делается большинством  программистов роботов на QLUA.
===================
Рассказываю в чем фишка.
================
Экспериментируя с реализацией пула потоков,  обнаружил, что потоки, использующие область глобальных переменных,
а также функция main  на самом деле не работают независимо от колбеков, а тоже останавливаются на время их работы.
Очевидно, это связано с блокировкой области глобальных переменных при работе колбеков.
====================
В итоге, если у Вас в функции main используются глобальные переменные, а это, в том числе , источники данных,
то параллельная работа функции main не получится.
------------------
В итоге поток Main будет останавливаться вместе с основным потоком терминала и Ваш робот на QLUA будет фактически
работать в одном потоке с остановками на каждом колбеке.
==========================
Прикольно,  но есть решение, которое позволяет:
во-первых, полностью убрать из QLUA эти монстры-колбеки, останавливающие основной поток и функцию main в указанных выше случаях.
во-вторых, не останавливать основной поток  вообще для передачи данных в другие потоки, которых может быть любое число.
=========================
я сомневаюсь, что разработчики когда-нибудь решат это сделать, так как им платят брокеры, а брокерам это до лампочки.
----------------------------
Поэтому могу лишь рекомендовать писателям роботов свести к минимуму использование глобальных переменных в функции main.
Страницы: Пред. 1 ... 33 34 35 36 37 38 39 40 41 42 43 ... 72 След.
Наверх