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

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

Страницы: Пред. 1 2 3
getBuySellInfoEx
 
Цитата
Stanislav Tvorogov написал:
Данная проблема относится к Валютному рынку и действительно имеет место быть.

Из моих сообщений ясно и недвусмысленно следует, что проблема относится именно к Срочному рынку, а конкретно она проявляется на инструменте "Фьючерс на индекс РТС" (RTS-3.16) - "SPBFUT", "RIH6". Более того, приведенные расчеты подтверждаются ответом на транзакцию боевого, не демо, сервера брокера.
Версия терминала также была приведена - 7.0.4.10.

Чем еще смогу помочь?
getBuySellInfoEx
 
Цитата
В реализованном алгоритме расчета ГО  для клиентского места QUIK      версии 7.0 пока не поддержан учет  радиуса курса валют. Это приводит     к  расхождению ГО по сравнению с  биржевым. Постараемся доработать      функционал в одной из следующих  версий.
Цитата
1. Функция CalcBuySell отображает максимально возможное количество лот в заявке по инструменту. У себя проверили - функция рассчитывает количество корректно
Если вы уже признали недоработку, зачем противоречить самому себе?

Цитата
В случае ее неработоспособности просьба прислать нам на почту пример  скрипта и скриншоты из рабочего места QUIK, где был бы виден результат  работы функции.
Да чего уж, пускай все посмотрят.

25.01.2016 10:20:00
CalcBuySell("SPBFUT", "RIH6", "myClientCode", "myAccount", 69330, true, false) = 5
Код
25.01.2016 10:20:00 trans=
  {
    ["OPERATION"]="B"
    ["ACTION"]="NEW_ORDER"
    ["CLASSCODE"]="SPBFUT"
    ["TRANS_ID"]="100264"
    ["PRICE"]="69330"
    ["QUANTITY"]="5"
    ["ACCOUNT"]="<...>"
    ["SECCODE"]="RIH6"
    ["CLIENT_CODE"]="<...>"
  }

25.01.2016 10:20:00 transReply=
  {
    ["sec_code"]="RIH6"
    ["price"]=69330
    ["client_code"]="<...>"
    ["balance"]=0
    ["time"]=102000
    ["status"]=4
    ["qty"]=5
    ["class_code"]="SPBFUT"
    ["trans_id"]=100264
    ["account"]="<...>"
    ["exchange_code"]="<...>"
    ["quantity"]=5
    ["firm_id"]="SPBFUT"
    ["flags"]=262145
    ["result_msg"]="Ошибка создания заявки. [GW][332] \"Нехватка средств по лимитам клиента.\"."
    ["brokerref"]="<...>"
    ["order_num"]=0
    ["R"]=100264
    ["server_trans_id"]=22500
    ["uid"]=<...>
    ["ordernum"]=0
  }

Маржа на фьючерсах
 
Цитата
Новые формулы поддержаны в версии клиентского места QUIK начиная с 7.0.3

К сожалению, в версии 7.0.4.10 расчет ГО работает неверно.
Пример по данным вечерней сессии 25.01.2016. Контроль производился по полю "Объем ГО" окна ввода заявки.

Данные по RIH6:
Стоимость шага цены (MinStepPrice) - 15,85378
Нижний лимит (Pmin) - 63 030
Верхний лимит (Pmax) - 73 330
Расчетная цена последнего клиринга - 68 180
Гарантийное обеспечение - 20 369,77

Данные по SiH6:
Расчетная цена последнего клиринга (РЦ) - 80 540
Гарантийное обеспечение (ГО) - 9 964

Базовый размер ГО в пунктах: 2L = Pmax - Pmin = 10300.
ГО = ГО(в пунктах) * MinStepPrice / MinStep * (1 + R) = {R = 2 * ГО / РЦ} = 10300 * 15,85378 / 10 * (1 + 2 * 9964 / 80540) = 16329.3934 * 1.2474 = 20369.77

QUIK же для 1 контракта выводит значение 16329.39, то есть без учета радиуса колебаний курса доллара R.
В результате - завышенное максимальное количество контрактов.
Как на диалог со списком скроптов Lua назначит горячую клавишу?
 
Заодно можно еще и ошибочку исправить: если окно "Доступные скрипты" в фокусе, горячие кнопки не работают, например, Ctrl+Q, Alt+Q. Хотя окошко это сделано немодальным.
Заказ всех сделок, Использование CreateDataSource для заказа всех сделок
 
Цитата
Серж пишет:
Продолжение этой темы: http://forum-archive.quik.ru/forum/lua/125655/125655/
Проблема, описанная в этой ветке, так за год и не решена.

Версия 7.0.4.10.
В скрипте производится заказ всех сделок:
CreateDataSource(..., ..., INTERVAL_TICK)
SetUpdateCallback(...)
Подписка выполняется только в скрипте, таблицы всех сделок в терминале не открываются.

Вариант А).
1. Запускаем терминал.
2. Запускаем скрипт.
3. Устанавливаем соединение.

Заказанные данные поступают, callback-функция вызывается.

Вариант Б).
1. Запускаем терминал.
2. Устанавливаем соединение.
3. Запускаем скрипт.

Callback-функция не вызывается.

Далее:
4. Останавливаем скрипт.
5. Запускаем скрипт.

Данные начинают поступать, callback-функция вызывается.
При последующих перезапусках скрипта поведение также корректно.

Вывод: ошибка проявляется только при первом запуске скрипта и только при установленном до запуска соединении с сервером.
Воспроизводится стабильно. Также установлено, что очистка данных при запуске (info.exe -clear) на описанное поведение не влияет.
Кто как решил вопрос уведомления о сделках?
 
Цитата
Валентин пишет:
где взять luasocket? ссылка на оф сайте недоступна
http://files.luaforge.net/releases/luasocket/luasocket
OnOrder без UID
 
Цитата
Старатель пишет:
Вы всё обратно переиграли что ли? Не рубите сгоряча.
Цитата
Егор Зайцев (ARQA Technologies) пишет :
В новой документации параметры seccode, classcode, tradenum, ordernum имеют вид sec_code, class_code, trade_num, order_num.
Сейчас (v. 6.17) в структуре данных ответа на транзакцию (в OnTransReply) эти поля содержат дублирующие значения:
1. "trans_id", "R" - ID транзакции.
2. "order_num", "ordernum" - номер заявки.

Мне лично все равно, как будут называться поля в структурах, но хорошо бы оставить что-то одно и привести в соответствие документацию.
Пока нет возможности посмотреть, но если в 7.0 всё так же, то пожалуйста, займитесь этим вопросом.
Изучаем Qlua., "hello world"
 
Цитата
kettle пишет:
как правильно сохранить в переменную номер выставленой заявки?
Например, так:
Код
function OnTransReply(trans_reply)
   orderNum = trans_reply.order_num
end

См. в документации по QLUA:
1. Функции обратного вызова: OnTransReply(), OnOrder().
2. Функции для обращения к строкам произвольных таблиц QUIK.
3. Структуры данных: Транзакции, Заявки.
Проверка исполнения стоп-заявки
 
Цитата
WennY пишет:
Я уже просто запутался в источниках
http://www.lua.org/pil


Programming in Lua
by Roberto Ierusalimschy
Lua.org, January 2013
ISBN 859037985X
(also available as an e-book)


Также:
http://lua-users.org/wiki/LuaDirectory
Изучаем Qlua., "hello world"
 
Цитата
kettle пишет:

вопрос ? как ее теперь снять . просто удалить.
если поменять ["ACTION"]="KILL_ORDER" то не работает.
Правильно не работает. Нужно еще указать, какую заявку вы хотите снять:
Код
   t =
   {
      ["TRANS_ID"] = "124",
      ["ACCOUNT"] = "SPBFUXXXXXX",
      ["CLASSCODE"] = "SPBFUT",
      ["SECCODE"] = "GZZ5",
      ["ACTION"] = "KILL_ORDER",
      ["ORDER_KEY"] = "<номер снимаемой заявки>"
   }
Лимитированная, рыночная заявка
 
Цитата
Фёдор Сухов пишет:
А если я поставлю сервер на биржу и буду без всяких Квиков ловить заявки?
А разве так не делают?
Делают. Я вам об этом уже написал. Не буду здесь приводить ссылки, легко нагуглите сами "прямое подключение к торгам".
Цитата
Фёдор Сухов пишет:
если все честные до святости
Непонятно, что вы имеете в виду под "честностью" в данном случае. Деятельность бирж регулируется федеральными законами о рынке ценных бумаг, об организаторах торговли, также регламентами работы бирж. Это публичные нормативные акты, с которыми может ознакомиться каждый. В протоколах связи используются криптографические средства защиты. Получить третьему лицу информацию о заявках клиентов до их принятия и обработки ядром биржи невозможно. После этого - принимайте order log и действуйте по своему усмотрению. Рынок формируется путем подачи всеми участниками торгов абсолютно таких же заявок, какие доступны вам. Никаких скрытых дополнительных флагов заявок ни у кого больше нет.
Цитата
Фёдор Сухов пишет:
- У меня, допустим, пинг с сервером 40 милисекунд, а у господина А...кого пинг менее 5 милисекунд.
- Кто раньше сможет поставить заявку используя один и тот же робот?
Господин А. По крайней мере, быстрее вас получить актуальную рыночную информацию.
Цитата
Фёдор Сухов пишет:
- И сколько раз Он сможет считать стакан и оценить, пока я только 1 раз считаю?
В соответствии со своими техническими возможностями способа подключения к торгам, толщиной канала связи и талантом программиста.
Лимитированная, рыночная заявка
 
Цитата
Дмитрий пишет:
Цитата
Николай Камынин пишет:
Если нельзя, но очень хочется то можно попробовать указать
EXECUTION_CONDITION -Условие исполнения заявки, необязательный параметр.
Со значением «FILL_OR_KILL» – немедленно или отклонить,
Вряд ли это поможет исполнить заявку по цене, худшей, чем есть сейчас в стакане.
Совершенно верно. Условие исполнения говорит, что следует сделать с остатком (неисполненным объемом) заявки - поставить в стакан или забыть навсегда.
Лимитированная, рыночная заявка
 
Цитата
Фёдор Сухов пишет:
Налицо перехват заявок "перехватчиками", которые потом и "формируют" уже для себя лучшую цену.
Поэтому не хочется иметь дело с биржевыми алгоритмами, предлагающими "лучшую цену" для клиента,
Насчет мифических "перехватчиков". Ваша заявка (после контроля лимитов) попадает напрямую (!) на биржу. До этого никто из посторонних ее не видит и знать про нее не знает. Там она попадает в ядро исполнения (order execution), где по описанному ранее алгоритму (matching) находит (или не находит) одно или несколько встречных предложений. Абсолютно из всех приходящих заявок на серверах биржи формируется очередь. Биржа транслирует её (order log) своим клиентам ПОСЛЕ помещения туда входящих заявок. Дневной файл по всей бирже весит гигабайты. И "влезть" туда как-то в серединку перед вашей заявкой, уже имея о ней публичную информацию, невозможно.
Лучшую, как впрочем и все другие цены, для всех участников торгов и прочих любопытствующих предлагают не биржевые алгоритмы, а такие же участники торгов, как и вы. Биржевые алгоритмы (и алгоритмы системы QUIK) лишь обрабатывают информацию, упорядочивают её и представляют клиентам в удобном виде.
Лимитированная, рыночная заявка
 
Цитата
Фёдор Сухов пишет:
Странно, конечно, но многие значит не в курсе, что "перехватчики" существуют, кроме, конечно самого маркет-мейкера, главное получить быстрее, чем многие список заявок.
Ничто в современном мире так не ценно, как информация. Своевременная. Вот для этого существует прямое подключение к бирже по Plaza, чем многочисленные профессиональные скальперы невозбранно и пользуются. Выкладывайте денежки за такое подключение и присоединяйтесь к их армии!
Лимитированная, рыночная заявка
 
Кажется, начинает проясняться.
Цитата
Фёдор Сухов пишет:
1. Открытие короткой позиции Price=67663, Vol=1
2. Далее формируется сигнал на закрытие позиции
3. Close Sell (Buy), PriceIn=67705 Bid=67702.000000 Ask=67705.000000
Надо понимать, в данном примере речь идет о фиксации убытка, т.е. стоп-лосс. Только не стоп-ордером, а вручную. Ок, имеем право.
Короткую позицию закрываем покупкой, значит, смотрим предложение. В стакане лучшая цена 67705, отправляем ордер Buy 67705. Чудесно.
Только кто вам гарантирует, что пока ваша заявка не дошла до биржи, стакан не изменился? И вот теперь Bid=67704 Ask=67706 например? Ваша заявка, не найдя согласно лимит-условию встречного предложения, упала в стакан и вот теперь Bid=67705 Ask=67706. Ау, кто продаст мне по 67705? Нет, пока есть желающие только по 67706.
Цитата
Фёдор Сухов пишет:
6. Цена изменилась!!!! Bid=67712.000000, Ask=67716.000000
7. Переставляем заявку и боремся за "лучшую цену" - PriceIn=67712, чтобы закрыться!
А вот дальше еще интереснее. Вместо того, чтобы бить в оффер (67716) продавцу, пока рынок не уехал еще вверх, мы встаем в бид (67712) и ждем у моря погоды. Но на рынке движуха, и сейчас покупатели (быки) правят бал, плевав на наши проблемы с короткой позицией и убытками.
Цитата
Фёдор Сухов пишет:
По цене 67716 не хотим закрываться.
Ну а кто хочет продавать дороже-то?!
Цитата
Фёдор Сухов пишет:
8. Цена изменилась!!!! Bid=67715.000000, Ask=67717.000000
9. Переставляем заявку и боремся за "лучшую цену" - PriceIn=67715, чтобы закрыться!
Цитата
По цене 67717 не хотим закрываться.
Рынок уже х.. знает где. Но есть такой зверь - жаба. И она в каждом из нас. Ну почему же никто нам бедным не хочет продать по 67715?!

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

...
3 67080
4 67078
1 67077
----------
67075 4
67072 7
67069 5
...

Теперь "приезжает" ваша лимит на продажу по 67069. Так вот, покупатели по ценам 67075 и 67072, наименее выгодным для себя, будут в этой очереди первыми на сделки с теми, кто продает. И "объехать" вам их, заключив сделку сразу по 67069, даже менее выгодно для вас лично, вам не дадут. Не по-джентльменски это  :)  
Надеюсь, понятно объяснил.
Остановка скрипта по условию, Как остановить скрипт при определенном условии?
 
Цитата
A A пишет:

local StopFLAG = true
local STOPSCR = OnStop(StopFLAG)
1. StopFLAG = true должно происходить ВНУТРИ вашей функции OnStop().
2. В нее передавать ничего не надо, т.е. вызывать OnStop().
3. По правилам, если OnStop() вызывается как колбэк из терминала, то функция должна возвращать число миллисекунд ожидания до принудительного завершения main() терминалом (или ничего не возвращать, по умолчанию таймаут 5 с). У вас это так? Что такое STOPSCR?
Остановка скрипта по условию, Как остановить скрипт при определенном условии?
 
Цитата
A A пишет:
Пробовал вызывать ее, но безрезультатно. Возможно там действительно не хватает необходимых действий. Нет ли у вас примера функции OnStop()?
Конечно. Пример есть и в документации QLUA:
Код
Stopped = false

function OnStop(signal)
   <какие-то завершающие действия>
   ...
   Stopped = true
end

function main()
   while not Stopped do
      <какие-то действия>
          ...
      sleep(10)
   end
end 
Ключевой момент - скрипт считается завершенным при выходе из функции main(). С помощью флага Stopped мы этим управляем.
Остановка скрипта по условию, Как остановить скрипт при определенном условии?
 
Цитата
A A пишет:
Подскажите, как остановить скрипт при определенном условии?
Насколько я понимаю OnStop для этого не подходит, поскольку вызывается только при нажатии кнопки "Остановить" из окна "Доступные скрипты".
Да, вызывается при нажатии. Но никто вам не мешает вызвать ее самому:
Код
if <условие> then OnStop() end
... если в ней у вас там прописаны все необходимые действия по остановке скрипта.
Кто как решил вопрос уведомления о сделках?
 
Цитата
s_mike@rambler.ru пишет:
Серверов, не нуждающихся, например, в TLS/SSL, уже мало и количество их уменьшается. Обычно это древние сервера. Дописывать библиотеку для поддержки новых стандартов, как я понимаю, никто не собирается.
Главное не отчаиваться и слишком быстро не сдаваться.
Качаем модуль LuaSec:
Проект: https://github.com/brunoos/luasec
Бинарники можно взять тут: http://love2d.org/forums/viewtopic.php?f=5&t=76728. Нужны 2 файла - ssl.dll и ssl.lua.
Использует библиотеки OpenSSL libeay32.dll и ssleay32.dll. Скачать, если нет, и не забыть обеспечить к ним доступ - через окружение (PATH) или можно кинуть в папку с QUIK.

Подключаем:
Код
package.path = ...
package.cpath = ...
ssl = require "ssl"
Добавляем вот такую функцию:
Код
function sslCreate()
   local conn =
   {
      sock = socket.tcp(),
      connect = function(self, host, port)
         local r, e = self.sock:connect(host, port)
         if not r then return r, e end
         self.sock = ssl.wrap(self.sock, {mode = 'client', protocol = 'tlsv1'})
         return self.sock:dohandshake()
      end
   }

   local fnIdx = function(t, key)
      return function(self, ...)
         return self.sock[key](self.sock, ...)
      end
   end

   return setmetatable(conn, {__index = fnIdx})
end
... и отправляем:
Код
socket.smtp.send
{
   from = ...,
   rcpt = ...,
   source = ...,
   server = "smtp.mail.ru",
   port = 465,
   user = "user",
   password = "password",
   create = sslCreate
}

И еще вкратце, что это за безобразие такое. Вся соль в возможности smtp.send() luasocket'а (см. доки) задать свою функцию создания сокета для отправки сообщения (create = sslCreate), который по умолчанию делается библиотекой просто как socket.tcp(). Мы делаем то же самое, но только обертываем его в подмененном методе connect, где нужно "договориться" с сервером по протоколу SSL. Всё. Еще в этой функции код для доступа к остальным методам сокета, ведь далее luasocket будет работать с ним как со стандартным.

С mail.ru, например, работает без проблем.
Флаги при частичном исполнении заявки
 
Цитата
Imersio Arrigo пишет:

бит 0 (0x1) Заявка активна, иначе – не активна
бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0»,

т.е. русским по белому написано: если бит 1 установлен - заявка снята!. Все. Нет других вариантов. Снятая заявка не может быть активной.
Речь не о том, может быть снятая заявка активной или нет. Нет, не может. И точно так же русским по белому написано, что если бит 0 установлен - заявка активна! Повторяю, вопрос в том, как интерпретировать комбинацию "11" по факту ее появления? Вопрос в приоритете битов при анализе этой комбинации - бит 0 или бит 1? Вот как раз это в документации не разъяснено. Заявка активна ИЛИ (исключающее или, XOR, если так понятнее) снята?
Разработчики, возможна в реальности эта комбинация или нет?
Флаги при частичном исполнении заявки
 
Цитата
Imersio Arrigo пишет:
Цитата
SDL пишет:
Это значит, что следующие комбинации битов 0 и 1 соответствуют статусам:
"Активна" - "х1"
"Снята" - "10"
"Исполнена" - "00"
Не так:
"1х" - снята
"01" - активна
"00" - исполнена
Вариант не противоречит документации. Но... он не менее спорный, чем первый. Всё зависит от того, как интерпретировать комбинацию "11": "снята" + "активна" (?!).
В первом варианте алгоритм обработки флагов такой:
1. Бит 0 == 1 ? "Активна" : "Не активна"
2. Если "Не активна". Бит 1 == 1 ? "Снята" : "Исполнена".

Второй вариант анализа.
1. Бит 1 == 1 ? "Снята" : "Не снята"
2. Если "Не снята". Бит 0 == 1 ? "Активна" : "Исполнена".

Лично мне кажется первый вариант логичнее. Пускай разработчики ответят, какие комбинации битов возможны в приходящих данных.
Флаги при частичном исполнении заявки
 
Цитата
Viktor MMM пишет:
Да, я понял уже, что статус не будет меняться.
А по статусу в онтрэйд есть информация?
Для сделок эти биты неприменимы, ибо к сделкам они отношения не имеют. Просто по формату используется тот же набор флагов.
У сделок будет существенен только бит 2: "Данный флаг для сделок и сделок для исполнения определяет направление сделки (BUY/SELL)". Остальные пропускаем.
Флаги при частичном исполнении заявки
 
Viktor MMM,

Egor Zaytsev нас здесь немного обманывает. Согласно документации,
бит 0 (0x1) Заявка активна, иначе – не активна
бит 1 (0x2) Заявка снята. Если флаг не установлен и значение бита «0» равно «0», то заявка исполнена

Это значит, что следующие комбинации битов 0 и 1 соответствуют статусам:
"Активна" - "х1"
"Снята" - "10"
"Исполнена" - "00"

... что говорит о том, что если бит 0 равен 1, то бит 1 не имеет значения и анализировать его не нужно.

Частичное исполнение можно отследить с помощью полей qty (Количество в лотах) и balance (Остаток). Заявка частично исполнена, если при статусе "Активна" выполняется условие: 0 < balance < qty.

Или, цитируя со старого форума:

Булычев Михаил 13/02/07 11:15
Re: Частично исполненная заявка
 Добрый день.
 Это когда выполняется условие (Количество>Остаток && остаток!=0 && статус=="ACTIVE")
6.17.0.58 bugs collection, разработчикам на заметку. (все остальные - прошу проходить мимо и не засорять топик)
 
Цитата
Sergey Gorokhov пишет:
так как у Вас терминал зависает и без функции getScriptPath то скорее всего она не причем.
но с ней явно есть какая-то беда. с этим разберемся отдельно, это уже наша внутренняя тема.
Явная беда именно с ней. У меня в скриптах индикаторов эта функция использовалась и с версии 6.17 эти индикаторы перестали работать. В 6.16 всё было ок. Вставка message(getScriptPath()) в самое начало скрипта индикатора у меня стабильно воспроизводит проблему.
Страницы: Пред. 1 2 3
Наверх