Есть задача удаления всех лимитированных заявок в таблице. Написал такой код
client... code... n=GET_NUMBER_OF("ORDERS")
FOR i FROM 1 to n trade = GET_ITEM ("ORDERS", i) schet=GET_VALUE (trade,"ACCOUNT") sec_t=GET_VALUE (trade, "SECCODE") if schet=client if sec_t=code status_limit=GET_VALUE(trade,"STATUS") tip_operation=GET_VALUE (trade,"OPERATION") balance=GET_VALUE (trade,"BALANCE") order_number=GET_VALUE (trade,"NUMBER") end if end if END FOR
Здравствуйте ! При выполнении скрипта QPILE в таблице скрипта вывожу значение SERVERTIME через GET_INFO_PARAM. Это нормально, что секунды могут замереть, а потом перескочить сразу на 2-3 секунды ? Что это означает ? Происходит в это время задержка в выполнении скрипта ? Не хватает мозгов у компа ? Или медленный интернет канал ? В информационном окне и в левом нижнем углу интерфейса время бежит четко без задержек. Локальное время на компе совпадает со временем сервера. Стоит ли с этим заморачиваться ?
Да, попадос. Сколько я с QPILE разбирался, а теперь тратить время на понимание LUA. А я не профессиональный программист.Все настроено, работает без сбоев на удаленном сервере, я туда почти не заглядываю, только смс приходят о сделках. Для моих алгоритмов скорости QPILE хватает. Сказать разработчикам что есть в QPILE и чего нет в LUA, к сожалению, не могу. Так что остается только воздух сотрясать и надеется на лучшее.
Добавлю, что я выставляю лимитированную заявку по заранее известной цене (NEW_ORDER). Т.е. есть некий сигнал, скажем на шорт. Робот рассчитывает уровень входа от текущей цены на некоторое количество пунктов и ставит заявку по этой цене. Ни о каких рыночных заявках речи не идет. Да и насколько я помню, на ФОРТСе нет рыночных заявок.
А вот что мне ответил брокер, сославшись на материалы биржи 8) -------------------------------------------------------------------------- Сергей посмотрите пожалуйста этот материал от биржи давайте попробуем прояснить вашу ситуацию..
Обращаем Ваше внимание, вследствие п.3 списка изменений ТС срочного рынка МБ ( http://www.moex.com/n10696/?nt=0) - если срочный контракт приобретается/продается дороже/дешевле расчетной цены, то ГО под такую заявку (позицию) теперь будет больше чем БГО. ГО теперь рассчитывается по формуле БГО + abs(РЦ-цена заявки).
Если к Вам обращаются клиенты, которые не могут выставить заявку с диагностикой "Ошибка создания заявки. [FORTS][332] "Нехватка средств по лимитам клиента" - рекомендуем проверить достаточность средств по указанной формуле, учитывая указываемую клиентом цену. Аналогичная диагностика может возникать в случае выставления клиентом рыночных заявок на срочном рынке. Вызвано это тем, что при выставлении рыночной заявки на этом рынке, QUIK автоматически подставляет в качестве цены заявки существенно отличающиеся от расчетной цены максимальную/минимальную возможные цены по конкретному контракту. --------------------- Переводя на русский. Берем цену нашей заявки, находим разницу с ценой последнего клиринга. С помощью функции abs получаем модуль числа. Полученный результат прибавляем к БГО, транслируемому в квик. Профит. Попробую так, поскольку по вышеприведенным формулами с радиусом курса все равно заявки отвергаются по ошибке 332.
Добавлю. Только что получил ответ на форуме биржи. Не знаю, компетентен ли он, но привожу его: ------------------------- В quick транслируется ГО при покупке фьючерса по расчетной цене: ГО = 2 * L * (MinStepPrice/ MinStep) * (1 + R / 100) = 8560 * (12.81 / 100) * 1.16 = 12 721,92 (различия в последних знаках из-за большой точности расчета переменных) При заключении сделок по цене отличной расчетной, ГО может отличаться. Ваша формула рассчитывает фактическое ГО при покупке фьючерсного контракта по цене Ц. ---------------------- http://forum.moex.com/viewtopic.asp?t=30287
Сергей Парахин пишет: А может быть такое, что ГО, рассчитанное по методике из файла http://moex.com/a1463 получается меньше, чем транслирует квик в таблице текущих значений. Пример на 30.10.15 время 17:30. Кот. клиринга (РЦ)=84270 макс. возм цена=88550 мин.возм. цена=79990 2L=88550-79990=8560 ст. шага цены=12,81 (округлим) шаг цены=10 На основе параметров Si рассчитываем радиус курса 1+R= 1,16. Для надежности округляем радиус курса до 1,2. Выставляем заявку на лонг по 83770,т.е. покупка по цене, ниже расчетной. Из таблички это формула: ГО=(2L-(РЦ-Ц))*(MinStepPrice/StepPrice)*1+R ГО=(8560-(84270-83770)*(12,81/10)*1,2=12 380,16 Квик же нам транслирует ГО 12 721,92. Верен ли мой расчет ? И правильно ли я понимаю, что в некоторых случаях ГО может быть ниже, чем показывает квик ?
Добрый день,
Для проверки Вашего расчета рекомендуем обратиться к Вашему брокеру так как у него, возможно, сохранена информация по параметрам инструмента на указанный Вами момент времени, которой у нас, к сожалению, нет. При затруднении брокера с ответом необходимо инициировать его обращение к нам.
Здравствуйте ! В верности исходных данных я не сомневаюсь. Вопрос в другом. Может ли быть такое, что по новым правилам ГО, рассчитываемое по приведенным формулам, ниже ГО, транслируемого в квик ? Брокеру я писал, они мне прислали ровно ту же табличку из файла с сайта биржи. Вы мне скажите, мой пример расчета ГО верен или нет для случая ПОКУПКИ НИЖЕ РАСЧЕТНОЙ ЦЕНЫ ? Меня смущают эти формулировки из файла с формулами: ----------------------------- Увеличение гарантийного обеспечения по фьючерсам для некоторых сделок Действующий подход При покупке фьючерса выше расчетной цены или продаже фьючерса ниже расчетной цены в ходе торгов предоставляется скидка по гарантийному обеспечению (ГО) – оно ограничивается величиной 2L, где L – это диапазон от расчетной цены до нижнего/верхнего лимита колебания цен сделок 1 . Новый подход При покупке фьючерса выше расчетной цены или продаже фьючерса ниже расчетной цены в ходе торгов скидка не предоставляется, максимальное ГО может составить 3L: ---------------------------------------- Т.е. можно сделать вывод, что сейчас ГО увеличивается только при ПОКУПКЕ ВЫШЕ расчетной цены или ПРОДАЖЕ НИЖЕ расчетной цены ? В противоположных случаях по прежнему предоставляется скидка ? Хотя и ранее об этих скидках я ничего не знал. Просто в коде qpile брал ГО из таблицы, накидывал 10% и путем деления стоимости портфеля на это ГО получал количество лотов на вход. Сейчас это превратилось в черный ящик. Например, при такой же "накидке" в 10% на ГО из квика, лонг может давать открыть, а шорт нет. В другой день, наоборот. Т.е., например, в одну сторону дает 5 лотов, обратно только 4, хотя предыдущие позиции были прибыльными. При этом в стоимости портфеля по новым правилам я стал учитывать, помимо накопленной маржи (до клиринга), также и текущую маржу. Новые правила это разрешают.
А может быть такое, что ГО, рассчитанное по методике из файла http://moex.com/a1463 получается меньше, чем транслирует квик в таблице текущих значений. Пример на 30.10.15 время 17:30. Кот. клиринга (РЦ)=84270 макс. возм цена=88550 мин.возм. цена=79990 2L=88550-79990=8560 ст. шага цены=12,81 (округлим) шаг цены=10 На основе параметров Si рассчитываем радиус курса 1+R= 1,16. Для надежности округляем радиус курса до 1,2. Выставляем заявку на лонг по 83770,т.е. покупка по цене, ниже расчетной. Из таблички это формула: ГО=(2L-(РЦ-Ц))*(MinStepPrice/StepPrice)*1+R ГО=(8560-(84270-83770)*(12,81/10)*1,2=12 380,16 Квик же нам транслирует ГО 12 721,92. Верен ли мой расчет ? И правильно ли я понимаю, что в некоторых случаях ГО может быть ниже, чем показывает квик ?
Здравствуйте ! Запустил тут на одной машине два терминала от разных брокеров. Загрузил в оба терминала робота на qpile. В настройках робота,как положено, указаны торговые счета для каждого брокера. В остальном код робота совершенно одинаков - название переменных, условия входа/выхода и т.д. Также одинаково обозначены идентификатор цены на графиках в разных терминалах. В результате роботы начали бодаться друг с другом. Вход в позу осуществляется по лимитированной заявке, которая выставляется заранее и либо она сработает, либо нет. Далее следует сигнал заявка снимается и ставится противоположная и т.д. Так вот конфликта в выставлении/снятии заявок нет. Но как только цена доходит до заявки и оба робота входят в позицию, один аварийно закрывает позицию (есть такое условие по одной из переменных). Если закрывать портфель в любом из терминалов, тогда все работает четко. Вопрос. Может ли существовать конфликт одинакового кода на qpile, запущенного одновременно в двух разных терминалах на одном ПК ? Или мне надо переименовать все переменные в одном из кодов ? Или это из-за одинакового названия идентификатора цены в настройках графика ?
Да там вся засада с нагрузкой на процессор. Если среднесуточная нагрузка превышает 40%, то могут урезать производительность. Или вообще заблокировать. На моем локальном компе с WinXP Home (4 гига оперативки, AMD Athlon 2 Ггц 2 ядра) часто бывает, что quik грузит проц на 50 и более процентов. Правда, при этом запущены еще и другие задачи. В общем, включил пока 4 гига оперативки и одно ядро процессора. За прошедшие сутки средняя загрузка ЦПУ на сервере составила 6%. Т.е. пока очень даже хорошо. Правда кроме квика и radmina там ничего больше нет.
Здравствуйте ! Минимальные системные требования читал. Все же, что важнее при выборе провайдера VDS для квика под WIndows Server 2012 R2. При одинаковой стоимости какую конф-ю выбрать: 1) Intel Xeon, 2.6ГГц - 4 ядра,2 гига опертивки; 2) Intel Xeon, 2.6ГГц - 1 ядро, 4 гига оперативки. Или вообще хватит 2 ядра и 2 оперативки ? Будут крутиться два портфеля на qpile.
swerg пишет: А если поставить 1..2 секунды? откуда именно 5? неужели к вам так долго приходит ответ и изменение позиций? (в терминале вы ведь видите изменение?)
Да это так, на всякий случай. Можно и 2 секунды поставить. Главное, максимально быстро отправить заявку, а том хоть 10 секунд пусть скрипт отдыхает. Подумал, что можно проще сделать. Ввести переменную poza. Как только зявку ушла, не дожидаясь ее исполнения, переводить ее в true. Вышли из позиции, соответственно, переводим ее в false. Без колбэков. Пока немного трудновато понять логику событийного программирования после qpile. Учитывая еще то, что я не профессиональный программист. Имею только базовые знания из институтского курса. Тут еще вылезла другая проблема. Мой брокер (Сбербанк КИБ) не разрешает переворачивать позицию в одной заявке, если ГО в 2 раза меньше чистой позиции.Пример. На счете 30 тыс. ГО по фьючу РТС 22 тыс. Чтобы мне перевернуться из лонга в шорт, я должен сначала одной заявкой продать лонг, а другой заявкой открыть шорт. Это что вручную при вводе заявки, что на qpile. На qpile понятно. В синхронном режиме посылаешь в одном цикле сначала одну заявку, тут же следом в этом же цикле вторую. И все срабатывает. Но это очень долго. Цена может улететь. И вот тут уже придется разбираться с колбэками. Как вариант, с тем, что предложил green_X5
Я что-то после qpile пребываю в легком шоке. Сегодня целый день убил, чтобы понять, почему робот продолжает входить в позицию, хотя уже одна заявку улетела. В цикле на вход, помимо торгового условия есть проверка на наличие позиции по фьючерсу. Код на получение позиции такой (подсмотрел тут на форуме))):
function GetTotalNet(stroka) local i = 0 local futures = {} while futures.sec_code ~= stroka do futures = getItem("futures_client_holding", i) i = i+1 end return futures.totalnet end
Далее в майне вызываем эту функцию и присваиваем переменной значение local total_net=GetTotalNet(тут пишем код бумаги). Т.е. если total_net=0 и еще другие условия, то входим в позицию. На купиле это работало. Тут же я долго не мог понять, почему скрипт набирает позицию до упора, пока не выскочит сообщение "превышен лимит по инструменту". Логическим путем пришел к выводу, что после посылки лимитированной заявки (которая уходит по рынку) и ее исполнения, нужно остановить скрипт, чтобы позиция успела обновиться в таблице. В конце цикла на вход ставлю паузу в 5 секунд. Только тогда все заработало как нужно. Это нормально ? Или у меня код кривой на получение позиции и можно как-то ускорить процесс ?
Здравствуйте ! Пытаюсь разобраться с языком QLUA на примере простых стратегий. Например, параболик САР. При перескоке цены параболиком, открываем позицию. Вход на текущей свече. Вопрос. Откуда брать цену, чтобы получить ее максимально быстро по сравнению с кодом на qpile (там я беру цену последней сделки из таблицы текущих параметров): 1) Также из таблицы текущих параметров 2) Из таблицы всех сделок, отфильтровав по нужному инструменту. 3) Напрямую из стакана. Только там будем сравнивать бид или оффер с параболиком, а не цену последней сделки. 4) Напрямую с графика цены через GetNumCandles и далее как в примере с индикаторами ? Или для Lua это не принципиально ? И в любом случае результат будет одинаковым ?
Какой самый скоростной способ получения данных с индикатора, того же параболика, например ? Или способ только один через GetNumCandles и далее.