Михаил, в 7.2 это исправлено, рекомендуем обновиться
getParamEx
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 23:56:34
Цитата
Владимир написал: Извините, что не по теме, но этот топик выходит в первых строках результата Яндекса.
Я правильно понимаю, что список параметров, которые можно получить с помощью GetParamEx, до сих пор является тайной за семью печатями, и нигде-нигде официально не описан?
Не совсем так, он не является тайной. Он есть в info.chm -Раздел 8. Алгоритмический язык QPILE --Функции для получения значений Таблицы текущих торгов ---Значения параметров функций
Если там какого-то параметра нет, его можно узнать выведя таблицу по DDE с установленной галкой "Формальные заголовки"
НЕ РАБОТАЕТ КАК НАДО, НЕ РАБОТАЕТ КАК НАДО
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 23:54:20
Цитата
дмитрий б написал: Я эти значения вывожу в таблицу чтоб узнать работает это или нет а в дальнейшем я эти значения буду использовать в коде .
Если требуется просто узнать работает или нет, то можно запустить отладчик (в контекстном меню таблицы)
Цитата
дмитрий б написал: Подскажите а могу ли я эти значения приобразовать в переменные примеру bar1 bar2 также с максимум и минимум этих баров как это лучше сделать
Вопрос не совсем понятен, зачем преобразовывать, если у Вас и так есть массивы CANDLE и CANDLE_OLD из которых Вы уже можете взять максимум и минимум.
НЕ РАБОТАЕТ КАК НАДО, НЕ РАБОТАЕТ КАК НАДО
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 22:56:07
Цитата
дмитрий б написал: Спасибо большое! А если мне надо будет 2 свечи текущую и вторую как быть
выводить обе в таблицу. в таком случае надо не менять, а копировать строки
НЕ РАБОТАЕТ КАК НАДО, НЕ РАБОТАЕТ КАК НАДО
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 22:39:41
Вам надо заменить только в одной строке LINES = GET_VALUE(CANDLE,"LINES")
НЕ РАБОТАЕТ КАК НАДО, НЕ РАБОТАЕТ КАК НАДО
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 21:56:33
Цитата
дмитрий б написал: Пожалуйста подскажите что надо делать дальше потому что я в программирование совсем недавно подскажите и если не трудно надпишите код желательно с прояснениями если не трудно заранее спасибо большое
У Вас есть массив CANDLE_OLD, Вам остается только что-то с ним сделать, например вывести в таблицу. Как вывести в таблицу можно посмотреть на примере аналогичного массива CANDLE Вам остается просто заменить одно на другое.
НЕ РАБОТАЕТ КАК НАДО, НЕ РАБОТАЕТ КАК НАДО
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 21:06:01
Цитата
дмитрий б написал: ПЫТАЮСЬ ВЗЯТЬ ЗНАЧЕНИЕ ПРЕДЫДУЩЕЙ СВЕЧИ ВСЕ РОВНО ПОЛУЧАЕТСЯ ТЕКУЩАЯ СВЕЧА А НЕ ПРЕДЫДУЩАЯ
Здравствуйте, По присланному коду не видно чтобы была попытка взять предыдущую свечу. Видно что Вы ее сохраняете в массив CANDLE_OLD однако больше с этим массивом Вы ничего не делаете.
Шлюз
Пользователь
Сообщений: Регистрация: 23.01.2015
25.04.2016 21:02:44
Цитата
s_mike@rambler.ru написал: Оказалось, что у брокера весна и он начал транслировать в таблице обезличенных сделок информацию за вечернюю сессию предыдущего дня.
Отказ от классов вечерней сессии был в версии 11.0 шлюза срочного рынка:
Sergey Gorokhov написал: не зная логики скрипта трудно сказать влияет та или иная настройка или нет.
Разве я где-то писал про настройки, влияющие на скрипт с именем XXXXX?
Я писал о настройках сервера/шлюза/остального, которые могут повлиять на работу любого скрипта.
В таком случае, влияют абсолютно все настройки логинов ТС/шлюзов/сервера/прав/терминала. Отправить их все в QLUA не представляется возможным, ровно как и адаптировать робота под каждую из них.
Шлюз
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2016 14:54:51
Цитата
s_mike@rambler.ru написал: А зачем перечислять? Открываем админку сервера и по каждой настройке. Может она влиять на функционал скрипта? - добавляем в список То же самое и про настройки рабочего места
не зная логики скрипта трудно сказать влияет та или иная настройка или нет.
Шлюз
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2016 14:53:06
Михаил, Увы но как уже было сказано чтобы у всех, все, было одинаково никогда не будет. Если стоит задача определения параметров, уточните что именно Вам бы хотелось проверять. И как именно Вы бы хотели их проверять И мы зарегистрируем пожелание на доработку
Шлюз
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2016 14:48:07
Цитата
s_mike@rambler.ru написал: Я хочу иметь возможность узнать те настройки, которые явно влияют на поведение и функционал скриптов. Раз брокер может их менять - дайте их на чтение из скрипта
почему бы нет, это хорошее пожелание на доработку. давайте попробуем перечислить нужные в скрипте опции
Шлюз
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2016 14:46:40
Михаил, открою секрет, на фондовом и валютном рынках, брокер тоже может отключить рыночные заявки если ему это необходимо.
Шлюз
Пользователь
Сообщений: Регистрация: 23.01.2015
22.04.2016 14:43:02
Михаил, Вопрос понятен. Вы хотите чтобы у всех брокеров все было одинаково. Такого не будет. Ибо каждый брокер решает свои задачи по организации доступа к торгам и у каждого брокера есть возможность настроить наш софт под эти задачи. С Вашей стороны, как программиста, нужно предусмотреть в коде возможность того что брокер может отключить функционал.
Заявка, Заявка
Пользователь
Сообщений: Регистрация: 23.01.2015
21.04.2016 14:46:17
Константин, Сохраните транзакцию из кармана в tri файл Проверьте совпадают ли имена параметров с теми что у Вас в коде
Заявка, Заявка
Пользователь
Сообщений: Регистрация: 23.01.2015
21.04.2016 14:27:30
Цитата
Константин Рейм написал: Ошибка отправки транзакции: Не найдено поле "Проверять лимиты" для транзакции "Ввод заявки" по классу "FORTS (опционы)"
Установите в терминале QUIK настройку Настройки - Основные - Торговля - Заявки - Применять стандартные формы ввода. Попробуйте создать карман транзакций (Торговля - Карман транзакций) и положить туда транзакцию "Ввод заявки" по классу "FORTS (опционы)" с заполненным признаком "Проверять лимиты" Сообщите получится или нет?
Заявка, Заявка
Пользователь
Сообщений: Регистрация: 23.01.2015
21.04.2016 14:12:54
Цитата
Константин Рейм написал: res - пишет, нет поля "Проверять лимиты"
Это не полный текст ошибки.
Как получить данные индикатора RSI ?, Как получить данные индикатора RSI ?
Пользователь
Сообщений: Регистрация: 23.01.2015
21.04.2016 11:27:58
Здравствуйте
Цитата
Optimus1 Optimus1 написал: А получать фактические данные с уже высчитанного уграфика RSI без доп. вычислений в скрипте - не поулчится ?
для получения данных с графика в QLUA есть функция getCandlesByIndex
Цитата
Optimus1 Optimus1 написал: Что то не увидел, чтобы разработчики Quik там что то любезно предоставили :)
речь про ссылку там все индикаторы которые есть в QUIK реализованы на LUA Функции которые используются, в том числе позволяют проводить расчеты по заданной таблице данных
Какую таблицу вывести для сравнения цены приобретения акции и текущей цены на рынке?
Пользователь
Сообщений: Регистрация: 23.01.2015
20.04.2016 05:51:16
Цитата
Евгений Миронов написал: в том то и дело что там нет цены приобретения акций. например вчера купил акции газпром за 150 руб/штука, сегодня они стоят 152 руб. но уже нигде не вижу цены 150, т.к. таблица состояния счета имеет колонки Цена и ликвидная цена
"Баланс. цена" - Для спот-рынка – соответствует значению параметра «Цена приобретения» в таблице лимитов по бумагам.
Какую таблицу вывести для сравнения цены приобретения акции и текущей цены на рынке?
Пользователь
Сообщений: Регистрация: 23.01.2015
19.04.2016 15:47:40
Дополним ответ, Лучше смотреть Состояние счета. Там отображаются все нужные Вам параметры. В лимитах по бумагам не все.
Какую таблицу вывести для сравнения цены приобретения акции и текущей цены на рынке?
Пользователь
Сообщений: Регистрация: 23.01.2015
19.04.2016 15:36:13
Здравствуйте, Вам подойдет таблица лимитов по бумагам. Еще Вы можете использовать таблицу Состояние счета.
Где Обработка внешних транзакций в 7 версии?, Где Обработка внешних транзакций в 7 версии?
Пользователь
Сообщений: Регистрация: 23.01.2015
19.04.2016 15:35:07
Здравствуйте, Меню Сервисы - Экспорт/Импорт данных - Внешние транзакции
Создание портфеля для SiM6, qpile, не выводит список свечей
Пользователь
Сообщений: Регистрация: 23.01.2015
19.04.2016 13:56:25
Здравствуйте, Дело в том что для получения данных по SiM6 требуется указать параметр USE_CASE_SENSITIVE_CONSTANTS Суть работы этого параметра в том что абсолютно все строковые константы становятся зависимыми от регистра букв. Это касается не только пользовательских констант, но и служебных. В частности Ваш код не работает так как служебные константы "High", "Low", "Close" и "Volume" указаны в неправильном регистре. Согласно документации, они должны быть указаны БОЛЬШИМИ буквами.
iuplua, обсуждаем работу стороннего графического пакета
Пользователь
Сообщений: Регистрация: 23.01.2015
18.04.2016 09:34:16
Здравствуйте,
Цитата
_sk_ написал: Можно ли что-то подобное сделать в рамках QUIK?
К сожалению надежного решения нет
SearchItems
Пользователь
Сообщений: Регистрация: 23.01.2015
18.04.2016 05:55:30
Цитата
Андрей 77 написал: Пытаюсь постичь глубокий смысл этой функции. Но, что-то не получается.
Глубокий смысл в том чтобы быстро получить номера строк удовлетворяющие требованиям.
Цитата
Андрей 77 написал: Это что же, для каждой конкретной выборки свою функцию писать !?
Зачем? Никто не мешает в fn передавать какие нибудь параметры.
Цитата
Андрей 77 написал: Хотелось бы иметь универсальную fn, а набор контролируемых параметров и их значения задавать при вызове SearchItems.
Никто не мешает задавать набор контролируемых параметров в функции SearchItems
SearchItems выдает таблицу которая содержит номера нужных строк, который в любом случае нужно передавать в getItem.
Цитата
Андрей 77 написал: а как я понимаю, именно из-за слишком медленной ее работы и была создана SearchItems ...
Неверно понимаете, getItem в любом случае придется использовать. SearchItems создавался чтобы избежать лишних циклов.
Параметры меток
Пользователь
Сообщений: Регистрация: 23.01.2015
15.04.2016 12:58:30
Здравствуйте!
Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Подскажите как загрузить данные в квик для работы на выходных
Пользователь
Сообщений: Регистрация: 23.01.2015
14.04.2016 20:59:22
Цитата
ninjatrader написал: так нет больше вариантов кроме как со скриптом?
Здравствуйте, Варианта два, либо в терминале заказывать данные, либо скриптом заказывать данные.
Странности с объявлением переменных
Пользователь
Сообщений: Регистрация: 23.01.2015
14.04.2016 13:40:17
Цитата
Кирилл Мазеин написал: А кодировка может повлиять на объявление переменных?
Согласно документации для Qpile скриптов кодировка должны быть CP-1251. Любая другая кодировка уже означает что есть вероятность некорректной работы скрипта
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
14.04.2016 13:36:48
Цитата
Николай Бехтерев написал: Да, у меня явно нет ясного понимания КоллБек функций. И к сожалению пока не попалось ни одной подробно разъясняющей статьи.
Принцип работы с колбеками в Lua ничем не отличается от аналогичного функционала в других языках.
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
13.04.2016 18:58:53
Цитата
Николай Бехтерев написал: А если мой пример, и функция main( ), в которой я что-то делаю с fut_pos? Да, в коллбеке пусто, но в майн табличка будет обновляться после коллбека?
Причем тут Main и колбек? Видимо происходит какое-то непонимание процесса.
В main ничего не будет обновляться пока Вы сами это не напишите. Хотите передавать таблицу в main напишите так:
Код
mytable={}
function OnFuturesClientHolding(fut_pos)
mytable=fut_pos
end
function main()
while true do
message(type(mytable)) --работаем с таблицей mytable
end
end
Николай Бехтерев написал: Ясно, что описаны, просто я не совсем понимаю, что делают другие битовые функции, вот и спросил, есть ли способ за одну битовую функцию на этими битами узнать всё и сразу. Ясно, будем тыкать.
Рекомендуем почитать в интернете статьи на тему "Битовые операции". Без этой теории трудно будет разобраться, зато когда разберетесь флаги покажутся легким делом.
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
13.04.2016 17:27:54
Цитата
Николай Бехтерев написал: Хорошо, но если в описании функции КоллБека не передать табличку, то она не обновится, верно? Т.е. в моём примере выше, в отличие от вашего табличка с данными обновится, а в вашем нет, по сколько функции не передаётся таблица, верно?
В Вашем примере Вы ничего не делаете с "fut_pos", а раз ничего не делаете какой к нем смысл. Зачем обновлять таблицу раз Вы с этими обновлениями все равно ничего не делаете. Поэтому в моем примере я убрал ее, тем самым показав что этот параметр не обязателен. Проще говоря, хотите работать с данными которые пришли в колбек, задайте параметр функции, если нет можете не задавать, на ваш вкус.
Николай Бехтерев написал: Есть способ выяснить за одну функцию (хелп в этом деле скромный помощник, я чуть ли не методом тыка выведываю всё) сразу все флаги? А то как-то нелепо каждый бит bit.band'ом щупать.
Флаги описаны в хелпе, глава "Описание битовых флагов"
Где взять данные о моих открытых позициях?
Пользователь
Сообщений: Регистрация: 23.01.2015
13.04.2016 14:33:15
Кирилл Мазеин, Если язык непривычный, Вы можете перейти на Lua. QPILE мы уже давно признали устаревшим и оставили только для обратной совместимости. Ошибка "Missing assignment" говорит о том что какая-то из переменных не задана.
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
12.04.2016 17:54:30
Цитата
Николай Бехтерев написал: т.е. пустой блок функции не пойдёт? Никак нельзя так:Кодfunction OnFuturesClientHolding(fut_pos)
end
Можно, только смысл какой? Можете хоть так написать function OnFuturesClientHolding() message("сработал OnFuturesClientHolding") end
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
12.04.2016 15:56:49
Здравствуйте, OnFuturesClientHolding(fut_pos) message(type(fut_pos)) end
Где взять данные о моих открытых позициях?
Пользователь
Сообщений: Регистрация: 23.01.2015
12.04.2016 15:24:45
Цитата
Кирилл Мазеин написал: Как я понял, QUIK не знает, что такая таблица существует.
Здравствуйте, Идентификаторы должны быть указаны как строка, то есть в кавычках MYPOS = GET_ITEM("FIRM_HOLDING", 0)
QUIK (версия 7.0.1.5), function OnTrade(trade), трехкратный вызов на одно событие.
Пользователь
Сообщений: Регистрация: 23.01.2015
12.04.2016 12:08:41
Здравствуйте,
Цитата
XXM написал: Милую картинку - три идентичных отклика OnTrade() и два OnOrder(), если не считать разницу в миллисекунды между ними.
Не вижу причин упрека, никто не говорил что в версии 7.2 в этом месте что-то менялось Рекомендуем ознакомиться со списком изменений.
Создание кармана транзакций
Пользователь
Сообщений: Регистрация: 23.01.2015
11.04.2016 20:25:08
Здравствуйте, Выполните очистку данных через меню Система - Заказ данных - Перезаказать данные. В появившемся окне поставить все галки и нажать Перезаказать
Sleep (1) приводит к бОльшим задержкам чем 1 мс.
Пользователь
Сообщений: Регистрация: 23.01.2015
11.04.2016 17:47:41
Цитата
Космонавт написал: ок но Ваш ответ о другом у меня вопрос почему при проходе 61 акции sleep (1) даёт задержку не 61 миллисекунда, а гораздо больше.
потому что 61*15 = 915мс займет обработка цикла. Если проще то sleep не может работать чаще чем ему разрешит операционная система. Частоту системного таймера Windows можно изменить, но это на Ваш страх и риск и рассказывать как это делается мы не будем. К слову если точнее, то частота системного таймера равна 15.625
Sleep (1) приводит к бОльшим задержкам чем 1 мс.
Пользователь
Сообщений: Регистрация: 23.01.2015
11.04.2016 17:37:26
Цитата
Космонавт написал: не понял Вашу мысль переформулируйте пожалуйста по простому, для не программиста.
речь о том что системный таймер Windows имеет свое разрешение, равное 15 миллисекундам. На microsoft есть статься на тему
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2016 12:01:40
Цитата
Николай Бехтерев написал: И такой вопрос, допустим выставление лучшей заявки мы засовываем в коллбек OnOrder, в OnTrade мы получаем информацию о том взята заявка или нет, как исключить момент исполнения двух заявок? Без sleep() и ожидания ответа о том, что заявка снята - тут никак не обойтись, я правильно понимаю?
можно и без speep Например запоминать номер выставленной заявки и перед выставлением новой, проверять исполнилась старая или нет через функцию getOrderByNumber
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2016 10:38:13
вот так сделайте
Код
function OnQuote(class, sec)
if class == "SPBFUT" and sec == "SiM6" then
stock = getQuoteLevel2(class, sec)
OFFER_PRICE = stock.offer[1].price
if (OFFER_PRICE < LAST_OFFER_PRICE) then
--sendTransactio("ТУТ УБИВАЕМ ПРЕДЫДУЩУЮ ЗАЯВКУ")
-- while не выясним убили мы заявку или нет, не выставляем новую.
--sendTransaction
end
LAST_OFFER_PRICE = OFFER_PRICE
end
end
function main()
while is_run == 1 do
sleep(1000)
end
end
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2016 10:34:21
Цитата
Николай Бехтерев написал: какой минимальный набор в main, я чувствую что у меня всё по коллбекам сейчас раскидается. что же оставить в main?
Достаточно в main оставить цикл вида while is_run == 1 do sleep (1000) end
Цитата
Николай Бехтерев написал: А ещё у меня ощущение, что без sleep( ) скрипт, даже если засунуть по коллбекам всё, работать не будет. Я прав? Получается в main засовывается sleep всё равно?
Во первых никто не говорил что надо "все" перетаскивать. Как уже было не раз сказано, перенести надо только проверку и только результат этой проверки (выставление заявки)
Во вторых, рекомендация дана исходя из того кода который Вы привели,, если у Вас код другой рекомендация тоже может быть другой. В общем случае, если есть циклы их желательно держать в main В частном случае (то что Вы написали выше) в цикле (который "while totalnet >= 0 do") нет необходимости и только по этому была дана рекомендация от него избавиться.
Как в LUA осуществить поиск файла в заданной папке с заданным именем ?
Sergey Gorokhov написал: Если функция вернула nil значит файла не существует
Или он занят другим приложением.
с параметром "r+" ??
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2016 09:19:32
Николай, Никто не говорил что main надо убрать. речь о том чтобы перенести проверку и выставление заявки в колбек OnQuote Без main скрипт отработает один раз и остановится.
Виснет lua-индикатор
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2016 06:50:19
Цитата
Вадим написал: Так, с функцией понятно. Значит был неправ. А что с настройкой "Последние 50 свечек" ? Она работает для lua-индикаторов или нет ?
Параметр "Последние ... интервалов" не влияет на обычные и на Lua индикаторы. Влияет только "Фильтр по времени"
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Sergey Gorokhov написал: и проверка на totalnet вам по сути не нужна.
почему? Потому что мы должны на все 100% удостовериться, что сняли заявку и это мы опять в OnTrade смотрим?
OnTrade - это НЕ заявки, это сделки. Если Вам нужно смотреть снятие заявки, это OnOrder
Цитата
Николай Бехтерев написал: Цитатав main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleepНе понимаю почему проверку в OnQuote если всё равно происходит выставление заявки в main? Т.е. допустим мы в OnQuote будем иметь два ценовых уровня OFFER и LAST_OFFER допустим мы сравнили и выяснили, что наша заявка не лучшая, тогда нам всё равно эту перемену как-то нужно передать в main и получится уже два if-then, а значит большая вычислительная мощность, разве нет?
Зачем в main передавать переменную и там ставить заявку когда все можно сделать в OnQuote? Сейчас у Вас как раз код написан не оптимально. Раз есть sleep то значит проверка произойдет с задержкой, а оно Вам не надо Я Вам предлагаю наиболее оптимальный вариант без всяких циклов и sleep. Прислушаться к совету или нет дело Ваше.
Как в LUA осуществить поиск файла в заданной папке с заданным именем ?
Пользователь
Сообщений: Регистрация: 23.01.2015
08.04.2016 06:31:43
Здравствуйте, На сколько становится понятно, задача проще чем кажется. Раз папка и имя файла заранее известны, значит нужно делать не поиск файла а проверить его существование. Это легко делается функцией io.open с параметром "r+" Если функция вернула nil значит файла не существует
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
07.04.2016 14:13:30
и проверка на totalnet вам по сути не нужна.
Может кто уже мучился с лучшим BID, OFFER?!, Пытаюсь реализовать алгоритм выставления лучшими заявками...
Пользователь
Сообщений: Регистрация: 23.01.2015
07.04.2016 14:12:47
В коде действительно много ошибок, но суть понятна В колбеке на стакан Вы обновляете текущую цену. в main проверяете, если она меньше предыдущей то снимаете старую заявку и ставите новую. Однако, лучше убрать проверку из main и перенести ее целиком в OnQuote, только без sleep