Между определением кол-ва бидов и обращением к нужно строке за ценой проходит время, поэтому лучше сделать проверку на не пустую строку if ql2.bid[b_qty].price ~= '' then
Если его запустить, то length = 5. Если закомментировать a[4] length = 3. Если закомментировать a[2] или a[3], то сразу или с какого то раза length = 5. Я не знаю, почему у меня так, но если у Вас так же, то #a работает не правильно. Соответственно, Ваш цикл
Код
for i = 1, #queue do
queue_[tonumber(queue[i].price)] = tonumber(queue[i].quantity) -- table index is nil
end
перебирает и элемент массива который nil Попробуйте внутри цикла сделать message на каждый queue[i].quantity что бы в этом убедиться(или не убедиться)
Что бы избежать возможных проблем с преобразованием , я бы написал. tradelist[i] = "" .. getItem("trades",i).datetime.day.."."..getItem("trades",i).datetime.month.."."..getItem("trades",i).datetime.year..";".. getItem("trades",i).datetime.hour..":"..getItem("trades",i).datetime.min..":"..getItem("trades",i).datetime.sec..";"..
.trade_num, .order_num, .trans_id - они уже при получении из таблицы сделок имеют формат NUMBER. Не понятно зачем число форматировать в число. string.format("%0.17g",... - здесь вы сами пытаетесь преобразовать число в строку в формате %e или %f в зависимости от того что короче. И спрашиваете как от этого уйти. Просто не надо этого делать. Судя по тому, что в конце Вы все таки хотите получить длинную строку(tradelist[i]) из полученных данных, логичнее через string.format преобразовать числа в удобный для вас вид (как и предлагает s_mike@rambler.ru,
В справке по Qlua, к сожалению, не указано, что возвращается в случае не получения данных данной функции. Я при проверке этой функции сравниваю получаемую таблицу и ее значения не с nil, а с false (т.е. if (not tab2) и if (not tab2[0])). Пока работает.
Условия. Купил фьючерс А по 100. Выставил заявку типа «Тейк-профит и стоп-лимит». Тейк-профит цена исполнения 110 спред 30. Стоп-лимит цена исполнения 90 спред 10. В результате срабатывания стоп-заявки выставился лимит ордер: Продать по 80. Вопрос. Какая сторона стоп-заявки сработала? Тейк-профит или Стоп-лимит. Конечно же условия задачи идеализированы, но суть вопроса понятна. Есть допустим такое решение. Посмотреть в таблицу сделок и если есть сделки выше Стоп-лимита то сработал Тейк-профит. Но для такой задачи хочется решение по проще.
Мне кажется, что не стоит решать эту проблему увеличением sleep. Надежнее сделать проверку наличия заявки по номеру в таблице заявок (или через OnOrder, как и предлагал админ). Получение номера заявки по OnTransReply не гарантирует появление заявки в таблице заявок без задержек. А если в таблице заявок этой заявки нет, то и переставлять нечего.
Перед записью проверьте, можете ли вы открыть файл для записи, не занят ли он другим процессом.
Код
f = io.open(file,"+a");
i = 0;
while(f == nil) do
i = i + 1;
if i == 2000 then
message("Не могу открыть для записи файл "..file);
sleep(5000);
error("");
end;
f = io.open(file,"+a");
sleep(1);
end;
1. Готово 2. Готово 3. Знаю только ПИТОН. ,(c++, c#, java) НЕ знаю 4. Вот это основная проблема! Читал кучу инфы но так и не допёр как сделать 5. С начала надо разобраться с пунктом 4 ))
3.Если знаете ПИТОН, то пишите на ПИТОНе. Разницы нет. В инете есть примеры. 4.Т.е. Вы не знаете Lua(qlua)? Начните с его изучения. Этот форум как раз этому посвящен.
Начни с конца. 1.в телеграм получи свой chat id 2.создай telegram bot и получи его token 3.возьми язык, который знаешь,(c++, c#, java ...) разберись как послать строку в телеграмм своему боту по token, который по твоему chat id пошлет тебе эту строку в виде сообщения 4.в lua напиши скрипт, который собирает нужную тебе инфо и передает(есть разные варианты) в программу, написанную на см.п.3. 5.(не обязательно) напиши красивую оболочку на языке, который знаешь, в которой ты делаешь выбор(ставишь галочки), какую именно информацию(большой список) тебе необходимо передавать из квик в телеграмм.
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Не думаю, что у Вас получится в один и тот же момент включить несколько скриптов. os.time() у всех будет разный, а соответственно math.randomseed(os.time()) и ....
Средства разработки многопоточных скриптов в QUIK., OS_Quesha, свидетельство регистрации в Роспатенте № RU 2020612905. Бесплатная для некоммерческого использования.
Есть идеи, как сделать уникальный trans_id в разных роботах без необходимости задавать свой диапазон (robot_id) внутри каждого робота (или их копий)?
Я уникальность обеспечиваю фиксированием момента времени включения скрипта, а не совершения транзакции.А уже дальше, если в скрипте есть сделка, то как обычно, к полученному случайному числу +1.
Есть робот, который работает через втб, как на срочном, так и на фондовом(использовал "CLIENT_CODE/"). Через сбер на срочном работает, на фондовом пишет Не указан код клиента. В ручном режиме заявки проходят. В роботе пытался "CLIENT_CODE" "CLIENT_CODE/" "CLIENT_CODE//" "CLIENT_CODE///" В тех.поддержке сказали, что никаких спец.установок не используют(по вопросам роботов вообще не консультируют). Если кто реально работает через сбер поделитесь опытом.
Старатель написал: Второй файл как раз служит для писателей индикатором, что первый файл занят, и запись не возможна.Как только приёмник прочитает данные, он удаляет 2-й файл, что сигнализирует о возможности записи.Т.е. организуются синхронные запись/чтение.
Я делаю так же, только с одним файлом. Передатчик создает файл и пишет туда инфу. Приемник смотрит наличие этого файла. Для него это флаг, что можно читать свежую инфу. Он (приемник) ее читает и удаляет файл. Для передатчика отсутствие файла означает, что файл прочитан и можно создавать файл для передачи новой инфы. Если это и хуже варианта с двумя файлами, то интересно чем?
x = getParamEx (classcode, seccode, "last").param_value; -- это строка if x then x = tonumber(string.format("%."..scale.."f", tonumber(x)); --если нужно вещественное x = tonumber(string.format("%d", tonumber(x)); --если нужно целое (или %u без знака)
Владимир, Вопрос не только в string или number. Вопрос в том, что индекс должен быть помимо number еще и целочисленным. Поэтому выше я предложил z1 = tonumber(string.format("%d", tonumber(z.bid_count)))
Возможно, не хватает времени на обновление portfolio. После покупки LKON (перед elseif) можно вставить
Код
local timeWfinish = os.time() + 5;
while portfolio==0 do
portfolio = getFuturesHolding("SPBFUT", "SPBFUT***","LKU0",0).totalnet;
if os.time() > timeWfinish then
message("Вышло время ожидания portfolio");
error("");
end;
sleep(100);
end;
local c1 = getParamEx2(CLASS_CODE, SEC_CODE, "TRADINGSTATUS");
if (c1.result == "1") then
if c1.param_image ~= "открыта" then
message("Сессия "..c1.param_image);
flag_Session = false;
end;
end;
Дмитрий, могу лишь предложить свой работающий вариант, от которого можно оттолкнуться.
Код
if string.len(Tl.hour) == 1 then Tl.hour = "0"..Tl.hour; end;
if string.len(Tl.min) == 1 then Tl.min = "0"..Tl.min; end;
if string.len(Tl.sec) == 1 then Tl.sec = "0"..Tl.sec; end;
Myfilefile = "\\MyData.txt";
i = 0;
while i == 0 do
Myfile = io.open(getScriptPath()..Myfilefile,"r+");
-- Если файл занят
if Myfile == nil then
sleep(100);
else
i = 1;
end;
end;
s_mike@rambler.ru написал: нужно правильно написать робота, чтобы он перед выставлен тем заявки проверял, что желаемое цена находится в допустимых для текущей сессии границах для нужного инструмента. Например, для фьючерсов это pricemin и pricemax
Хочу выставить стоп-заявку, при срабатывании которой выставлялась бы лим.заявка с EXECUTION_CONDITION ="KILL_BALANCE". Есть ли такая возможность? Пытался прописать в Transaction={} для стоп-заявки. Стоп выставляется, но остаток лим.заявки не удаляется.
IsRun = true;
tag = "macd26";
function main()
while IsRun do
nl = getLinesCount(tag); --кол-во линий в индикаторе
nc = getNumCandles(tag); --кол-во получаемых свечек, начина¤ с 0-ой
first_candle = nc - 3; --получаем три последнюю
count = 3; --заказываем три последнюю
t, n, l = getCandlesByIndex (tag, 0, first_candle, count); --получаем таблицу с инфо по MACD
-- t, n, l = getCandlesByIndex (tag, 1, first_candle, count); --получаем таблицу с инфо по signal line
...
...
...
sleep(100);
end;
end;
function OnStop()
IsRun = false;
end;
В дополнение в посту выше. В первом посту я не обозначил, что в случае, если данные с индикаторов- нил, у меня стоит задержка 30сек.(на возможную дозагрузку). Изменил задержку на 60сек. Результат -данные обновляются и скрипт не вылетает. Думаю, что эта проблема у меня из-за того, что в настройках соединения снята галочка с «При восстановлении использовать только параметры последнего соединения» . Т.е. восстановление соединения происходит к следующему серверу. В 7-ом это происходило быстрее. Думаю причину я нашел. Спасибо.
На случай разрыва связи по разным причинам в скрипте есть флаги flag_Connected и flag_CleanUp
Код
function OnConnected(fl)
flag_Connected = true;
message("OnConnected");
end;
function OnCleanUp()
flag_CleanUp = true;
message("OnCleanUp");
end;
Если ИСТИНА, то запускаю проверку и обновление данных графика и индикаторов . Сегодня на 7-ом и 8-ом квике запускал один и тот же скрипт с искуственным обрывом связи. На 7-ом все нормально.(как и было до этого). На 8-ом не видит, что эти флаги - Истина. Соответственно, не обновляет данные. Как результат, данные с индикаторов нил.
И реакция разная. На 7-ом - Connected На 8-ом - CleanUp CleanUp
никаких dll или сторонних библиотек не используется в скриптах. Скрипты скомпилированы через стандартную команду:
luac -s -o "$(FileName).luac" "$(FileNameExt)"
Что надо сделать для работы?
Visual Studio для этого не использую. Использую LuaForWindows_v5.1.4-46 Могу ли просто заменить скаченные файлы и дирректории в LuaForWindows? Если нет, то что можно сделать?