Да, разрешена. Смотрите по ссылке ролик. Там поставил другую заявку которая снимается при нажатии "снять все заявки", но эта заявка, остается! Вывод, с такими глюками торговать не серьезно. Вообще не понятно что транслирует биржа и брокер. Как с этим работать непонятно. Таких багов раньше не было. Рисуют что хотят.
Остался один вопрос, кроме вот этого что ни будь придумали ещё, или это единственное решение для Qpile?! num=substr(get_value (trans_result, "DESCRIPTION"), 7, 19)
Обращаясь к функции "get_value" номер заявки не соответствует реальному. ORDER_NUMBER_SELL = get_value (trans_result, "ORDER_NUMBER")+0 'запоминаем номер продажи РАНЬШЕ РАБОТАЛО, НО ЭТО БЫЛО ДАВНО
Наиболее вероятно, причина ошибки состоит в следующем. На сколько нам известно, брокер "Открытие" в настоящем ограничивает возможность выполнять переставление заявок на СР МБ при помощи транзакции MOVE_ORDERS по техническим причинам.
За более подробной информацией о возможных сроках восстановления доступа к данному типу транзакций рекомендуем обратиться в техническую поддержку Вашего брокера.
мой брокер ПАЛ! А вам спасибо. Теперь сначала снимаю и опять выставляю.
Роллирование написано на QPILE но это и не важно. "ACTION","MOVE_ORDERS" НЕ РАБОТАЕТ trans_result_ = get_value (trans_result, "RESULT_EX") trans_result_ ВЫДАЕТ 5, раньше работало и выводил 3. ЧТО ОЗНАЧАЕТ
«5» - транзакция не прошла проверку сервера QUIK по каким-либо критериям. Например, проверку на наличие прав у пользователя на отправку транзакции данного типа,
Результат выполнения операции. Может принимать одно из следующих значений:
«0» - транзакция отправлена серверу,
«1» - транзакция получена на сервер QUIK от клиента,
«2» - ошибка при передаче транзакции в торговую систему, поскольку отсутствует подключение шлюза Московской Биржи, повторно транзакция не отправляется,
«3» - транзакция выполнена,
«4» - транзакция не выполнена торговой системой, код ошибки торговой системы будет указан в поле «DESCRIPTION»,
«5» - транзакция не прошла проверку сервера QUIK по каким-либо критериям. Например, проверку на наличие прав у пользователя на отправку транзакции данного типа,
«6» - транзакция не прошла проверку лимитов сервера QUIK,
«10» - транзакция не поддерживается торговой системой. К примеру, попытка отправить «ACTION = MOVE_ORDERS» на Московской Бирже,
«11» - транзакция не прошла проверку правильности электронной подписи. К примеру, если ключи, зарегистрированные на сервере, не соответствуют подписи отправленной транзакции.
«12» - не удалось дождаться ответа на транзакцию, т.к. истек таймаут ожидания. Может возникнуть при подаче транзакций из QPILE.
«13» - транзакция отвергнута, т.к. ее выполнение могло привести к кросс-сделке (т.е. сделке с тем же самым клиентским счетом).
Николай Камынин написал: давно это было, но я не использую sleep в потоках в том числе и в main QLUA. попробуйте использовать ожидание событий в потоке а не sleep. подробнее, как это сделать см книгу Джеффри Рихтер( для тех, кто не знает)
Борис Гудылин написал: Boris Litvinov , возможно, Вы не учитываете некоторые нюансы Таблицы позиций по клиентским счетам (фьючерсы) -- futures_client_holding. Когда в ней возникают строки по инструменту, когда исчезают?
Чтобы строка с нужным фьючерсом появилась в этой таблице (если ее не было), я выдаю вспомогательную заявку по дальней цене (строка появилась) и снимаю заявку. Далее могу работать с этой строкой. Но если я закрываю позицию, то строка держится в таблице не бесконечно, а день-два , как карты лягут.
Примерьтесь.
Этот пост не об этом! Читайте ветку, что бы понять суть проблемы.
Что та похожее и происходит. То что в моменте, а этого для бота более чем достаточно, транслируют пустую таблицу. При этом идет торговая сессия это очевидно! То что это происходит на серверах КВИК а не других платформах, так же доказано! Повторюсь, если это кому то будет нужно, и для тех кто пишет подобные ТС. Этот костыль придется прикручивать не зависимо от языков и приводов. Иначе ваши позиции будут скидываться, и перенабираться вновь! Проблема второй день теста, решина! Но то что speep 2000 давит при нулевой позе фьюча и по другому решить не смог это печаль! Но не не печальнее пере набора позы! Всем спасибо!
Николай Камынин, И на счет демо вы не правильно поняли. Это я подумал что протестил. А на само деле, что бы поймать баг пяти минут мало. Как на реале, так и на демо, баг проявляется
Николай Камынин, вы начните искать для начала! Проблема описана выше, на любом языке, работать будет одинаково! НА ЛЮБОМ! Для себя решил уже задачу! И описал способ решения. Повторюсь контроль позиций в этой таблице затруднителен, и решается через грабли. После теста буду писать С++ DLL. С учетом этого бага.
В общем пока что в глубоком тесте всё,. getFuturesHolding отложил, слишком много вводных. Повторю способ лечения. 1. После парсинга стоит счетчик, и если в таблице было найдено два SR то при пропуске строки в цикле, покажет 1 а не 2, фильтр не пропустит до следующей итерации. 2. транзакция осуществляется только на следующей итерации если позиция по фьючу 0. Плюс между итерациями срабатывает sleep 2000. Но это только при нуле по фьючам. Если позиция не 0, то ни каких задержек не стоит.
Так же подчистил скрипт и теперь могу утверждать что это баг критический для подобного софта. И будет работать аналогично на S#, ALAB и т.д. По этому вопрос с разработчиков приводов снят. А вот Разработчикам Quik следует написать самим это задание, и поставить на тест! Убедившись что у них там полный привет! Не реально усложнен контроль позиции. Живет своей жизнью так сказать таблица фьючей!
3.6.1 getFuturesHolding Функция предназначена для получения информации по фьючерсным позициям. TABLE getFuturesHolding(STRING firmid, STRING trdaccid, STRING sec_code, NUMBER type) Функция возвращает таблицу Lua с параметрами Таблицы позиций по фьючерсам. В случае ошибки функция возвращает «nil».
Дело в том, что скрипт вам мой не поможет, эта же беда происходит на S#. Сложно сказать что происходит, но контроль позиции через эту таблицу крайне сложен. Понимаю что такого рода задачи мало кому нужны, пишут моно боты. Решил сделать на LUA после перенести на C++ DLL Повторюсь, при написании не программирую идею, а латаю дыры в софте, которых иметь не должен подобный продукт! Проскакивает ноль позиций, через все фильтры, значит ноль транслируют! Специально пускают в моменте! Обрывы, перезапуски Квика, входы выходы, всё работает без сбоев. Но наступает в моменте 0. Откуда он берется ХЗ И да, общаюсь с товарищем, говорит у него подобная тема на транзаке работает как часы через S#. Но стоит зайти тем же софтом через Квик, та же петрушка!
Если лечение пойдет на пользу, оставлять постоянно такой тормоз не 1100 не буду! Только если 0 позиций, в этом случае будет работать фильтр. А так как выход в 0 крайне редкий. Проблема не критична! Критично то, что это вообще так работает с торговым софтом! Мне кажется этот 0 транслируется просто! И дело не совсем в квике, а в трансляции позы фьюча, но могу ошибаться!
4 день треша. С утра запустил переделанный скипт. Повторюсь, скрипт смотрит и парсит таблицу фьючей, при этом зеркально совершая сделки базового актива. В общем был установлен счетчик, который считает итерацию. При этом не дает совершить уровнять позу на текущей. А лишь на следующей. Каждfя итерация sleep 100 Ну думалось что эта гребеная талица дает это глюк лишь в одной итерации. Вот результат на демо счете. Повторю что это происходит рас в день, а может вообще не произойти, как повезет! Дальше лечить буду Sleep 1100 будет залипать перед следующей итерацией на исполнение транзакции. Будем поглядеть, Sleep 100 в Main и сбои итерации не помогли!
Так как этот редкий глюк обнаружить крайне сложно, решил поставить счетчик на подтверждение что эта грёбаная таблица не лжет! И только после подтверждения двух итераций что поза сменилась давать добро на исполнения второй ноги! Всем удачи.
Думал что всё закрыл, и сегодня запустил на реальном счете бот! Повторю раньше он был моно! Теперь он мониторит весь спектр в зависимости от базового актива. На тестах что только не делал, обрывы сети, перезагрузка квика, набор позы выходы. всё было синхронно как часы.
С утра уже запустил на реале! в Main Sleep100 Результат на скрине. Гребаный КВИК! Друзья на S# будет так же. Специально на Lua писал для стабильности, но её нет даже на LUA В двух словах, смысл скрпта смотреть в таблицу фьючей и повторять зеркально. Но в моменте что та происходит, типа 0 позиций по фьючу. Всё на скрине!
И это не зависит от sleep 10 или 1000 это лишь увеличит шанс найти ошибку. При 1000 она будет крайне редка, но будет! И вы долго будете искать кто дурак. А дело не в вас! Просто софт, не для работы с деньгами. Дыры Дыры Дыры
напишите простой скрипт, возьмите любых четыре фьюча. И в цикле пересчитывайте при каждой итерации в Main количество строк, sleep 10 Всё поймете, это трешь! У вас местами будут не считываться одна из строк. Да, это арбитраж. Где не нужно вписывать ничего, лишь базовый актив! Всё остальное делается в теле скрипта. Конечно я всё давел до идеала, и залепил ещё несколько подобных дыр. Но это не торговый софт, это сплошные дыры! Дело в том, если не видеться что та, то бот уравнивает позу принося убытки. Скидывая и набирая позицию вновь. Даже не пойму как это возможно, пропустить строку которая есть в таблице. Но в моменте её типа нет!
если каждые 10 мск пересчитывать число строк в таблице, то по какой та причине бывает так что строки пропускаются. Мне пришлось писать скрипт который проверяет количество строк. И если их меньше прошлого максимума то пропускать до следующей итерации. А вообще дыр много если пишешь что та не моно.
По заданию в зависимости от базового актива, парсились фьючерсы. По первым двум сиволам. В таблице этих фиючерсов может быть 4, в зависимости от периода фьючерса. У меня их как правило два ближний и дальний, Так вот, бывает так что одна из строк не считывалась. Это критическая ошибка при написании подобного на LUA. Залепил очередную дырку.
ISR написал: Короче, как я понял, как раньше уже из квика не получить цену позиции и придется самому считать ее, печально :(
повторяю, она никогда не была там другой. читайте ветку полностью что вам дал. Фьючерс всегда был интрадей, всегда. И будет ставаться по тому что это происходит на бирже а не софте. Это биржа с брокерам вам транслирует. Так случилось, что эти два дня занимался тем же самым. Всё сделал и работает теперь без сбоев.
ISR написал: Мой qLUA-робот берет цену входа из таблицы «Позиции по клиентским счетам (фьючерсы)» из поля "Эффективная цена позиции", так вот она там не соответствует цене моего входа. Все это безобразие началось со вчерашнего дня, что делать и кто виноват? Такая же глючная "Балансная цена" из таблицы "Состояние счета", она ровна значению "Эффективная цена позиции". Робот ставит стоп-тейк от цены входа, а она левая - в результате происходит выход из позиции, роботом невозможно пользоваться.
заработало вроде, буду тестить дальше, но блин, работает!!! так и было приходили кол беки в случайном порядке, всё решил Всем спасибо за дискуссию. Получил СРЕДНЕЮ без бороды истории таблицы сделок, заявок и всей этой шляпы не нужной этому боту.
https://smart-lab.ru/blog/472380.php#comments почитайте, тут предложили решение. Все дураки получается? Suntor , будьте добры ссылочку на эталонный и правильный скрипт работы с OnTrade. Вы думаете не искал, там обращаются к таблице сделок через цикл. К нас о чем речь? В прочем ссылочку
ОК, завтра прикручу генератор чисел, что бы была последовательность заявок и сделок, запущу всё в таблице и посмотрю визуально есть ли повторения и всё ли отрабатывает. На этом сделаю вывод, может и правда туплю. Но тогда вопрос, не ужели S# не доперли до этого, просили Арку разобраться с багом? Ведь у них двойная сделка и асинхронен это синоним их продукта. И что только они не делали, и с бубном и без, всё равно всё что прикручивается через квик, асинхронно.
Suntor написал: Чтобы отмести в сторону все ощущения, нужно хотя бы разок сохранить в файл все, что у Вас проходит после фильтра. И тогда будет точно ясно, грешить на кол-бэк или нет.
Может вы имели введу не тройной дубль колл бека, а то что одна и та же сделка, может запускать колл бек много раз? И получается так, сохранил номер, следам отработал другой колл бек и сохранился её номер, а потом снова пришла та что уже была? Может вы это имели введу? Речь не о дублях колл бека?
Проблема описана, и известна на СЛ программистам. Не работают колл беки должным образом. Вопрос, есть ли смысл ждать исправления и корректной работы? Или так и будут все города городить, сохраняя всю историю сделок что бы получить среднюю? https://smart-lab.ru/blog/472380.php#comments
Прошу правильный код, от АРКИ. Где как и у меня нет обращения к таблице сделк, где всё берется из прешедшего коол бека, рас все они последовательно отрабатываются. УТВЕРЖДАЮ, что не все колл беки приходят, если происходит быстрый набор, То часть колл беков не имеет очареди, они ТУПА ОТМЕНЯЮТСЯ. Или не приходят вовсе.
seccode1 = "SRM8"
seccode2 = "SiM9"
trade_numSave = 0
function OnTrade (trade)
if trade.sec_code = = seccode1 then
if trade.trade_num ~ = trade_numSave then
trade_numSave = trade.trade_num -- что бы не повторялось, ограничиваем повторение по номеру заявки.
message (tostring(trade.flags), 1 )
if trade.flags = = 36 or trade.flags = = 68 then
value = trade.value * - 1 -- Текущие
else
value = trade.value
end
valueSave = 0
file = io.open ( "volume_summa.txt" , "a+" ) -- Opens a file in append mode
if file ~ = nil then
io.input (file) -- sets the default input file as test.lua
valueSave = io.read () -- prints the first line of the file
end
io.close (file) -- closes the open file
if valueSave = = nil then
valueSave = value
else
valueSave = tonumber(valueSave) + tonumber(value)
end
file = io.open ( "volume_summa.txt" , "w+" ) -- Opens a file in append mode
io.output (file) -- sets the default output file as test.lua
io.write (valueSave) -- appends a word test to the last line of the file
io.close (file) -- closes the open file
end
end
end
ТАК ЧТО НИЧЕГО ТУТ ПОВТОРНО НЕ ПРИХОДИТ, ТУПА КОЛЛ БЕКИ НЕ ПРИХОДЯТ. И НЕ НУЖНО ДИЧЬ ВПАРИВАТЬ, О ПРОБЛЕМЕ АРКА ЗНАЕТ
seccode1 ="SRM8"
seccode2 = "SiM9"
trade_numSave = 0
function OnTrade (trade)
if trade.sec_code == seccode1 then
if trade.trade_num ~= trade_numSave then
trade_numSave = trade.trade_num -- что бы не повторялось, ограничиваем повторение по номеру заявки.
message(tostring(trade.flags), 1)
if trade.flags == 36 or trade.flags == 68 then
value=trade.value *-1 -- Текущие
else
value=trade.value
end
valueSave = 0
file = io.open("volume_summa.txt", "a+") -- Opens a file in append mode
if file ~= nil then
io.input(file)-- sets the default input file as test.lua
valueSave = io.read()-- prints the first line of the file
end
io.close(file) -- closes the open file
if valueSave == nil then
valueSave = value
else
valueSave = tonumber(valueSave) + tonumber(value)
end
file = io.open("volume_summa.txt", "w+") -- Opens a file in append mode
io.output(file) -- sets the default output file as test.lua
io.write(valueSave) -- appends a word test to the last line of the file
io.close(file) -- closes the open file
end
end
end
Boris Litvinov написал: Не пойму по чему не все сделки вызывают кол бек?
Код
function OnTrade (trade)
if trade.trade_num ~ = trade_numSave then
message (tostring(trade.trade_num))
trade_numSave = trade.trade_num
end
end
Глядя на такой код, я бы сказал, что дело в том, что вы сохраняете номер последней сделки в одной переменной, а не в массиве как это надо делать, и из-за этого, у вас всё перемешивается в итоге... но... совершенно непонятно, реальный это ваш код или нет... потому что, если реальный, то у вас там и повторно одни и те же сделки будут считаться, когда «тройные повторы» вперемешку пойдут. Поэтому вышеприведённый вами код в принципе не будет работать...
trade_num ограничивает повторение повторных кол беков. В полном коде у меня и есть сохранение в файл всего что приходит, так вот кол беки не отрабатывают вск сделки. На сколько знаю проблема известная. И много лет не решается Аркой!!! Заниматься отпиской смысла нет.
Колбек OnTrade В теле складывал value. BUY как есть, Sell наделял "-" После делил на количество лотов. И получая среднюю безубыточную цену. А да, там приходит по три пакета, поставил фильтр что бы одни и те же trade_num (Номер сделки в торговой системе)не учитывались
В общем если торгую одним лотом всё гуд. Но стоит кинуть большим лотом. Или делать много сделок подряд. Некоторые кол беки не отрабатывают. Такое ощущение что колбеки не приходят.
Да, бот не может просто пропустить. По тому что обращаюсь именно колл беку, той сделке что его вызвала. А не в таблицу сделок, запрашивая количество строк и так далее. Не пойму по чему не все сделки вызывают кол бек?
Код
function OnTrade (trade)
if trade.trade_num ~= trade_numSave then
message(tostring(trade.trade_num))
trade_numSave = trade.trade_num
end
end
Anastasia Gordienko написал: Ваше пожелание было реализовано в версии 7.10.0 терминала QUIK. Количество свечей графиков, которые может отобразить Рабочее место QUIK, увеличено с 3000 до 65000.
огромное спасибо!!! Где взять *.dat историю, или конвертер в *.dat для квика? У меня тестер в квике написан, вы расширили до 65к свечей...Нужен конвертер Или где скачать историю? QMinEditor только в обратную сторону конверт в *.dat квика
Где взять *.dat историю, или конвертер в *.dat для квика? У меня тестер в квике написан, вы расширили до 65к свечей...Нужен конвертер Или где скачать историю?