С 1 марта, когда торги начались в 7 утра, каждый раз вижу, что в начале торгов Квик как бы зависает и не получает данные по стакану и сделкам. В течение секунд 15-ти эти данные оказываются потерянными. Возможно, это связано с потоком мелких сделок, но до 1 марта я этого не замечал. Это у меня одного так?
Сегодня перед началом торгов жулики заспамили стакан заявками по 1 акции (ВТБ ликвидность), так что не было видно лучшей цены на покупку и продажу. Как это выглядит с точки зрения биржевых понятий? На это имеет смысл жаловаться в мосбиржу или с этим только в "Спортлото"?
Сейчас обновил версию на 11.4.0.54 и заметил, что соединение с брокером разорвалось 50 мин. назад, Интернет есть, а Квик не пытается восстановить соединение. Настройки по проверке связи стандартные. Прошлая версия сегодня пыталась восстановить соединение при обрыве.
Сервер точного времени ntp1.stratum2.ru, по которому я ставлю часы, уже 2-й день выдаёт ошибки при замере времени: ошибка: 0x800705B4. Что случилось, и как исправить? Пока пользуюсь сервером из СПб, но там задержка сети может отличаться от московской.
Хочется узнать, имеет ли смысл написать книжку по работе в Quik: настройка, основы программирования на Lua и в Си на примерах получения котировок и обезличенных сделок по заданным тикерам, использование функций Lua и QLua?
Смотрю, какое-то старьё по сходным темам на распродаже: ozon.ru/search/?text=книга+торговый+терминал+quik ozon.ru/category/skalping-treyding/
То ли книжки плохо покупают, потому что скачивают ворованные в pdf, то ли программировать для домохозяек и пенсионеров сложно. Поэтому толстые книжки писать неохота...
Можно ли будет найти рекламодателей (за рекламу в книжке автор тоже что-то получает)?
В 9:50 выставил заявку в квике, перезагрузился для отмены алгоритма Нейгла, опять запускаю квик, на ввод пароля получаю сообщение, что у меня какие-то неправильные ключи и что-то не то с авторизацией, и так 2 раза.
А что было бы, если бы я попытался залогиниться в 4-й раз? Я, наверно, попал бы на блокировку аккаунта?
А волатильность сейчас высокая, может потребоваться срочно снять заявку (так оно и случилось), а то при её выполнении я стану должен брокеру хорошую сумму, а цена может пойти ещё ниже... Я методом тыка выбрал дополнительный сервер у брокера для связи и тогда только смог залогиниться.
Вопрос: что это была за ерунда такая?
Иногда я для подстраховки держу запущенную торговую программу на телефоне, но особого спокойствия всё равно не чувствую...
В таблице "Текущие торги" в столбце "Кол. спрос" вижу отрицательное число акций, при этом в стакане в строке по цене лучшей покупки это число выводится нормально и если его сложить с модулем числа в столбце "Кол. спрос", то получается > 4 млрд (> UINT_MAX). Когда в стакане в этой строке число акций становится < 2 млрд., в таблице торгов это значение совпадает со значением в стакане.
Вывод очевиден: в этой таблице Квика (а, возможно, и в других) количества акций для покупки/продажи хранятся в типе int (32 бита со знаком (на фига ещё и со знаком?)), поэтому происходит переполнение разрядной сетки.
Хочу предупредить, что я в стакане по этой акции на moex по лучшей цене покупки видел заявок в сумме > 3.5 млрд., поэтому сразу меняйте тип этих чисел на int64 (т.к. Lua не понимает uint64).
В OnAllTrade получаю цену акции, а она там имеет тип double (в отличие от getQuoteLevel2, где она в виде строки). По какому сишному формату для printf можно вывести double без правых незначащих нулей, если неизвестно, сколько значащих цифр в дробной части? Формат %g это делает, есть ли там есть риск, что он может вывести число с экспонентой? Неужели в си это невозможно? Я с пом. поиска ответа не нашёл. А скрипт на Lua просто берёт и выводит это, как мне надо. Как он это делает, вручную удаляет в строке правые нули? https://learn.microsoft.com/ru-ru/cpp/c-runtime-library/format-specification-syntax-printf-and-wprin...
В main написал: collectgarbage('stop'), но при присваивании нового значения длинной строке в окне скриптов вижу, как занимаемая этим скриптом память сразу сильно уменьшается. Как это объясняется?
6 мая у тикера LQDT поменяли класс бумаги с TQTF на TQTF_F. Сегодня запустил Квик, а он в окне графики не показывает график для LQDT за 6 мая, а последний день у него 3 мая... Хотя, 6 мая Квик показывал график за 6 мая. Приложение на Андроиде показывает историю за 6 мая, поэтому проблема в Квике...
bid TABLE Котировки спроса (покупки). При отсутствии спроса возвращается пустая строка
Видимо, должно быть "... возвращается пустая таблица"? Ведь bid это таблица... Аналогично надо исправить для таблицы offer.
А что сейчас возвращает getQuoteLevel2 при отсутствии спроса/предложения, пустую таблицу? Я не могу это проверить...
Далее, при описании структур таблиц bid и offer надо написать, что эти таблицы являются массивами из таблиц, каждая из которых состоит из двух пар ключ-значение, причём, значение для ключа quantity заканчивается на подстроку ".0", которую необходимо удалять. Это, чтобы не удивлялись... Неплохо бы привести пример для пояснения структуры всей этой таблицы для стакана.
Аналогичные исправления надо сделать в англоязычной версии этого файла, в Lua Interpreter.pdf.
Если есть просто строка Lua, ссылок на которую нет в таблицах, то изменение такой строки не повлечёт неожиданностей в работе скрипта? Возможные варианты: длина строки не меняется/уменьшается. Мне кажется, это может повлиять только на подсчёт хэша от этой строки, а кому он нужен в данном случае? Но, как я заметил по исходникам Lua, у Lua есть какой-то кэшбуфер удалённых сборкой мусора строк, я не понял, что это такое и для чего он используется...
Примечание: если dll уменьшает размер строки, то она корректирует это в поле длины строки (и если надо, типе строки: короткая/длинная строка).
Пытаюсь перенести обработку OnQuote и OnAllTrade в поток main. C OnAllTrade приходит ссылка на таблицу alltrade:
Код
function OnAllTrade(alltrade)
Сама таблица alltrade находится в стеке вызова этого коллбэка (очевидно, в стеке тоже ссылка, а сама таблица ещё где-нибудь?)
Если я эту ссылку на alltrade помещу в очередь и выйду из OnAllTrade, то не получится ли так, что после выхода из OnAllTrade эта таблица окажется мусором?
Аналогичный вопрос с OnQuote, которая вызывает getQuoteLevel2 и помещает возвращаемую ей таблицу (ссылку на неё) в ту же очередь для обработки в main.
Мне что, перед выходом из этих функций отключать сборку мусора, а после обработки всей очереди в main опять включать??
С каждой записью в файл утекает ~ 50 байтов памяти, а почему она не собирается сборщиком мусора??
Код
local mess = 'abc'
local function toFile()
local lf=io.open('srrhb346fhs', 'ab')
lf:write(mess)
lf:close()
end
function main()
for i = 1, 20 do
toFile()
sleep(1000)
end
end
Сегодня наблюдал сабж по некоторой акции на мосбирже с пом. моего скрипта с OnAllTrade. При этом время сделки было то же самое по самую микросекунду. Это произошло сразу после смены цен покупки/продажи. Как такое возможно? Действительно ли эти 339 сделок произошли менее, чем за 1 мкс?
Можно ли где-то получить общее представление о том, как организованы торги на мосбирже и какие там характеристики у серверов (какая ОС, память, ЦП, диски, пропускной канал, ...)? Т.е. как бы совершить виртуальный тур по бирже. Примерно, как в видео на ютюбе о работе tsmc, где клепают лучшие ЦП.
Кто знает, сабж для всех инструментов один? Такое впечатление, что нет, сегодня в моём инструменте, по-моему, заявки начали принимать раньше 19:00:01. Возможно, чтобы свои люди, кому хотелось очень продать, встали в очередь пораньше.
Хочу посмотреть пример dll на C, которая обрабатывает коллбэк (напр., OnAllTrade) и для ускорения работы передаёт обработку коллбэка в заранее созданный повторно используемый поток и сразу делает выход. Примеры на C++ не очень интересуют...
И ещё подскажите, в каком потоке работает сборщик мусора? В main, в Квике или в своём собственном? И этот сборщик существует для каждого скрипта свой?
Как-то уже об этом писал... Есть строка mess (age), в которой коллбэки накапливают свой вывод, при превышении определённой длины строка записывается в файл. Потом обычно пишут mess='', чтобы сбросить длину строки в 0, но что в этом случае произойдёт? Создастся новая строка, или в структуре TString для этой строки её длина установится в 0? Я не вижу, где хранится число байтов, выделенных под строку, и как контролируется выход за её предел при дописывании к строке? Не хочется ненужного пересоздания строки и сборки мусора, а хочется просто зарезервировать под строку 10 Мб и использовать эту же память под строку постоянно. Зачем выметать сор из избы строки, если можно обойтись без этого? Как это всё оптимизировать и сделать, как в нормальных языках типа того же си?
Сегодня увидел, что кое-кто на западе советует установить самые быстрые и бесплатные DNS 1.1.1.1 и 1.0.0.1, например: nimaboldi.uz/как-настроить-в-windows-10-самый-быстрый-dns/ Есть ли от этого польза В РФ? А есть ещё DNS от Гугла 8.8.8.8. Что из этого всего лучше?
В Луа нет опции предупреждать об использовании необъявленных переменных, как это сделано в Перле, поэтому могут возникать труднонаходимые ошибки. Есть ли какие-нибудь сторонние программы для проверки скриптов на такие описки?
Брокер ограничивает глубину стакана в 20/20, я установил 10/10. Во время выставления предварительных заявок (аукцион открытия) наблюдал такую картинку в стакане: виднеются 10 заявок на покупку и 10 на продажу, многие из них пересекаются. При этом по цене, которая через неск. сек. станет лучшей ценой покупки, видно много акций, а по цене на шаг выше не видно предложений продать, видны только предложения купить. В 1-й момент я подумал, что намечается какое-то мошенничество, почему-то захотелось снять свою крупненькую заявку на покупку и начать рвать на себе все волосы, раскладывая их в аккуратные кучки...
Но во 2-й момент я догадался, в чём дело: по логике программиста, если в стакане присутствуют 10 строк с красным фоном (на продажу) и 10 с зелёным, но при поступлении заявки на продажу ничего отображать не надо, хотя, общее число строк в стакане < 20 из-за пересечения довольно многих заявок на покупку и на продажу.
Раньше я удивлялся, для чего выставляют заявки на продажу по каким-то смешным ценам и, соответственно, на покупку? Возможно, это специально спамять стакан, чтобы у тех, кто ограничил его глубину, не было видно заявок по ценам, которые станут лучшими в момент начала торгов.
Не знаю, обсуждалось это или нет на форуме и как решить этот вопрос... Возможно, стоит подумать, чтобы отображать более 10 заявок на покупку/продажу, если общее число строк в стакане (в моём случае) < 20?
Немного подправил пример, который видел на стр. https://quik2dde.ru/viewtopic.php?id=79 dll файл получился меньше 20 Кб. Искал примеры, чтобы не выскакивало окно консоли, смотрел примеры через виндовс скрипт хост (расширение файла .vbs). Если запускать в Проводнике, то окнА консоли нет, а если в Квике, то есть, не понял, почему...
Убрал проверку на ошибки. mci с MessageBeep микшируется, а mci с mci не смог смикшировать. И в том и моём примере mci устройство после завершения скрипта остаётся открытым. В OnStop или в OnClose надо бы закрыть, или ну его? Я пробовал вставить mciSendString("CLOSE QUIK_MP3", NULL, 0, NULL); в DllMain, когда приходит сообщение DLL_THREAD_DETACH, опять нарвался на зависание Квика...
#include <windows.h>
#include <mmsystem.h>
/*
// #include <stdbool.h>
#define bool _Bool
#define true 1
#define false 0
*/
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
/*
// Стандартная точка входа для DLL
bool APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{ return true;
}
*/
static int forLua_mciSendString(lua_State *L)
{ mciSendString("CLOSE QUIK_MP3", NULL, 0, NULL);
mciSendString(lua_tostring(L, 1), NULL, 0, NULL);
mciSendString("PLAY QUIK_MP3", NULL, 0, NULL);
return 0;
}
static int forLua_MessageBeep(lua_State *L)
{ MessageBeep(lua_tointeger(L, 1));
return 0;
}
// список реализованных в dll пользовательских функций
static struct luaL_Reg ls_lib[] =
{ {"mciSendString", forLua_mciSendString},
{"MessageBeep", forLua_MessageBeep},
{NULL, NULL}
};
// Имя dll должно быть playsnddll, как написано ниже!
__declspec(dllexport) int luaopen_playsnddll(lua_State *L)
{ luaL_newlib(L, ls_lib);
return 1;
}
Это playsnd.lua:
Скрытый текст
Код
-- Предполагается, что эта dll лежит в подпапке "скрипты" папки Quik
package.cpath = package.cpath .. ';' .. getWorkingFolder() .. '\\скрипты' .. '\\playsnddll.dll'
local playsnddll = require('playsnddll')
-- Эту функцию можно удалить и вызывать напрямую playsnddll.mciSendString
local function PlaySoundFile(file_name)
playsnddll.mciSendString('OPEN "' .. file_name .. '" TYPE MpegVideo ALIAS QUIK_MP3')
end
function main()
playsnddll.MessageBeep(0x10)
-- playsnddll.MessageBeep(0)
PlaySoundFile('C:\\Windows\\Media\\chord.wav')
playsnddll.mciSendString('OPEN "' .. 'C:\\Windows\\Media\\ringout.wav' .. '" TYPE MpegVideo ALIAS QUIK_MP3')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Hardware Fail.wav')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Hardware Insert.wav')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Error.wav')
-- PlaySoundFile('C:\\Windows\\Media\\Windows Message Nudge.wav')
end
Заметил такую особенность: если вывести окна, которыми управляет Виндовс (через ShellExecute) (Система/Загрузить настройки из файла, Система/Сохранить настройки в файл) и переместить их на другое место, то в след. раз они рисуются уже на том месте, где были в последний раз. А другие окна (напр., Система/Настройки/ Основные настройки) рисуются всегда посередине экрана, а окно Сервисы/Lua скрипты у меня может нарисоваться в разных местах, если даже его не передвигать. Желательно где-то в настройках запоминать координаты и размер выводимых окон и рисовать их посередине экрана (или в другом стандартном месте), если разрешение экрана (или размер окна Квика, если он не в полноэкране) изменилось.
Это может иметь значение, если на экране имеются стаканы с заранее установленным количеством акций в поле Q, настроенные на выставление заявок по щелчку мыши. После какого-то обновления Виндовс 10 я начал замечать в ней такую ошибку: щёлкаешь на каком-то окне, к примеру, на кнопке ОК или Отмена, это окно закрывается, а этот же щелчок мыши ещё раз отрабатывается на окне, которое было под ним. Так один раз я щёлкнул в окне, которое было поверх стакана, на стакане вторично отработался этот щелчок и я совершил сделку по продаже 500000 акций по цене покупки. На самом деле я щёлкнул в столбце продажи на очень маленькой цене, хорошо, что биржевой алгоритм достаточно интеллектуален и в этом случае продаёт не по щёлкнутой цене, а по лучшей цене покупки. А то так можно было бы одним щелчком уполовинить свой депозит у брокера и скончаться от инфаркта прямо на рабочей табуретке, как какой-нибудь основатель Рамблера в 48 лет... Пришлось тут же снова покупать эти 500000 акций по лучшей цене продажи. Поэтому теперь, чтобы щёлкнуть на окне поверх стакана, я сдвигаю это окно так, чтобы щёлкать над столбцом с ценой акций, это приводит только к перемещению подсветки строки в стакане. Или перед открытием окна перехожу на вкладку, скажем, Новости.
Та же ошибка в Виндовс приводит к тому, что, напр., щёлкаешь по меню Расширения, оно открывается и тут же закрывается, т.е. один щелчок мыши (особенно, если время нажатия было не сверхмаленьким) считается за два щелчка или за двойной щелчок. (Мне известно, что эти параметры настраиваемые, но после этого обновления Виндовс я их не менял.)
Этот же эффект я наблюдал на Ютюбе: напр., щёлкаешь в окне видео по треугольничку, чтобы поставить видео на паузу, этот треугольничек начинает делать анимацию shape tween, постепенно превращаясь в две вертикальные черты, но до конца эта анимация не доходит и возвращается назад к треугольничку. Иногда, чтобы поставить видео на паузу, приходится несколько раз щёлкать по треугольничку.
Кто-то ещё замечал с некоторых пор подобный эффект?
Не хватает функции CreateWindowEx (из набора сервисных функций qlua). Она должна принимать также название вкладки, на которой должна будет создать окно. А то на текущей вкладке может не быть места для окна, приходится его вручную перемещать на другую вкладку. Под названием вкладки я имею в виду текст, который на ней написан в Квике, напр., "Графики", "Новости". Разумеется, должны быть и остальные функции с добавкой Ex для работы с окнами, напр., DestroyTableEx.
Сейчас вижу баг с этим сайтом: вместо показа страницы браузер предлагает сохранить её содержимое на диск. К примеру, вот что сохраняется из корня сайта:
Иногда надо быстро набрать в стакане в поле Q количество акций для заявки, а в это время выскакивает окно сообщений и приходится щёлкать по полю ввода для возврата фокуса. Это нервирует и способствует ошибкам. Можно сделать так, чтобы при появлении этого окна фокус ввода возвращался на прежнее место. Насколько я знаю, Win API возвращает хендл окна, у которого был отнят фокус ввода.
На основе w32.dll сделал на C маленькую mydll.dll для проигрывания звуков MessageBeep и mciSendString. Она работала, но через некоторое время перестала и при запуске соотв. Lua скрипта выдавалось сообщение "C stack overflow". Я 2 дня по-разному менял код, но это сообщение оставалось. Похоже, что эта ошибка стала появляться после очередного обновления Квика, т.к. кроме этого всё оставалось тем же со времени, когда mydll.dll работала. Остальные мои аналогичные dll продолжают работать. Только что методом тыка я поменял имя dll с mydll.c на такое же моё имя, что работает: на luacdll.c (luacdll.dll). И эта dll стала работать. От одного только переименования файла!
Насколько я понял, акции, которые не связаны с долларом, продавать не стоит?
Автор Ютюб канала "Профита нет" часа два назад сказал, что в такое время очень хорошо перекладываться в фонды ликвидности, но я сейчас вижу, что там тоже много продают, и началось это с вечерней сессии. Не стоит обращать на это внимание, или тоже выйти в кэш?
Случайно нашёл ссылку https://arqatech.com/upload/Public/quik_lua.zip Внутри этого архива в папке examples лежат старючие примеры lua программ. Внутри аналогичного архива, который можно скачать со стр.https://arqatech.com/ru/support/files/ папки examples нет. Что это значит: эти примеры устарели, или засекречены, или теперь только за деньги?
Почему не дают доступ к папке arqatech.com/upload/Public/ ? Может быть, оттуда можно ещё что-то полезное накачать? Тут говорилось о примерах торговых программ "от арки", как их можно бесплатно скачать?
To All: и вообще, где можно надыбать нормальные примеры торговых программ, а не всякий хлам? На сайте брокера БКС я видел статьи о создании таких программ, но ссылки на тексты этих программ не работают. Может быть, кто-то скачивал эти тексты или знает, как их найти в архиве Интернета?
В Квике я вижу это в таблице "Состояние счёта" в строке "Российский рубль", столбец "Позиция", сверху "На дату Tx". И где можно посмотреть имена подобных параметров, которые надо задавать в скрипте для их чтения?
Сегодня видел, как с 10:35 по 11:35 был перерыв, сейчас вижу, что за мин. свечой от 10:35 идёт свеча от 11:35. Я cначала подумал, что Москвы уже нет... Техподдержка брокера ответила, что вчера тоже был перерыв, после которого стаканы очистились, а Мосбиржа ни вчера ни сегодня не назвала причину перерывов. Сегодня стаканы не очищались.
Кто знает, в чём причина? Интересно, чтО надо предусмотреть в скриптах в связи с такими явлениями? Наверно, скрипт должен мониторить что-то часто меняющееся (напр., IMOEX2), чтобы не наделать ошибок?
Вопрос о том, как угадать, куда поведёт цену крупный игрок после периода накопления. В периоде накопления (боковике) рыночными или лимитными заявками крупный игрок накапливает позицию? Как ещё можно определить его действия?
1. Будет ли утечка памяти, если C dll при работе со стеком Lua не будет вызывать lua_pop? Ведь сказано, что Lua при каждом вызове подпрограммы из C dll создаёт этот стек заново.
2. Решит ли проблему с возможной утечкой памяти, если не вызывать lua_pop, а в конце работы со стеком вызвать lua_settop(0)? Я думаю, что решит, т.к. lua_pop это макрос, который вызывает lua_settop.
3. Я попытался увидеть сборку мусора и написал такой код:
Код
function main()
s = 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'
local s1 = '' .. collectgarbage("count") .. '\n'
s = nil
s1 = s1 .. collectgarbage("count") .. '\n'
collectgarbage("collect")
sleep(10000)
s1 = s1 .. collectgarbage("count") .. '\n'
message(s1)
end
Получил такой вывод:
37.5439453125 37.619140625 36.046875
Видно, что памяти освободилось меньше, чем занимала строка s. Как это объяснить?
Если скрипт в коллбэке как-то притормаживает, то теряются эти сообщения. Неужели в Квике нет очереди, чтобы их не терять? Есть ли гарантированное время (скажем, 5 мс), что если коллбэк в него вписывается, то потерь данных гарантированно не будет? (Думаю, что его нет, т.к. интенсивность вызова коллбэка может быть высокой.) А если они были, можно ли как-то об этом узнать?
Между 9:50 и 10:00 наблюдал по одной акции то, что ещё не видел: в стакане не показывалась моя заявка на продажу и не было также строчки с ценой по этой заявке, но в таблице заявок она показывалась. Через некоторое время все заявки на продажу почему-то имели цену ниже всех заявок на покупку (строки с зелёным фоном были вверху, а с красным внизу), поэтому, чтобы увидеть привычный вид стакана, надо было встать на голову! И у всех заявок на покупку (или почти у всех) количество было в 1 акцию. И только в 10:00 (в начале торгов) содержимое стакана стало нормальным.
Кто-то ещё видел сегодня подобное? Это был сбой на бирже или в брокерском Квике?
1. Как можно (если можно) вызвать из qlua ехе программку с правами админа, напр., чтобы скорректировать часы ПК? А если эта программка сидит в dll, то тогда как? Видимо, можно как-то повысить права вызываемой программы?
2. Верно ли, что с ключом /nowait можно вызывать программы так, чтобы вызывающая программа продолжала работать и не ждала завершения вызываемой программы?
Вчера в результате экспериментов с моим скриптом Квик завис и его пришлось снять с выполнения (виндовс крутила курсор в виде голубого бублика и предложила снять или ждать отклика). Вчера и сегодня по этой причине наблюдались такие явления, как появление в выпадающем меню "Сервисы/Lua скрипты..." в этой строчке слева какой-то иконки (потом она исчезла), потом вдруг в стаканах и в меню поиска в текстовых полях фон из чёрного стал белым. Программа работает, но, похоже, какие-то файлы подпортились. Я ещё вчера запускал chkdsk/f на диск C:, не помогло... Есть в Квике какое-то средство проверки целостности данных?
1-я вызывается даже чаще, чем происходят сделки, хотя, часто не несёт нужной информации. Предположим, что кого-то интересует только количество и лучшая цена на покупку. Иногда роботы-прилипалы и прочая чушь играет с выставлением заявок и весь этот мусор загружает программу. А из 1-й вызывается 2-я, в которой иногда идёт запись на диск.
Предлагаю сделать так, чтобы можно было задать количество значений цен на покупку от лучшей цены и ниже и отдельно, соотвественно, количество цен на продажу в стакане от лучшей цены и выше. И если были изменения вне этих диапазонов, не вызывать 1-ю.
Кто-то может рассказать об удачной схеме работы торговой программы (без дорогих сердцу торговых стратегий), чтобы потом не переделывать своё изобретение? Я пока не знаю, как это всё в сумме организовывать и с какой стороны подходить... Торговать лучше по индикаторам или как-то ещё?
На этапе выставления заявок (напр., с 9:50 по 9:56) скрипт ММ смотрит на них и устанавливает текущую цену так, чтобы было совершено наибольшее число сделок. Можно ли как-то скриптом на Луа вычислить эту цену по информации о заявках в стакане, чтобы вовремя в неё встать? Есть ли такой алгоритм?
Можно ли запустить торговую программу под Квиком на планшете, чтобы не напрягать настольный ПК? Если да, то что это за планшет? На сколько времени хватит аккумулятора?
Я освоил qlua + dll на C, теперь хочется попробовать написать торг. программку, чтобы посмотреть, на её работу. Имеются какие-то дармовые "торговые роботы" и их заготовки, которые транслятор не хочет транслировать (и есть раздутые до безобразия горы кода в районе гитхаба), не хочется тратить время, чтобы их понять, они, по-моему, делаются по принципу "на, тебе, боже, что мне негоже", а платные "роботы" - по принципу "на, тебе, платного, боже, что мне негоже". К примеру, в этой ветке кто-то опубликовал "нейросеть на луа", при этом из диалога непонятно, что это такое и стоит ли на это тратить время.
У меня пока возле головы вертятся такие возможные "стратегии" для программы: - слежение за массой всякой макулатуры и определение начала роста цены, покупка на деньги, которые не жалко, и определение, когда это лучше продать; - определение в начале торгов, что с какой-то радости начнут покупать/продавать, и воспользоваться этим, пока цена не ушла далеко; - ловля кратковременной просадки цены, когда происходит крупная продажа (напр., кто-то хочет выйти из какой-то бумаги, перевести деньги в доллары и слинять из этой страны, пока не поздно).
Кто-то может подсказать (хотя бы в приват) что-то стоящее "отцу русской демократии", чьи пенсии летят по * , коптят, и потом где-то взрываются склады террористов?..
Кстати, я заметил конфликт комбинаций клавиш при работе с этими полями: если выделить значение в этом поле и нажать Ctrl+x (вырезать и поместить в буфер обмена Виндовс), то возникает страшное окошко типа "Удалить все заявки?" Кроме того, желательно, чтобы работали не только комбинации Ctrl+c/Ctrl+v, но и парные к ним Ctrl+Ins/Shift+Ins. И эти поля желательно вытягивать, чтобы они занимали всю ширину стакана.
А как насчёт того, чтобы можно было вводить в поле Q числовые выражения, хотя бы бесскобочные с + и -? (Надо учесть унарные + и -).
Такое впечатление, что при редактировании полей ввода цены/количества происходит какой-то тяжёлый счёт. Можно его как-то отменить, чтобы это работало так же быстро, как щелчок по быстрой заявке в стакане?