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

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

Страницы: Пред. 1 ... 3 4 5 6 7 8 9 10 11 12 13 ... 66 След.
getDepoEx, Ошибки при выполнении функции
 
Цитата
Kolossi написал:
Возможно это баг разработчиков. Но я не могу придумать как это обойти, кроме как останавливать скрипт на время обновления данных. Подскажите если кого озарит
Почему именно баг? Вы же сами сказали что данных нет. А раз данных нет то и возвращать естественно нечего.
И даже в документации про это сказано:
Цитата
В случае ошибки функция возвращает «nil».
остается только добавить проверку на nil
QLUA, вопросы начинающих.
 
Цитата
Анатолий написал:
То есть получается что при выполнении сделки функция ontrade ( )  у меня выполняется трижды, либо ее тело трижды, странно
Здравствуйте,
Это нормально, т.к. сервер может обновлять некоторые параметры сделки, он присылает ее несколько раз.
Тоже самое с заявками.
в чем ошибка в коде?, просмотр таблицы заявок
 
Андрей,
Так нельзя делать.
Сделайте так:
Код
   PrintDbgStr(" Просмотр полей таблицы заявок")   
   params = {"order_num", "flags", "sec_code"}
   for i=0,getNumberOf('orders')-1 do 
      PrintDbgStr(i)
      local order = getItem('orders', i); 
      for key,v in ipairs(params) do
         PrintDbgStr(v .. " = " .. order.[v])
      end
   end
Где посмотреть описание на флаг в транзакции?
 
Цитата
Андрей написал:
Цитата
Андрей написал:
И еще почему то номер trans.trans_id 2147483647 не совпадает с тем , который я отправлял в запросе (['TRANS_ID'] = '2412181506')
Это я кажется понял, при покупке выходит не мой номер ид транзакции, а того кто продавал, а я у него купил

не правильно.
Вы видите другой номер потому что указали значение больше чем позволяет тип данных integer
Согласно документации, TRANS_ID нельзя указывать больше чем 2 147 483 647.

Цитата
Андрей написал:
выход код 1001000000000000000001 - что он обозначает, есть где то битовые значения этого флага. Получаю данные из следующего кода

Цитата
Возможные значения:
«1» – отправлена с помощью файла импорта;
«512» – отправлена с помощью QPILE;
«32768» – отправлена с помощью Trans2Quik;
«131072» – на продажу;
«262144» – отправлена с помощью LUA;
«524288» – отправлена с помощью API клиентского места;
«1048576» – служебная;
«2097152» – на ввод заявки

К сожалению эта информация не попала в документацию, приносим извинения.
Документацию обязательно поправим.
Таблица всех сделок
 
Цитата
Дмитрий написал:
А как тогда понимать вот эти ваши слова, которые процитированы ниже?
Перечитал еще раз, теперь понятно в чем вопрос.

При дозаказе, данные в хранилище терминала действителньо могут находиться не в том месте.
Т.к. хранилище наполняется в конец файла.
Но в QUIK в визуальной таблице данные будут отсортированы по индексу записи.
От сюда и ответ на вопрос, данные сохраняются в файл по индексу записи.
Таблица всех сделок
 
Цитата
Дмитрий написал:
А как тогда понимать вот эти ваши слова, которые процитированы ниже?
А что не так? не вижу противоречий.
В Визуальной таблице данные могут быть в любом порядке, как отсортируете или отфильтруете.
Но в хранилище терминала эти данные не поменяют своего места.
Как обратиться к таблице с транзакциями?
 
Цитата
Андрей написал:
а к таблице транзакций как можно обратиться?
Такой возможности нет. Но можно получить ответ на транзакцию в событии OnTransReply
Цитата
Андрей написал:
и к стакану котировок?
Для этого есть отдельная функция getQuoteLevel2
Как исправить ошибку транзакции?, Ошибка отправки транзакции
 
Цитата
Андрей написал:
или надо так?
Код
  [ 'ACCOUNT' ]    =   '' ,      

параметр был указан правильно ['ACCOUNT'] = 'SPBFUT000pf',
Как исправить ошибку транзакции?, Ошибка отправки транзакции
 
Андрей,
Проверьте в настройках терминала, пункт Торговля - Настройка счетов, что нужный счет в списке выбранных.
Ошибка при вызове ds:Close()
 
Цитата
s_mike@rambler.ru написал:
Может быть после прихода OnStop уже нет смысла беспокоится о закрытии ds, т.к. Quik уже сам все закрыл?
Нет смысла, т.к. если других подписок на этот источник не будет, то терминал сам его закроет.
Таблица всех сделок
 
Дмитрий,
Принудительной сортировки в QUIK нет, уже миллион раз было сказано, сколько можно повторять?
Данные поступают на сервер УЖЕ в отсортированном виде, за этим следит биржа.
По этому, нарушение хронологии в QUIK исключено.
По этому, данные в хранилище сервера и данные в хранилище терминала всегда идут в одинаковом порядке
По этому, НЕТ никакой разницы при сохранении в файл, будут ли данные в том порядке как в терминале или же в том порядке как на сервере.
Естественно, речь про рамки одного рынка.
Если говорить про разные рынки, то как УЖЕ было несколько раз сказано, на разных рынках никакой синхронизации между биржами нет и не может быть в принципе, пока они не синхронизируют часы, а это они естественно делать не будут.
Отличие localtime от os.time ()
 
Цитата
Игорь написал:
Спасибо. А с getInfoParam ("SERVERTIME") всё в порядке (на всякий случай интересуюсь)?
Этот параметр показывает время последнего полученного пакета с сервера.
В нем только часы, минуты и секунды.
TRANS2QUIK_SUBSCRIBE_ORDERS ()
 
Цитата
Михаил Филимонов написал:
А что мешало Вам сделать это в trans2quik.dll?  

Именно пользователь сам должен решать какое обновление по сделке ему нужно.
Лично Вам нужно первое обновление, а другому пользователю нужно последнее.
Почему trans2quik это должен решать?

Цитата
Михаил Филимонов написал:
Квик и так еле "ползает", а тут еще нужно делать массивы по 52 инструментам и "бегать" по ним - очень высокая скорость работы
получается!
52 инструмента это не много и речь не про инструменты, а про сделки.
TRANS2QUIK_SUBSCRIBE_ORDERS ()
 
Цитата
Михаил Филимонов написал:
Нет, нельзя!
Что мешает создать массив, в котором хранить номера уже полученных сделок и при появлении очередной записи сравнивать ее номер с тем который в массиве?
Учебник, Есть ли полный детальный справочник по Qpile ?
 
Здравствуйте,
QPILE устаревший язык который уже не развивается. Сейчас он существует только для поддержания обратной совместимости.
Если Вы только начинаете изучать программирование в QUIK, лучше даже не начинать смотреть в сторону QPILE, а сразу же начать с нового языка QLUA.

Сам по себе QLUA это не более чем дополнение к языку LUA который разработан не нами и по нему есть масса статей в интернете, которые не имеют отношения непосредственно к QUIK но тем не менее касаются LUA а значит их тезисы вполне применимы и в QUIK.
Документация по QLUA лежит в файле QLUA.chm (этот файл Вы можете найти в папке с терминалом QUIK), в ней описаны только те функции которые разработаны нами для QUIK.
таким образом, чтобы начать программировать в QUIK нужно изучить язык LUA (по любым источникам в интернете) и далее дополнить знания по файлу QLUA.chm
Кроме QLUA.chm, на нашем сайте можно найти различные примеры:
https://arqatech.com/upload/iblock/194/quik_lua.zip
https://arqatech.com/upload/iblock/398/INDICATORS.zip
Время изменения стакана получаемого через OnQuotes, OnQuotes - есть ли возможность параллельно с чтением стакана, получить точное время торгового сервера, когда он возник/изменился
 
PFelix,
SetUpdateCallback (от CreateDataSource) и OnAllTrade, OnQuote транслируются разными потоками которые между собой никак не синхронизируются.
Значит и никакой гарантии в определенной последовательности дынных между ними нет и не может быть.
Потому что синхронизация, это ни что иное как искусственная задержка. Как уже несколько раз было сказано и еще раз повторим, со стороны QUIK записи отправляются клиенту тогда когда их получит сервер и в том порядке как их получит сервер, и не важно какое время у конкретной записи, никаких принудительных задержек в этом месте нет и не будет, т.к. любые принудительные задержки есть великое зло.
Таблица всех сделок
 
Цитата
PFelix написал:
ДД
1 ."Затеваю" связанный вопрос в соседней ветке (по тематике ближе)
2. Возможно, "интерессанты" уже с проблемой разобрались,
  НО, как говорится, истина должна быть известна всем интересующимся.
В свете вышесказанного такой вопрос:
Допустим у биржи несколько "торговых площадок" (не я ввел данное утверждение).
Вопрос: А не по принципу ли брокеров с биржей они должны работать?
Поясняю (на всякий случай): Есть "Центральный офис" (ЦО), в котором фиксируются и обрабатываются все заявки по МЕРЕ ПОПАДАНИЯ в этот самый ЦО?
Если заявки должны быть обработаны в соответствии со временем прихода на торговую площадку, ТО:
Варианты развития событий, очевидно, -- следующие:
1. Конечный вердикт по принятию решения в чью пользу состоится сделка решается путем:
     а) по принципу первенства прихода в ЦО;
     б) руководствуясь принципом: если со всех офисов, пришли "следующие" транзакции, то опоздавших -- НЕТ;
     в) назначением таймаута, после которого заявка с какой-либо торговой площадки обрабатывается не по времени заявки, а по времени прихода в ЦО;
     г) "А, ПОФИГ", "используем" заявки, как НАМ "УДОБНЕЕ".
Поэтому несколько изменяю вопрос.
Как же (не синхронизируется время, а) упорядочиваются и обрабатываются заявки не бирже (ЦО), (как это выглядит для сервера QUIK)?

Интересно почему Вы задаете вопрос к бирже здесь, а не на форуме самой биржи, что было бы куда правильней?
Как уже несколько раз было сказано и еще раз повторим, со стороны QUIK записи отправляются клиенту тогда когда их получит сервер и в том порядке как их получит сервер, и не важно какое время у конкретной записи, никаких принудительных задержек в этом месте нет и не будет, т.к. любые принудительные задержки есть великое зло. Существуют естественные задержки (даже у света есть скорость) с которыми ничего сделать нельзя, а есть не естественные задержки (вина провайдера или проблемы у брокера/биржи) и с ними можно и нужно бороться.
Касаемо времени на сделках, до тех пор пока биржи всего мира не начнут синхронизировать свои часы с одним единым источником (NTP сервером), никакой гарантии синхронизации времени на сделках разных площадок не будет.
Даже если речь про одну биржу с разными торговыми площадками, все равно синхронизация не гарантируется, чтобы убедиться достаточно посмотреть на сделки по акциям и фьючерсам.
И надо учиться с этим жить.
Таблица всех сделок
 
Цитата
Дмитрий написал:
Цитата
Дмитрий написал:
 
Цитата
Sergey Gorokhov  пишет:
Порядок данных в хранилище терминала, всегда соответствует порядку загрузки данных с сервера.
А порядок данных в визуальной таблице всегда соответствует порядку на сервере QUIK (если не настроено иное)
А чему соответствует порядок строк в файле, созданном с помощью пункта контекстного меню визуальной таблицы всех сделок "Сохранить в файл обезличенные сделки из таблицы", а также пункта "Сохранить в файл все обезличенные сделки"?
Так и не ответили на мой вопрос... Все же хотелось бы узнать - при сохранении сделок таким вот образом в файл они записываются в него точно в той последовательности, в какой были сохранены в таблице всех сделок терминала, или же в отсортированном виде?
И если в отсортированном, то каким образом?

В файл сохраняется в том же порядке как на сервере, без сортировок.
Отличие localtime от os.time ()
 
Игорь,
Если говорить о практике, то getInfoParam ("LOCALTIME") это устаревшая функция, она была разработана в терминале QUIK задолго до появления поддержки Lua, так что лучше пользоваться os.date () или os.time ()
Данные из стакана котировок
 
Цитата
Женя Логинов написал:
Вопрос в том, будут ли данные в ленте истории стакана, если я не видел её в стакане)
Стакан, также как и таблица текущих торгов транслируется срезами, т.е. раз в период. Если заявка исполняется сразу же то вполне возможно что она не успеет попасть в стакан.
Данные из стакана котировок
 
Цитата
Женя Логинов написал:
То есть даже для 10 бумаг нужно прописать все 10 проверок- выглядит не очень удобно. Или же есть другой способ?Спасибо
Вполне логично и правильно то что программа должна проверять поступающие ей данные, а не надеяться на пользователя.
Вы же в любом случае в программе будете где то прописывать нужные Вам инструменты.
Будь то таблица или просто строка со списком инструментов, но ведь будет же.
Что мешает проверить есть ли входящий sec_code в этом списке?


Цитата
Женя Логинов написал:
А таблица текущих параметров имёт ограничения по количеству бумаг?
Нет не имеет

Цитата
Женя Логинов написал:
Можно ли в одном скрипте сочитать работу со стаканами нескольких бумаг и обращение getParamEx?
Да можно.
Данные из стакана котировок
 
Цитата
Женя Логинов написал:
Описание лабораторной установки:квик версии см. выше. Через настройки получения данных отключены все рынки кроме ФОРТС, в рынке выбран только один инструмент - фьюч сбера; выбраны параметры лучшие цены спроса и предложения, и размеры спроса и предожения. Обезличенные сделки-отключены все рынки.Таким образом, думаю я исключил получение левых данных. В терминале открыт стакан по выбранному фьючерсу.В коде я задал переменные для класса и кода бумаги. И если удалось подписаться на заданный стакан, то ду вайл...

и тем не менее, просьба выполнить рекомендацию.

Цитата
Женя Логинов написал:
И такой ещё вопрос. Если я хочу подписаться на полные доски опционов по двум фьючерсам, на десяток стаканов по акциям и три десятка по облигациям- в сумме может превысить порог в 200 стаканов, про который написано в мануале по квику, или это количество установлено для рабочего места,- то как мне оптимально записать подписку на все эти стаканы, проверку их в ОнКвоут- очередью?  

Это максимальное количество разрешенное конкретному пользователю. Контролирует его сервер QUIK а не рабочее место.
И обойти это ограничение нельзя, только если брокер установит Вам другое ограничение.
Данные из стакана котировок
 
Женя Логинов,

У Вас в коде нет никакой проверки на инструмент, а значит легко может попасть цена от другого инструмента, если по нему открыт стакан в терминале или его заказал другой Lua скрипт.
Для решения добавьте проверку как в примере из документации
Код
function OnQuote(class, sec )   
  if class =="SPBFUT" and sec == "RIZ2" then
    ql2 = getQuoteLevel2(class, sec)   
  end
end


QLUA, вопросы начинающих.
 
Олег,
К сожалению без кода не ясно что и как у Вас происходит, следовательно и рекомендовать что либо затруднительно.
Просьба предоставить исходный код скрипта.
kill inactive stop order
 
s_mike@rambler.ru,
Проблема изучается. Постараемся в ближайшее время дать ответ.
QLUA, вопросы начинающих.
 
Олег,
Просьба выложить пример кода на котором воспроизводится проблема
От какого времени вести отчет для создания своего таймфрейма?
 
Цитата
sav 312 написал:
Как мое время "10:00:50" в этот формат перевести.
Только добавить текущую дату.
Хотя как сказал SDL,  это явно лишнее.
От какого времени вести отчет для создания своего таймфрейма?
 
Цитата
sav 312 написал:
Если в ленте сделок просто время в секундах без привязки к дате, то этот вариант самый простой и меня устраивает.

Опять не понятно. Ощущение что мы про разные вещи говорим.
Что значит с привязкой к дате?
Вы боитесь что время 10:00:50 может дать результат не сегодняшней сделки а вчерашней? Или как?
Если боитесь, то просто отфильтровывайте все сделки, у которых дата сделки не равна дате торгов (так фильтруются сделки вечерней сессии фортс).
Все остальные сделки и так только за текущую сессию, и нет смысла проверять дату.
QLUA, вопросы начинающих.
 
Например
Код
string.format("%.0f", StopShort.yvalue)
QLUA, вопросы начинающих.
 
Олег,
Понятно, на самом деле число у Вас не 113300.000000 а 113300.0000000001 (или как то так)
Это особенность чисел с плавающей точкой (в википедии есть целая статья на тему)
Для решения, Вам надо округлять число с заданной точностью
От какого времени вести отчет для создания своего таймфрейма?
 
Цитата
sav 312 написал:
время в секундах от какой-то древней даты)))
Совершенно не понятно зачем это?
Будет проще если Вы приведете конкретный пример, и поясните чем не устраивает предложенный вариант.
От какого времени вести отчет для создания своего таймфрейма?
 
sav 312,
Простая математика
часы умножаем на 3600 + минуты умножаем на 60 + секунды
Как получить время свечи?, Анализ индикатора
 
Андрей,
Функция T возвращает таблицу, состоящую из параметров {year, month, day, week_day, hour, min, sec, ms, count}.
По этому Вы видите не то что ожидаете.
Для решения надо перевести таблицу в строку.
например так:
T(index).hour..":"..T(index).min..":"..T(index).sec
От какого времени вести отчет для создания своего таймфрейма?
 
Цитата
sav 312 написал:
Вопрос в том, как стартовое время 10.00.50 текущего дня перевести в формат POSIX.
А почему просто не перевести время в количество секунд, и потом нормально сравнивать?
QLUA, вопросы начинающих.
 
Олег,
Не понятно чем не устраивает tostring?
Код
X = 113300.000000
message(tostring(X))

Обезличенные сделки за прошлые торговые сессии
 
mefisto mefisto,
Такой возможности нет
Получить значения индикатора Alligator
 
Dmitry Dimaka,
Функция Get_Candle_Ex возвращает массив из линий индикатора.
обратиться к нужной линии можно через  Get_Collection_Item указав номер нужной линии.
Пример есть в документации см "Раздел 8. Алгоритмический язык QPILE" глава "Функции для работы с графиками"
Проблемы с math.random
 
Цитата
Виктор Столетов написал:
Но что если шаг цены равен к примеру 0,5? Тогда число 78.61 следовало бы округлить до 78,5, но при p=1 оно округлится до 78,6, а при p=0 до 79. Хотя это уже мои проблемы, если найду решение, то напишу.

тогда так:
Код
function roundEX(V, P)
if math.fmod(P,1) == 0 then
   if (V >= 0) then return math.floor(V * (10 ^ P) + 0.5) / (10 ^ P)
   else return math.ceil(V * (10 ^ P) - 0.5) / (10 ^ P) end
else
   if (V >= 0) then return math.floor(V / P + 0.5) * P
   else return math.ceil(V / P - 0.5) * P end
end
end


можете переделать по своему.
Проблемы с math.random
 
Цитата
s_mike@rambler.ru написал:
--------------------------------------------------------------------
-- round (number, p = 0)
-- Округление до требуемого знака.
-- round(123.456,-2) = 100
-- round(123.456,1) = 123.5
-- round(123.456) = 123
function math.round(value, p)

local e = 10 ^ (p or 0)
return math.floor(tonumber(value) * e + 0.5) / e
end

Позвольте немного скорректировать.
дело в том что при округлении отрицательных чисел, эта функция может допустить ошибку.
так  round(-123.55,1) вернет -123.5 а должен вернуть -123.6
или  round(-123.5,0) вернет -123 а должен вернуть -124

для того чтобы избежать этого, надо немного исправить функцию для случая отрицательных чисел, вот так:
Код
function math.round(value, p)
   local e = 10 ^ (p or 0)
   if value >= 0 then return math.floor(tonumber(value) * e + 0.5) / e
   else return math.ceil(tonumber(value) * e - 0.5) / e end
end
Дневки не совпадают с биржей., Есть ли решение?
 
Цитата
Владимир написал:
Наверно, не так задал вопрос. Перефразирую его по другому. Почему в Quik начало свечек не такое, как на сайте биржи?

Потому что QUIK умеет работать далеко не с одной биржей и ориентироваться на какую-то одну биржу мы не можем.
Что означает параметр Settings.Period, Создание технического индикатора
 
Здравствуйте,
В QUIK автор LUA индикатора может создавать какие-то свои собственные параметры.
Просто автор индикатора создал такой параметр с названием Period.
Ровно также он мог назвать его как угодно.
Обновление пользовательской таблицы/окна
 
Цитата
BlackBoar написал:
Допустим я то что должно отображаться буду обновлять 2 раза в секунду, моему человеческому восприятию чаще и незачем. Судя по обсуждению можно считать что точно обновится, так?
Да верно.

Цитата
BlackBoar написал:
Если тема темная то заголовки действительно рисует оконный класс и SetWindowCaption действительно форсирует отрисовкуА если тема стандартная то заголовки в компетенции венды и все как обычно.
Вы правы, скрипт тестировался на темной теме.

Цитата
sav 312 написал:
На другом компе со sleep 100 работает, а с SetWindowCaption также нет.
С SetWindowCaption разобрались, см выше.
А вот что делать со sleep, к сожалению затруднимся что либо порекомендовать.
Пока только ясно что проблема локальная и связана с конкретным компьютером, скорей всего с процессором.
Но что это может быть, к сожалению идей нет.
Обновление пользовательской таблицы/окна
 
sav 312,
Хотя есть идея попросить повторить на другом компьютере, если это возможно.
Обновление пользовательской таблицы/окна
 
sav 312,
Идей нет.
Пришлите нам копию Вашего терминала (без ключей доступа) на адрес quiksupport@arqatech.com
Обновление пользовательской таблицы/окна
 
Цитата
sav 312 написал:
Почему со sleep не прокатывает сам не пойму.

А он в принципе работает?
Т.е. если вообще написать
message("begin")
sleep(100500)
message("end")
что произойдет?

И уточните версию терминала.
Обновление пользовательской таблицы/окна
 
sav 312,
Возможно терминал чем-то нагружен?
К сожалению у нас догадки кончились.
Проблема не воспроизводится.

Изначально же, суть в том что в терминале окна перерисовываются раз в 50мс. И если скриптом обновлять таблицу чаще, то она не успевает обновляться, в результате происходит эффект заморозки.
Лечится это как уже говорили другие пользователи принудительной перерисовкой окна, либо увеличением sleep до значений больше 50.
Обновление пользовательской таблицы/окна
 
sav 312,
Код
Run = true;
 
function main()
 CreateTable();
 while Run do
  SERVERTIME = tostring(getInfoParam('SERVERTIME'));
  PasteTable();
  sleep(10)
 end;
end;

-- Функция создает таблицу
function CreateTable()
   t_id = AllocTable();
  
   AddColumn(t_id, 0, "1", true, QTABLE_INT_TYPE, 15);
   AddColumn(t_id, 1, "2", true, QTABLE_INT_TYPE, 10);
   t = CreateWindow(t_id);
 
   SetWindowCaption(t_id,"ООО");
   SetWindowPos(t_id, 0, 0, 302, 864);
   InsertRow(t_id, -1);
   
end;
  
-- Функция заполняет таблицу
function PasteTable()
   SetCell(t_id, 1, 0, os.date());
   SetCell(t_id, 1, 1, tostring(SERVERTIME)); 
   SetWindowCaption(t_id, "ООО")
end
Обновление пользовательской таблицы/окна
 
Цитата
sav 312 написал:
Один из пользователей (выше найдете) запускал мой код, проблема подтвердилась.
Так и у нас она воспроизводится.
Но только если внести уже озвученные правки в виде sleep или SetWindowCaption то Ваш код начинает нормально работать.
Обновление пользовательской таблицы/окна
 
sav 312,

У Вас всё нет так. Вы на каком коде экспериментируете?
На том который Вы привели ранее, проблема не воспроизводится.
Возможно кроме него что то еще запущено?
Поделитесь, кто как отслеживает факт "готовности свечи"?
 
Цитата
sav 312 написал:
Подскажите, можно ли получить "open" текущей свечи, не дожидаясь ее закрытия?

Да можно.
Страницы: Пред. 1 ... 3 4 5 6 7 8 9 10 11 12 13 ... 66 След.
Наверх