Karina Dmitrieva написал: Михаил Филимонов, приносим свои извинения за дезинформацию. В действительности трансляция данного параметра была уже поддержана. В Таблице текущих торгов он транслируется только для класса MOEXRATES ("МБ Деривативы: Курсы валют") и звучит как "Радиус изменения цены валюты в процентах" ("Радиус вал.(%)" - краткое). Проверьте наличие данного класса у себя в правах, если его нет, то необходимо обратиться к Вашему брокеру, чтобы Вам добавили права на класс.
Karina Dmitrieva написал: Михаил Филимонов, составили обращение на биржу для уточнения информации по поводу трансляции данного параметра. Как только получим ответ - сообщим Вам.
Добрый день! Мне не нужно сообщать, это я Вам сообщил, что транслируется. См. вложенный скпиншот из документации Плаза 2
Karina Dmitrieva написал: В Рабочем месте QUIK такого параметра нет. А транслируется ли он биржей или же только публикуется рекомендуем уточнить у специалистов биржи.
Да нет, но биржа все же транслирует радиусы, Вы могли бы добавить этот параметр
Покупка: ГО = ГО покупателя - (РЦ - Цена сделки) * Стоимость шага цены / Мин шаг цены * (1 + R / 100) Продажа: ГО = ГО продавца + (РЦ - Цена сделки) * Стоимость шага цены / Мин шаг цены * (1 + R / 100) где РЦ - значение котировки последнего клиринга, R - радиус валютного курса.
Прекрасно. А этот радиус транслируется Биржей, или только на сайте публикуется?
Karina Dmitrieva написал: На Срочном рынке МБ для фьючерсов, стоимость шага цены которых выражена в отличной от рубля валюте, также необходимо учитывать параметр "Радиус валютного курса". Отметим, что в Рабочем месте QUIK расчет ГО для выставляемой заявки в форме ввода носит прежде всего информационный (предварительный) характер. И признаем то, что расчет ГО для фьючерсов, использующих радиус курса иностранных валют, может быть, к сожалению, неточным.
Спасибо, понятно. А как взять (посчитать Радиус валютного курса)
Также надо учитывать сумму комиссии брокера и торговой системы с объема заявки (в QUIK это рассчитывается автоматически в соответствии с установленным алгоритмом, на форме ввода заявки выводится в поле справа и отображается в валюте расчетов по инструменту. Самостоятельно рассчитать не получится).
на Срочном рынке: «Объем ГО» = «Количество контрактов» * «ГО покупателя / продавца» * («Стоимость шага цены» / «Размер шага цены») При этом при покупке/продаже бумаг выше/ниже расчетной цены «ГО покупателя /продавца» пересчитывается с учетом разницы расчетной цены и цены сделки:
Рекомендуем проверить статусы инструментов по классу SPBFUT в момент создания транзакции. В таблицу текущих торгов добавьте параметры "Состояние сессии", "Статус торговли инструментом". Если "Сессия" в состоянии "Закрыта" и/или "Статус торговли инструментом" будет "Не торгуется", то транзакция не выполняется по этой причине.
Добрый день!
Ищите ошибку на своей стороне, робот написан 3 года назад со всеми проверками и прекрасно работал ДО ОБНОВЛЕНИЯ. procedure TExpert.OnTick; var PosSt: POS_STATE; PosEQ: integer; RemOrder: boolean; inVol, outVol, aZalog: Double; begin if(StopTrading = false) then //false - expert work begin if((Settings.isSet = true) and (DllConn = true) and (QConn = true) and (WrongData.Res = false)) then begin if(CheckTime(RemOrder) = true) then begin if((ExpData.FutData.Session = 'открыта') and (ExpData.SpotData.Session ='открыта')) then begin ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
Да, и еще погрешность фунции засечки времени, кажется 16 мс., да и саму ошибку Указанная транзакция по указанному классу не найдена: "SPBFUT". выдает ДЛЛ или терминал, это не мое.
nikolz написал: там где ошибки нет, время различается.
Конечно различается, ордер "слетал" на Биржу и вернулся ответ.
А где ошибка, то все происходит на локальном компе, так что время не показатель.
Обидно то, что 3 с лишнем года все работало как часы, а вот теперь появилась проблема. Не знаю как устроен внутри Квик, но с МТ-5 постоянно "цапался" с разработчиками, как новый билд, так вылезает какая-либо ошибка.
Требуется более развернутая информация для изучения проблемы. Какая транзакция посылается, с какими параметрами. Т.е. ожидаем от Вас саму транзакцию, по которой получаете ошибку
Добрый день! Транзакции посылает робот. Пораметры такие
procedure TExpert.SendOrder; var outStr, id, s: string; res: long; ErrCode: long; ErrSize: Dword; ErrStr: LPSTR; begin if(CheckFutPrice(f_price) = false) then begin Mutex.Lock; try FTransBusy:= false; finally Mutex.Unlock; end; FmemoStr:= 'SendOrder: Не правильная цена в заявке ' + FloatTostr(f_price); Synchronize(UpdMemo); exit; end; FOrder:= 0; FTransID:= GetTransID(); id:= UintToStr(TransID); ErrCode:= 0; ErrSize:= 0; ErrStr:= nil; Mutex.Lock; try FTransBusy:= true; finally Mutex.Unlock; end;
case dir of BUY: s:= 'B'; SELL: s:= 'S'; end; outStr:= 'ACCOUNT=' + FutAccaunt + '; TYPE=L; TRANS_ID=' + id + '; CLASSCODE=' + ExpData.FutData.ClassCode + '; SECCODE=' + ExpData.FutData.SecCode + '; ACTION=NEW_ORDER; OPERATION=' + s + '; EXECUTION_CONDITION=KILL_BALANCE' + '; PRICE=' + FloatToStr(f_price) + '; QUANTITY=' + FloatToStr(Qnty) + ';'; res:= T2QSendASyncTrans(LPSTR(AnsiString(outStr)), ErrCode, ErrStr, ErrSize); if(res <> TRANS2QUIK_SUCCESS) then begin Mutex.Lock; try FTransID:= 0; FTransBusy:= false; finally Mutex.Unlock; end; FmemoStr:= 'SendOrder: Ордер ' + ExpData.FutData.SecCode + ' не отправлен.'; Synchronize(UpdMemo); end else begin if((ExitOrder.Order > 0) and (dir = BUY)) then RemoveExitOrder(); FmemoStr:= 'SendOrder: Ордер ' + ExpData.FutData.SecCode + ' отправлен.'; Synchronize(UpdMemo); end; end;
Мы рассмотрели Ваше пожелание. По итогам его анализа сообщаем Вам, что реализация пожелания признана потенциально целесообразной. Если по результатам дальнейшего анализа, включающего юридические аспекты, анализ на непротиворечивость с общей политикой компании, никаких возражений не возникнет, мы постараемся включить Ваше пожелание в план доработок при выпуске одной из следующих версий нашего ПО.
Почему в КВИК на Едином Брокерском Счете (Открытие) или Единая Денежная Позиция (Финам), при торговле фьючерс против спота, учитывается только вариационная маржа фьючерсов, а цена акций не учитывается?
Продав фьючерс и купив акции (равные ноги по кол-ву акций), мы имеем дельта нейтральную позицию, т.е при любом движении рынка (вверх или вниз) у нас должно быть приблизительно одинаковое кол-во свободных средств.
К сожалению, на данный момент конкретных сроков назвать не можем. Как только пожелание будет рассмотрено, мы оповестим Вас об этом в данной теме форума.
Добрый! Хотя сегодня пятница 13 :) Понятно, еще 5 лет ждать....
Andrey Golik написал: Михаил Филимонов, дело в том, что сокращенное название столбца транслирует шлюз. Соответственно название столбца в Вашей таблице будет зависеть от инструментов, которые в неё добавлены. В данном случае было обнаружено различие, так как для фондового рынка действительно на данный момент "цен.".
Добрый день, Андрей! Как скоро исполнится мое пожелание? Мое прошлое пожелание уже 5 год остается в пожеланиях!
Andrey Golik написал: Михаил Филимонов, разница "Мин. возм. цена" и "Мин. возм. цен." возникает на разных рынках. Так, например, для срочного рынка будет "Мин. возм. цена", а для фондового "Мин. возм. цен.". Мы зарегистрировали пожелание, чтобы исправить различия.
При чем тут разные рынки? В одной и той же таблице "вылезают" разные названия колонок!
Господа разработчики! Поправьте, пожалуйста названия этих колонок в таблице "Текущие торги" А то, в процессе работы эти колонки называются то Мин.возм.цен. и Макс.возм.цен., то Мин. возм. цена и Макс. возм. цена
Транзакции посылаются через trans2uik.dll Каким образом могла возникнуть эта ошибка (достаточно средств для покупки 40 лотов Россети (FEES))? Как расчитывается "Скорректированное значение НРП1" ?
Просим уточнить, что в данном случае означает "заявка отправляется успешно"? Речь идет об успешной отправке транзакции на сервер? Какой ответ получаете на эту транзакцию?
procedure TExpert.SendOrder; var outStr, id, s: string; res: long; ErrCode: long; ErrSize: Dword; ErrStr: LPSTR; begin if(CheckFutPrice(f_price) = false) then begin Mutex.Lock; try FTransBusy:= false; finally Mutex.Unlock; end; FmemoStr:= 'SendOrder: Не правильная цена в заявке ' + FloatTostr(f_price); Synchronize(UpdMemo); exit; end; FOrder:= 0; FTransID:= GetTransID(); id:= UintToStr(TransID); ErrCode:= 0; ErrSize:= 0; ErrStr:= nil; Mutex.Lock; try FTransBusy:= true; finally Mutex.Unlock; end;
case dir of BUY: s:= 'B'; SELL: s:= 'S'; end; outStr:= 'ACCOUNT=' + FutAccaunt + '; TYPE=L; TRANS_ID=' + id + '; CLASSCODE=' + ExpData.FutData.ClassCode + '; SECCODE=' + ExpData.FutData.SecCode + '; ACTION=NEW_ORDER; OPERATION=' + s + '; EXECUTION_CONDITION=KILL_BALANCE' + '; PRICE=' + FloatToStr(f_price) + '; QUANTITY=' + FloatToStr(Qnty) + ';'; res:= T2QSendASyncTrans(LPSTR(AnsiString(outStr)), ErrCode, ErrStr, ErrSize); if(res <> TRANS2QUIK_SUCCESS) then begin Mutex.Lock; try FTransID:= 0; FTransBusy:= false; finally Mutex.Unlock; end; FmemoStr:= 'SendOrder: Ордер ' + ExpData.FutData.SecCode + ' не отправлен.'; Synchronize(UpdMemo); end else begin FmemoStr:= 'SendOrder: Ордер ' + ExpData.FutData.SecCode + ' отправлен.'; Synchronize(UpdMemo); end; end;
Соответственно выводится сообщение FmemoStr:= 'SendOrder: Ордер ' + ExpData.FutData.SecCode + ' отправлен.'; Synchronize(UpdMemo);
А в pfTransReplyCB ничего не приходит и в самом терминале нет этой заявки...
В ответ на какую транзакцию приходят такие сообщения? Есть возможность предоставить фрагмент кода с описанием функции pfTransReplyCB?
//--- Transaction callback --- procedure pfTransReplyCB; var i: integer; Child: TMDIChild; begin for i:= 0 to MainForm.MDIChildCount - 1 do begin Child:= TMDIChild(MainForm.MDIChildren[i]); if(Child <> nil) then begin if(dwTransId = Child.Expert.TransID) then begin if(nTransactionResult = TRANS2QUIK_SUCCESS) then begin if(nOrderNum > 0) then Child.Expert.FOrder:= nOrderNum else //Get order done begin Child.FExpert.FTrRes:= nTransactionResult; Child.FExpert.FExCode:= nTransactionExtendedErrorCode; Child.FExpert.FTCode:= nTransactionReplyCode; Child.FExpert.FRepMess:= lpcstrTransactionReplyMessage; Child.FExpert.FStopTrading:= true; Child.Expert.FTransBusy:= false; //Stop trading Child.FExpert.FErrorEvent.SetEvent; end; end else begin Child.FExpert.FTrRes:= nTransactionResult; Child.FExpert.FExCode:= nTransactionExtendedErrorCode; Child.FExpert.FTCode:= nTransactionReplyCode; Child.FExpert.FRepMess:= lpcstrTransactionReplyMessage; Child.FExpert.FStopTrading:= true; Child.Expert.FTransBusy:= false; //Stop trading Child.FExpert.FErrorEvent.SetEvent; end; break; end else //--- Enter order --- if(dwTransId = Child.Expert.EnterOrder.TransId) then begin if(nTransactionResult = TRANS2QUIK_SUCCESS) then begin if(nOrderNum > 0) then begin Child.FExpert.FEnterOrder.Order:= nOrderNum; end; end else begin Child.FExpert.FEnterOrder.isBusy:= false; Child.FExpert.FTrRes:= nTransactionResult; Child.FExpert.FExCode:= nTransactionExtendedErrorCode; Child.FExpert.FTCode:= nTransactionReplyCode; Child.FExpert.FRepMess:= lpcstrTransactionReplyMessage; Child.FExpert.FStopTrading:= true; Child.Expert.FTransBusy:= false; //Stop trading Child.FExpert.FErrorEvent.SetEvent; end; break; end else //--- Exit order --- if(dwTransId = Child.Expert.ExitOrder.TransId) then begin if(nTransactionResult = TRANS2QUIK_SUCCESS) then begin if(nOrderNum > 0) then Child.FExpert.FExitOrder.Order:= nOrderNum; end else begin Child.FExpert.FExitOrder.isBusy:= false; Child.FExpert.FTrRes:= nTransactionResult; Child.FExpert.FExCode:= nTransactionExtendedErrorCode; Child.FExpert.FTCode:= nTransactionReplyCode; Child.FExpert.FRepMess:= lpcstrTransactionReplyMessage; Child.FExpert.FStopTrading:= true; Child.Expert.FTransBusy:= false; //Stop trading Child.FExpert.FErrorEvent.SetEvent; end; break; end; end; end; end;
Со стороны Trans2QUIK ограничения на отправку транзакций нет.
Странно. Но у меня, в период большой активности рынка, выставляется много заявок. И бывает, что заявка отправляется успешно, но в терминале она не появляется и номер ордера не присваивается. (асинхронная подача заявок)
Михаил Филимонов написал: Хоть и trans2quik кривая, но все же она работает нормально, у меня вызывы идут из 138 потоков и все ок. Проверяйте своего бота
Сколько у вас транзакций в день по одному инструменту?
5000 - 6000
250-300 тысяч
Количество заявок в день ни о чем не говорит. Может влиять количество заявок в секунду, например.
Я тоже отсылаю асинхронные ордера. Но у меня немного другая проблема. Бывает ордер отсылается, а в pfTransReplyCB ничего не приходит и в Квик заявка не появляется. думается, что при большом потоке ордеров очередь в библиотеке переполняется (если она вообще есть)
Михаил Филимонов написал: Хоть и trans2quik кривая, но все же она работает нормально, у меня вызывы идут из 138 потоков и все ок. Проверяйте своего бота
Сколько у вас транзакций в день по одному инструменту?
deisik написал: Уже несколько раз сталкиваюсь с зависанием моего торгового бота на реальном сервере, которое с большой долей вероятности вызвано проблемами в Trans2Quik.dll
Зависание происходит в интервале от нескольких часов до нескольких суток, не зависит от активности на бирже и происходит при практически одновременной асинхронной подаче двух разных заявок по изменению их цены (перестановка заявок).
То, что проблема именно с Trans2Quik.dll подтверждается следующим: - возврат из функции TRANS2QUIK_SEND_ASYNC_TRANSACTION происходит со статусом 0 (TRANS2QUIK_SUCCESS) в обоих случаях, т.е. без ошибок (бот успевает записать заявки в лог после возврата из функции) - обе заявки остаются активными в терминале Quik и их потом приходится снимать вручную – запрос до биржи не доходит ни по одной из заявок - в самом Quik также ничего не происходит
Если нужна более детальная информация (что отправляется на сервер), могу предоставить ее в личку
Прошу разобраться в этой проблеме
Хоть и trans2quik кривая, но все же она работает нормально, у меня вызывы идут из 138 потоков и все ок. Проверяйте своего бота
Сначала идет вызов колбека TRANS2QUIK_TRANSACTION_REPLY_CALLBACK с транзакцией 443606 и заявкой 1892957001206697733, т.е. ответ на транзакцию уже получен и номер заявки сопоставлен номеру транзакции
Потом вызывается TRANS2QUIK_ORDER_STATUS_CALLBACK с транзакцией 0 и заявкой с тем же номером 1892957001206697733
Каким образом сервер не знает, что заявка 1892957001206697733 создана транзакцией 443606, если ранее вызывался TRANS2QUIK_TRANSACTION_REPLY_CALLBACK с этой транзакцией и этой заявкой?
Рекомендуем вам использовать "Карман транзакций" (Нажмите в рабочем месте QUIK F7 и в поиске найдите "Карман транзакций..."). В нём вы сможете создать нужную транзакцию с помощью графического интерфейса, затем сохранить транзакцию в файл и использовать этот файл как пример для импорта той или иной транзакции.
1) При создании таблицы "Карман транзакций" выберите нужный класс и транзакцию, добавьте параметры (звездочкой отмечены параметры обязательные для заполнения). 2) Нажмите F2 ("Положить транзакцию"). 3) Заполните параметры транзакции. 4) В таблице "Карман транзакций" появится созданная транзакция, её можно сохранить в tri. файл и получить пример.
Тезка ясно же пишет, что использует trans2quik.dll