Баги QUIK 8.13: * Нет хоткея для показа Lua-скриптов. * У окна стоп-заявок нет якоря, хотя у обычных заявок он есть. * Сделки тоже без якоря. * Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. * Забавно, но "Смена операции клавишей Пробел" не позволяет пробелом ставить галку, например, "Рыночная". * Нужна панель с индикаторами (с значками) запущенных скриптов. * Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов и вылезает за лимит без отправки заявки на сервер, когда по стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает.
Код
Ошибка создания заявки. [GW][332] "Нехватка средств по лимитам клиента.".
* "Ошибку создания заявки" sendTransaction() не возвращает, как ошибку. Да, эту ошибку нельзя заблокировать! В заявках тоже пусто! Только OnTransReply() её ловит на позднем этапе. Вообще все транзакции с статусом==4 можно через sendTransaction() вернуть, а не беспокоить пользователя. Ну превысил в скрипте QTY... ну, верните ошибку скрипту! Юзер тут причем?
* Нужна sendTransactionSync() с гарантированным возвратом последнего trans_reply: - ошибка (БЕЗ ПОКАЗА ОШИБКИ ЮЗЕРУ) - заявка в очереди (PUT_IN_QUEUE) - заявка исполнена или отклонена (FILL_OR_KILL и KILL_BALANCE)
* isConnected() == nil возможно! Похоже это происходит когда QUIK при запуске сразу стартует Lua-скрипт, но функция isConnected() еще не прошла иницилизацию. Я не вижу другого объяснения, почему этот цикл иногда при старте не срабатывает:
Код
function main()
ISRUN = true
while ISRUN and isConnected() == 0 do
sleep(1000)
end
-- код
end
* Нужна галка на авто-перезапуск скрипта, потому при неожиданном разрыве некоторые функции могут вернуть nil и убить скрипт. В Lua нет try-catch. Например:
Код
local minstep = getSecurityInfo("SPBFUT", sec_code).min_price_step
* В 2021г без Unicode?! Сам Unicode по BOM определяется. И давно уже научились отличать Win-1251 от UTF-8. Сам файл можно в любой кодировки читать, а компилировать в Win-1251, если это так важно.
* Возвращаемое значение из OnCalculate() должно быть table, а сейчас такой бред:
Код
function OnCalculate(index)
-- код
return r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15],r[16],r[17],r[18],r[19],r[20],r[21],r[22],r[23]
end
А вот такой код обрабатывает оба варианта возврата:
Код
function OnCalculate(index)
local result
result = {7, 9}
return result[1], result[2], result
end
function main()
str = "R: "
for k, v in pairs({OnCalculate()}) do
if type(v) == "table" then
for k0, v0 in pairs(v) do
str = str.." tbl "..tostring(k0).."="..tostring(v0)
end
else
str = str.." "..tostring(k).."="..tostring(v)
end
end
message(str)
end
И хватит распространять миф об уникальности TRANS_ID. Он почему-то должен быть объявлен, хотя Таблица Заявок утверждает, что nil тоже норм. А уникальным он точно может не быть - просто дополнительное число для фильтрации заявок. Описание в MQL5 аналогичного параметра:
Код
Идентификатор эксперта. Позволяет организовать аналитическую обработку торговых ордеров. Каждый эксперт может выставлять свой собственный идентификатор при отправке торгового запроса
Roffild, Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера. И нафига Вам isConnected? В жизни ни разу не проверял! А Unicode на кой?
Цитата
В Lua нет try-catch.
Господи! Неужели ХОТЬ ЧТО-ТО в этом языке сделано нормально?
Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
Эх... вспомню форумную молодость и покормлю тролля
Цитата
Владимира ;) [QUOTE]Ну, во-первых, это не баги, а во-вторых, при чём здесь "программирование на Lua"? Все эти "пробелом ставить галку" - это интерфейс юзера.
Мне влом разделять тему на две.
Цитата
И нафига Вам isConnected? В жизни ни разу не проверял![QUOTE]Антоха? Ни единого разрыва! :D
[QUOTE]А Unicode на кой? [QUOTE]Современный стандарт IDE.
[QUOTE]Ну и, наконец, а на кой вообще нужен TRANS_ID, если он не уникальный?
Отличать заявки первого скрипта от второго или для дополнительной информации.
Roffild, Ишь ты, "молодость", панимаш! Да ещё и "покормлю тролля"...
Цитата
Мне влом разделять тему на две.
Зачем разделять? Название нормальное придумать.
Цитата
Антоха? Ни единого разрыва! :D
Да бывают разрывы - в чём проблемы? Скрипт просто перестаёт работать, и никакой isConnected для этого нафиг не нужен.
Цитата
Современный стандарт IDE.
И чего? На каждый чих этих долбаных "стандартизаторов" будем курочить софт, который и без того глючный? Чем не устраивает 1251?
Цитата
Отличать заявки первого скрипта от второго или для дополнительной информации.
Чтобы отличать заявки первого скрипта от второго (на кой вообще нужен второй скрипт?) нужна как раз уникальность айдишек. Я вот именно по TRANS_ID ловлю номера заявок для снятия, если они мне не известны, и здесь тоже нужна именно уникальность ID.
1. Такой возможности действительно не предусмотрено. Можем предложить зарегистрировать пожелание на доработку.
2. Режим связанных окон в текущей реализации не предусматривает использование таблицы стоп-заявок как основной таблицы. Можем предложить зарегистрировать пожелание на доработку, в таком случае просьба уточнить, с какую (какие) таблицу Вы хотели бы использовать как связанную в таком режиме? По какому признаку должна производиться фильтрация?
3. Аналогично пункту 2.
4. Просьба уточнить. Правильно понимаем, что настройка умного заказа данных включена, но несмотря на успешное выполнение функции ParamRequest, функция getParamEx не возвращает никаких значений?
5. "Смена операции клавишей "Пробел"" предусмотрена для смены операции на форме подачи заявки (как и следует из ее названия).
6. Просьба подробнее описать желаемый функционал. Как это должно выглядеть и действовать? Готовы зарегистрировать пожелание.
7. Заметим, что в виду отсутствия в торговой системе срочного рынка рыночных заявок, система QUIK выставляет искусственную "рыночную" заявку с ценой равной максимально/минимально возможной по данному инструменту. Если с учетом этой информации описанная Вами проблема сохраняется, просьба прислать подробный пример со снимком экрана, будем разбираться.
8. Уточните, что имеется в виду под "Ошибкой создания заявки"? Ответ от торговой системы? В таком случае, это корректное поведение, так как SendTransaction возвращает ошибку лишь по тем транзакциям, которые в принципе не удалось передать серверу. Для всего остального можно и нужно использовать OnTransReply.
9. Можете подробнее описать, для чего это нужно? Данная возможность уже реализована - OnTransReply
10. Нам не удалось воспроизвести описанную Вами проблему. Если она повторится, зафиксируйте ее пожалуйста и пришлите снимок экрана. Спасибо.
11. Правильно понимаем, что данная опция должна безусловно перезапускать упавший скрипт? Что делать, если скрипт продолжает падать при каждом запуске? Готовы зарегистрировать пожелание.
12. Ваше пожелание зарегистрировано, мы постараемся его рассмотреть. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
13. Данная проблема решается при помощи функции unpack в документации к использованию lua-индикаторов в QUIK даже приведен пример с ее использованием.
14. Trans_ID должен быть уникальным только при импорте транзакций из файла. При отправке транзакции из Lua-скрипта, его значение может быть каким угодно, так как оно используется только для синхронизации внутри самого скрипта (если таковая требуется).
2. Якоря нет у стоп-заявок и сделок. Логика, как у обычных заявок. Связь, вроде, по инструменту. Простой копи-паст. Может еще есть таблицы с Инструментами, но нет якоря...
3. И Lua-таблицу можно по инструменту связать... Специальная колонка заполняется соответствующими данными - вот и связь.
4. Кстати, в окне "параметров индикатора" нет выбора для Lua-значений false/true и пришлось заменить на число.
5. В окне Lua-скриптов под "Остановить" добавить галку "Перезапуск после ошибки" - "Автоматический перезапуск скрипта через 30сек после завершения из-за ошибки."
7. Нужна панель с индикаторами запущенных скриптов. Зеленый квадрат с числом - количество запущенных скриптов. Красный квадрат с числом - количество остановленных скриптов. По панельки можно будет определить: упал скрипт по ошибке или пашет.
8. Из-за невозможности поставить галку "Рыночная" пробелом, пришлось искать "Смена операции клавишей Пробел". Топорно сделано. Лучше нейтральные PgUp/PgDown (правая рука) и ~ (левая рука) под это пустить. Можно в качестве дополнительной возможности - будет из чего выбрать.
9. Возвращаемое значение из OnCalculate() должно быть table. Ну, да... чё-то где-то про table.unpack() проскакивало... Но можно заставить QUIK обрабатывать оба варианта возврата, а не напоминать о костыле Lua. На примере из 1 поста я показал, что это возможно. Языки с динамическими типами заставляют все варианты обрабатывать.
10. isConnected() == nil возможно! Тут явно "гонка потоков". Этот баг отловить непросто. Чтоб 100% избежать бага нужно стартовать скрипты когда все загрузилось. "Окно подключения" появляется после отрисовки графиков на старых данных - вот на этом этапе нужно стартовать скрипты, но не раньше. А может причина проще: забыли переменную в isConnected() инициализировать 0 и она периодически попадает на "грязную память".
11. Настройка умного заказа данных включена. Если в Настройки=>"Получение данных" снять галку "Запрашивать данные раз в … сек.", то ParamRequest() вернет true, но данные не придут. И getParamEx() вернет 0 или старое значение. Проблема именно с переключением галки "Запрашивать данные раз в … сек.". Я эту галку сначала снял, потому что неправильно понял описание, и долго не понимал, почему 0 возвращается.
12. Ошибка о нехватки средств на срочном рынке вылезает из-за расчета ГО мин/макс цены для рыночной заявки. QUIK считает "рыночное" ГО для +500 пунктов, вылезает за лимит и не отправляет заявку на сервер. По стакану достаточно +20 пунктов с запасом на VTB и на ГО депо хватает. Пример: Депо=1000р (чтоб впритык было) VBZ1=5500 с ГО=820р Если заявить на покупку 1 VBZ1 по 5520(5500+20), то все исполнится. Если заявить на покупку 1 VBZ1 по "Рыночной"(5500+500=6000), то "Нехватка средств по лимитам клиента." == "нет денег на ГО".
13. Добавьте "Trans_ID должен быть уникальным только при импорте транзакций из файла. При отправке транзакции из Lua-скрипта, его значение может быть каким угодно, так как оно используется только для синхронизации внутри самого скрипта (если таковая требуется)." в доку sendTransaction(), а то на форуме запутались с уникальностью TRANS_ID. Еще большую неразбериху с TRANS_ID вносит запрет, что он обязателен для Lua-скрипта. Можно снять этот запрет.
10. А теперь с OnTransReply(): С сентября у Сбербанка начались проблемы с соединением. Паровозик раньше ехал стабильно, а сейчас часто стоит. Дисконнекты участились. И как в таких условиях ждать OnTransReply()? Надежнее мониторить таблицу заявок для 100% статуса. И если заявка уже принята сервером, то логично ожидать с номером 0 (означает, что до МБ не добралась) даже после дисконнекта. Такие заявки должны хранится сервером не более часа. По таким заявкам проще сделать цикл ожидания. А еще из-за особенности поточности Lua-скриптов, событийная модель - ненадежное решение. sendTransactionSync() должно решить проблему Lua-программистов, но решать заморочки с плохим соединением придется уже вам.
3, 4, 5... да ещё и с кривой нумерацией... вот АБСОЛЮТНО ничего нафиг не нужно из всего этого потока заявлений ветки с наглым названием "Баги QUIK". Кстати, один из моих брокеров как раз Сбербанк, скрипт работает каждый (рабочий) день, с утра до вечера, никаких "проблем с соединением" не замечено. Да, раза два или три связь рвалась, но она и раньше точно так же рвалась, и не только у Сбера. В чём проблемы-то? Ах, в OnTransReply? Так она тоже нафиг не нужна! И мониторить таблицу заявок нафиг не нужно. И уж сервер Вам АБСОЛЮТНО ничего не должен. И событийная модель никакого отношения к "особенности поточности Lua-скриптов" не имеет. И sendTransactionSync нафиг не нужна - я даже не знаю, что это вообще такое, Но упаси, Господи, ей "решать проблему Lua-программистов". Особенно, если никаких проблем нет. В общем, "дело было не в бобине".(с)
Roffild, Ага, только его там не хватало! Во-первых, цена и так есть в "Таблице заявок", во-вторых, она нафиг не нужна - скрипт и сам прекрасно знает, что и по какой цене он делал. В-третьих, "Состояние счёта" нужно только для контроля соответствия портфеля со стороны скрипта и со стороны брокера (я это дело проверяю примерно раз в неделю) и ни для чего более.
Roffild написал: 10. isConnected() == nil возможно! Тут явно "гонка потоков". Этот баг отловить непросто. Чтоб 100% избежать бага нужно стартовать скрипты когда все загрузилось. "Окно подключения" появляется после отрисовки графиков на старых данных - вот на этом этапе нужно стартовать скрипты, но не раньше. А может причина проще: забыли переменную в isConnected() инициализировать 0 и она периодически попадает на "грязную память".
У меня много скриптов, где есть isConnected(). Ни разу подобной проблемы не было. Если вы таки сталкивались с подобным, то порекомендую условие в цикле модифицировать так или наоборот и всё:
Касательно пункта 15. Могли бы Вы уточнить, для чего Вам нужен данный функционал, ведь значение цены последней сделки можно получить из таблицы текущих торгов ?
касательно пункта 16. Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Roffild, Вас же просили объяснить, ЗА КАКИМ ХРЕНОМ Вам это надо? Вы что, не знаете цену своей последней сделки? Выбросьте Ваш софт на помойку! И не забивайте всяким говном общий софт - он написан и для нормальных пользователей!
10. Странный isConnected() получается. Сейчас глянул в лог: 9:10:39 Соединение установлено 9:10:40 Введите PIN 9:10:43 MyLua started (isConnected() == 1) 9:12:35 Двухфакторная аутентификация прошла успешно
Если бы MyLua начал торговать до PIN, то словил ошибки...
17. Шаблоны для графиков только цвета меняют. Шаблон должен график очистить и все настройки с индикаторами восстановить с 0. В МТ5 это нормально сделано, а в Квик - бред какой-то.
[QUOTE=Sfinexer]Снял якорь с таблицы стоп заявок, но полный список не вывелся, как сделать вывод всего списка что был ранее?Есть такой баг: фильтры после снятия якоря не восстанавливаются.
Касательно 15 пункта. Вы можете получить данное значение средствами Qlua. Значение полей таблицы заявок можно получить, используя функцию "getItem". Подробнее об этом можно почитать в документации QLUA.chm в разделе "Функции для обращения к строкам произвольных таблиц QUIK" в пункте "getItem". Также рекомендуем обратить внимание на пункт документации "Таблицы, используемые в функциях «getItem», «getNumberOf» и «SearchItems»".
Касательно 17 пункта. Правильно понимаем, Вы хотите, чтобы индикаторы сохранялись в шаблоны, чтобы при применении данного шаблона на новое окно с графиком появлялись и индикаторы, добавленные в шаблон? Если да, то на данный момент это сделать нельзя. Можем зарегистрировать пожелание на добавление данного функционала. Если нет, просьба уточнить, о чём идёт речь.
Касательно снятия якоря с таблицы стоп-заявок. Предлагаем в настройках таблицы заявок в списке "Выбранные классы" нажать на используемый класс, нажать на "..." напротив "Фильтр инструментов" (См. скриншот 1) и добавить все инструменты в "Выбранные инструменты" (См. скриншот 2).
Предлагаем в настройках таблицы стоп заявок в списке "Выбранные классы" нажать на используемый класс, нажать на "..." напротив "Фильтр инструментов" (См. скриншот 1) и добавить все инструменты в "Выбранные инструменты" (См. скриншот 2).
В настраиваемом наборе горячих клавиш отображаются только те горячие клавиши, которые использует сам терминал и которые могут быть перенастроены пользователем. Кроме этого существуют горячие клавиши, которые используются системой и не могут быть изменены, например, Alt+F4 (закрытие окна) или Ctrl+F6 (переключение между окнами). Поэтому отсутствие сочетания Ctrl+f6 в списке "горячие клавиши по умолчанию" является правильным, а вот тот факт, что эту комбинацию можно установить для другой команды является ошибкой, которую мы постараемся исправить в одной из очередных версий ПО.
Касательно пункта 10. Терминал не даст возможность торговать до подключения. Выйдет соответствующее сообщение "Not connected" в окне сообщений (См. скриншот 1).
Касательно пункта 15. Могли бы уточнить, для чего Вам необходимо видеть в таблице "Состояние счёта" цену Вашей последней сделки, если её можно увидеть в таблице сделок ?
Касательно пункта 17. Правильно понимаем, Вы хотите, чтобы при выборе шаблона на графике удалялись метки, рисунки и тд., а также все настройки с индикаторами восстанавливались с нуля ?
Кроме этого существуют горячие клавиши, которые используются системой и не могут быть изменены, например, Alt+F4 (закрытие окна) или Ctrl+F6 (переключение между окнами).
Alt+F4 действительно нужно ловить особым способом, как и CTRL+ALT+DEL. Все остальные комбинации без проблем обрабатываются стандартным методом:
Да и Ctrl+F6 не "переключает между окнами" в Винде - это уже фантазии ваших программистов.
Цитата
Касательно пункта 10. Терминал не даст возможность торговать до подключения. Выйдет соответствующее сообщение "Not connected" в окне сообщений (См. скриншот 1).
Это после isConnected()==1, но до "Двухфакторная аутентификация прошла успешно"? 100% баг!
Цитата
Касательно пункта 15. Могли бы уточнить, для чего Вам необходимо видеть в таблице "Состояние счёта" цену Вашей последней сделки, если её можно увидеть в таблице сделок ?
То есть, вместо дополнительно столбика мне предлагаете: еще одно мало информативное окно втиснуть между 10? Гениально! У вас для расчета "Баланса" уже инфа по сделкам получается вообще-то - просто в отдельный столбец последнюю сделку закинте.
Цитата
Касательно пункта 17. Правильно понимаем, Вы хотите, чтобы при выборе шаблона на графике удалялись метки, рисунки и тд., а также все настройки с индикаторами восстанавливались с нуля ?
ДА!!! В MetaTrader так и сделали уже 20 лет назад... И в МТ5 используется формат INI для всех настроек, что позволяет точнее подобрать размеры графовых окон.
P.S. А тут программисты Квика появляются, и только "операторы из Ростелекома"???
Касательно пункта 10. Ваше письмо получено, проблема изучается. Постараемся в ближайшее время дать ответ.
Касательно пункта 15 и 17. Ваши пожелания зарегистрированы. Мы постараемся рассмотреть их и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожеланий в будущих версиях ПО.
Касательно пункта 18. Просьба подробно описать, для чего Вам необходим данный функционал.
Касательно пункта 19. Ваше пожелание зарегистрировано. Мы постараемся рассмотреть его и сообщить Вам результаты анализа. Впоследствии, по результатам анализа, будет приниматься решение о реализации пожелания в будущих версиях ПО.
Это принципиальная невозможность написать такую функцию, которая бы гарантировала правильность результата.
если вам мало приведенной выше причины, по которой это невозможно, существует ещё много причин, по которым это невозможно. В частности, проверка соединения при помощи isconnected() даёт вам информацию о наличии в данный момент времени соединения с сервером брокера, но ничего не рассказывает о доступности и статусах шлюзах к разным торговым площадкам.
поэтому единственно правильный путь - это предварительные проверки при помощи isconnected(), параметров-статусов инструмента и т.д., чтобы получить приблизительное понимание, можно ли отправлять транзакции по вашему инструменту, после чего попытки торговли с обязательным анализом ответа сервера на вашу транзакцию.
s_mike@rambler.ru написал: Это принципиальная невозможность написать такую функцию, которая бы гарантировала правильность результата.
если вам мало приведенной выше причины, по которой это невозможно, существует ещё много причин, по которым это невозможно. В частности, проверка соединения при помощи isconnected() даёт вам информацию о наличии в данный момент времени соединения с сервером брокера, но ничего не рассказывает о доступности и статусах шлюзах к разным торговым площадкам.
Я "невозможных" задач не ставлю, потому что примерно представляю, как это реализовать. Сервер Квика уже сейчас знает, что биржа ушла на клиринг, выходные, дисконнект и т.п. - вот и пусть сообщит скрипту.
Да, и слово "гарантия" смешно к халтурному QLUA... Конечно, продукт не массовый, но от ПО для биржи с её лиардами хотелось бы большей продуманности...
Roffild написал: Нужна нормальная функция, которая точно ответит на "Торговля разрешена?"
Нормальной нет, но можно же накидать доп проверок, чтобы свести точность до приемлемого уровня. isConnected - это и так понятно, проверяем наличие подключения к брокеру Проверяем параметр "TRADINGSTATUS" из ТТТ. - Параметр тормозной, в пики нагрузок (на открытии утром торгов и при открытии вечерней сессии) наблюдал задержки 3-5 секунд, но уже лучше чем ничего, если не скальперить, то этого уже более чем достаточно.
Пишем и прикручиваем функцию проверки на праздничные/выходные дни и время работы биржи. Благо все эти параметры известны заранее. При синхронизированных системных часах точность очень хорошая. Я еще дополнительно проверяю соответствие локального времени и время последней свечи на высоколиквидном инструменте (SI).
Anton написал: Таки я посмотрел. В PythonDLL в additional dependencies ожидалось бы увидеть notelemetry.obj, чисто для феньшую. Ну хотя бы в релизном конфиге.
PythonDLL для MQL5 - интересный проект. Пока пытался добавить makemoney.obj, пофиксил PyTorch и *Boost и др. EURUSD выбесил окончательно. Никто правок не предложил.
Биржа после Форекса более предсказуема. Но QLUA - это наспех прикрученная функциональность, а не полноценная система с продуманным API. Между сервером и QLUA нет полноценного торгового контроля.
15. Таблица futures_client_holding не имеет цену последней сделки, да ещё обновляется раньше trades(сделки)! ппц... бот закрывает текущую сделку, но на основании ПРЕДЫДУЩЕЙ сделки. Таблица futures_client_holding должна иметь цену последней сделки. И futures_client_holding - это "Состояние счета", поэтому 15 пункт.
Цитата
15. Не Lua, а про окно "Состояние счета" вообще-то. "Баланс" - средняя цена за день. Я хочу последнюю сделку видеть.
Как уже было описано выше, пожелание на добавление данного функционала уже было зарегистрировано от Вас.
В БагТрекере можно редактировать детали. А поскольку 15 пункт из косметического превратился, в невозможность найти актуальную цену для стоп-лося... пора бы "редактировать детали" и повысить приоритет.
Хотя бы ссылку на тему в БагТрекере указываете? А то это похоже на игру "Сломанный форум" с программистами Квика...
Касательно пункта 10. Для функции isConnected в документации дано следующее описание: Функция предназначена для определения состояния подключения клиентского места к серверу. Возвращает «1», если клиентское место подключено и «0», если не подключено.
Т.е. функция работает именно так, как написано. В случае двухфакторной аутентификации сначала происходит соединение с сервером (после чего isConnected начинает возвращать 1), а потом сервер инициирует запрос у терминала второго фактора, при этом терминал не знает в момент соединения (да и не должен из соображения безопасности знать), будет ли у него запрашиваться второй фактор, или же нет. В качестве выхода из ситуация мы рекомендуем писать Lua-скрипт так, чтобы он анализировал наличие конкретных торговых данных, таких как заявки, сделки), они будут получены только после установления соединения и прохождения двухфакторной аутентификации (если она настроена).
Касательно пункта 15.
Цитата
Roffild написал: ...обновляется раньше trades(сделки)! ппц... бот закрывает текущую сделку, но на основании ПРЕДЫДУЩЕЙ сделки. Таблица futures_client_holding должна иметь цену последней сделки...
Правильно Вас понимаем, что Вы хотите повысить приоритет пожелания, потому что Ваш бот анализирует таблицу "Состояние счёта", а не таблицу сделок ?
В случае двухфакторной аутентификации сначала происходит соединение с сервером (после чего isConnected начинает возвращать 1), а потом сервер инициирует запрос у терминала второго фактора, при этом терминал не знает в момент соединения (да и не должен из соображения безопасности знать), будет ли у него запрашиваться второй фактор, или же нет.
Терминал ДОЛЖЕН знать, что будет второй фактор, потому что это еще СТАДИЯ ПОДКЛЮЧЕНИЯ. Инфа о том, что будет второй фактор или нет, не является секретной, потому что второй фактор ИДЕТ ПО УМОЛЧАНИЮ. Вообщем, кто-то накосячил с статусом второго фактора, а вместо фикса получаем бред про безопасность.
QLua - часть QUIK, а не совершенно левая абстракция. Поэтому довод про безопасность Квика внутри самого Квика... Вы баги исправляйте, а не сценарии для Нолана сочиняйте.
Цитата
В качестве выхода из ситуация мы рекомендуем писать Lua-скрипт так... Правильно Вас понимаем, что Вы хотите повысить приоритет пожелания, потому что Ваш бот анализирует таблицу "Состояние счёта", а не таблицу сделок ?
Э... похоже программисты для ARQA Technologies - это как Дотеры для остальных...
Программисты работают с API, которое вы им предоставляете. Хватит учить меня программировать! Когда плохое и непродуманное API, то надо его улучшать, а не "мы рекомендуем писать Lua-скрипт так".
Код
-- Закрытие по stoploss реальных позиций.
for k, v in pairs(getTable("futures_client_holding")) do
k = nil
if v.totalnet == nil or v.totalnet == 0 then
-- continues --
else
k = initSymbol(v.sec_code)
end
if k then
open = v.avrposnprice
for k1, v1 in pairs(getDeals(1, nil, nil, v.sec_code, nil, v.trdaccid)) do
-- В futures_client_holding нет реальной цены последней сделки
open = v1.price
-- БАГ: Только вот из-за рассихрона таблиц, в Сделках цена тоже может быть НЕ ПОСЛЕДНЯЯ!
end
LASTTRANS = nil
if v.totalnet > 0 then
close = tonumber(getParamEx2("SPBFUT", v.sec_code, "BID").param_value)
if close == nil or close == 0.0 then
-- continues --
message("No data!")
elseif close <= (open - k.stoploss) then
log:write("buy close "..tostring(close).." "..tostring(open).." "..tostring(open-close).."\n")
LASTTRANS = sendOrder(createOrder("SPBFUT", v.sec_code, v.trdaccid, nil,
true, close - k.depth, math.abs(v.totalnet)))
end
else
close = tonumber(getParamEx2("SPBFUT", v.sec_code, "OFFER").param_value)
if close == nil or close == 0.0 then
-- continues --
message("No data!")
elseif close >= (open + k.stoploss) then
log:write("sell close "..tostring(close).." "..tostring(open).." "..tostring(open-close).."\n")
LASTTRANS = sendOrder(createOrder("SPBFUT", v.sec_code, v.trdaccid, nil,
false, close + k.depth, math.abs(v.totalnet)))
end
end
if waitTrans(LASTTRANS) then
goto continues
end
end
end
Roffild, Да неплохо бы и поучить Вас программировать. Программисты спокойно работают с любым "плохим и непродуманным API", а не скулят здесь по каждому чиху, да учат, как надо его улучшать по их доморощенным представлениям.
Владимир написал: Roffild, Да неплохо бы и поучить Вас программировать. Программисты спокойно работают с любым "плохим и непродуманным API", а не скулят здесь по каждому чиху, да учат, как надо его улучшать по их доморощенным представлениям.
О, тролль проснулся... ну... давай, покажи класс! Как нужно изменить код выше?
Roffild, Тролля в зеркале поищите. Заняться мне больше нечем, кроме как в коде очередного скулящего ковыряться. А свои проблемы со скриптом я давно решил. Все до единой.
Владимир написал: Roffild, Тролля в зеркале поищите. Заняться мне больше нечем, кроме как в коде очередного скулящего ковыряться. А свои проблемы со скриптом я давно решил. Все до единой.
На троллинг время ты же нашел, а на код уже нет?
Эх... быстро же слился тролль... а я уже приготовился гениальное решение проблемы увидеть.