Покупка: ГО = ГО покупателя - (РЦ - Цена сделки) * Стоимость шага цены / Мин шаг цены * (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
...., либо активировать настройку "Пересчитывать при изменении позиций" - обновление "Клиентского портфеля" будет происходить после каждого изменения позиций.
На периодичность расчета таблицы "Купить/Продать" влияет настройка Основные настройки (F9) / Торговля / Клиентский портфель - Обновлять через ... секунд . В Вашем случае расчет таблицы производится каждые 10 секунд, после расчета происходит вывод по DDE.
Чтобы данные из таблицы не выводились каждые 10 секунд, Вы можете изменить значение указанной настройки или вообще отключить ее - в этом случае обновление таблицы выполняться не будет.
Т.е при изменении записи в таблице Клиентский портфель строка не будет выводиться по DDE, если отключить обновление?
Почему, при экспорте таблицы по DDE "Купить/продать" только с 4 колонками, а именно 1=Инструмент 2=Код инструмента 3=D long 4=D short Передается огромное количество строк, ведь ничего не меняется в течении сессии? Вывод "строчит" даже ночью. Зачем?