function CntTradesSellPosition (zCLASSCODE,zSECCODE)
cnt = 0
local TableName = 'trades'
local rows_total = getNumberOf (TableName)
for r = rows_total - 1 , 0 , - 1 do
local table_row = getItem (TableName,r)
--message(tostring(table_row.flags));stop()
if table_row.class_code = = zCLASSCODE and table_row.sec_code = = zSECCODE and table_row.flags = = 36 then -- сделка продажа
cnt = cnt + 1
end
end
return cnt
end
Пишу как самоучка, но мне как-то сложно (невозможно) вытаскивать из битовых флагов эти нужные значения, которые там закодированы в двоичной системе. В частности мне нужно определить только тип заявки ордера Buy или Sell.
Я так и не нашёл нигде пример алгоритма получения этих битовых значений, поэтому беру 10-тичные числа, но это кривовато, ибо по причине изменения других свойств и числа будут другие. Вот я методом научного тыка определил коды для продаж и второй флаг (бит) принимает разные значения: 64 = 1000000 36 = 100100 28 = 11100 1048604 = 100000000000000011100 - Продажа от стоплосса
Прошу, измените мой код, чтобы он нормально обрабатывал эти битовые флаги.
Отвечу, если кому-то еще актуально. Есть отдельный набор функций "Функции для работы с битовыми масками в структурах данных". В документации по QLUA, обычно идет в комплекте с терминалом. Для проверки статуса/состояния нужного флага, используется функция "BOOLEAN bit.test(NUMBER х, NUMBER n)". И код приобретает простой вид:
function CntTradesSellPosition(zCLASSCODE,zSECCODE)cnt=0 local TableName='trades' local rows_total = getNumberOf(TableName) for r=rows_total-1, 0, -1 do local table_row=getItem(TableName,r) --message(tostring(table_row.flags));stop() if table_row.class_code==zCLASSCODE and table_row.sec_code==zSECCODE and bit.test(table_row.flags, 2) then -- сделка продажа cnt=cnt+1 end end return cnt end
Если позиция LONG, то СТОП призван минимизировать убыток, следовательно на продажу.
Если рассматривается цена последней сделки, или по сути сделки по сигнальной цене, то с этого момента все очевидно. а) если сделок по сигнальной цене 68,99 не было, то СТОП не сработает. б) если была хотя бы одна сделка, даже с минимальным объемом в 1 лот, то СТОП сработает и будет продажа.
Какую из этих трех цен сервер QUIK учитывает при анализе СТОПов, какова его СТОП цена в данный момент, с которой он сравнивает заявки клиентов?
Если СТОП (позиция LONG) выставлен по цене 68,99, и с текущей позиции цена пойдет вверх, а) сделок по 68,99 не было, что сделает сервер QUIK? б) сделки по 68,99 были, но уровень не был пробит, что сделает сервер QUIK?
Много обсуждений по СТОП-заявкам, цена выше или ниже, что и как выставляется. Но нет конкретики в части работы самого сервера QUIK.
СТОП-заявка это услуга брокера, а не биржи. Биржа по простому обрабатывает очередь ордеров.
ВОПРОС:
Какой показатель цены, для сервера QUIK, является СТОП-ценой. Возьмем для примера цену фьючерса BR-xx. В каждый момент времени, с учетом спреда, существует 3-и цены:
69,01 <= BUY лучшая цена для покупки
69,00 <=== золотая середина
59,99 <= SELL лучшая цена для продажи
Какую из этих трех цен сервер QUIK учитывает при анализе СТОПов, какова его СТОП цена в данный момент, с которой он сравнивает заявки клиентов?
Если СТОП (позиция LONG) выставлен по цене 59,99, и с текущей позиции цена пойдет вверх, а) сделок по 59,99 не было, что сделает сервер QUIK? б) сделки по 59,99 были, но уровень не был пробит, что сделает сервер QUIK?
Так и не получил ответ на поставленный вопрос. В чем я был не точен в формулировке?
Раздел "Список функций, доступных из скрипта индикатора" перечисляет функции терминала, которые можно вызывать для получения информации об инструменте и прочих статусах. Этих функций более чем достаточно. В их перечень входят функции для работы с таблицами getNumberOf и getItem, т.к. все данные в QUIK хранятся в таблицах.
ВОПРОС в том, почему не получается создать свою (пользовательскую) таблицу в скрипте индикатора? Прямых противоречий, в документации, для вызова функции AllocTable() нет. Эта функция скорей имеет отношение к интерфейсу (GUI), а не к системным таблицам. Какая разница как создана таблица терминалом или пользователем? Как создать свою (пользовательскую) таблицу в отдельном окне на вкладке графика, что бы данные в ней менял скрипт индикатора?
Добрый день. Выполняется выгрузка обезличенных сделок в БД PgSQL (ODBC). Структура таблицы вывода: Num (Type = numeric) Date (Type = date) Time (Type = time without time zone) Security (Type = text) Class (Type = text) Price (Type= numeric)
При выполнении настроек драйвера и модуля ODBC, никаких ошибок не выдается. В момент выгрузки выдается ошибка:
ОПЕРАТОР: INS ERT IN TO MarketData.IndexData.MarketTradeIndx (Num, Date, Time, Security, ClassCode, Price) VALUES (42858.000000, '03.11.2017', '11:16:48', 'RTSI', 'INDX', 1124.140000) ОШИБКА: ссылки между базами не реализованы: "marketdata.indexdata.markettradeindx" (символ 13)
Эта ошибка полностью идентична и в файле quik_odbc.log, и в лог файле на сервере БД и при перехвате данных Wireshark.
Исследование проблемы показало, что если в консоле БД, выдать эту же команду то ошибка сохраняется по причине не правильности формата.
Но запрос вида:
MarketData=# INS ERT IN TO "MarketData"."IndexData"."MarketTradeIndx" ("Num", "Date", "Time", "Security", "ClassCode", "Price") VALUES (42858.000000, '03.11.2017', '11:16:48', 'RTSI', 'INDX', 1124.140000); INSERT 0 1 MarketData=#
ВЫПОЛНЯЕТСЯ.
Какие необходимо выполнить настройки терминала QUIK или ODBC драйвера, что бы имена полей БД и имя самой БД заключались в кавычки?