Хочу, чтобы при срабатывании стопа, выставлялся ордер с параметром "По рыночной цене". Какой параметр необходимо добавить в таблицу для sendTransaction(), чтобы было мне счастье? Будет ли это работать на всех рынках? Если такого параметра нет, как это можно обойти? Думал использовать "мин/макс. возм.цена" для расчета цены или максимального спреда. Но судя по форуму, надежность получения этого параметра из ТТТ желает лучшего.
Есть таблица "Дополнительные флаги для таблицы «Стоп-заявки»". Хочу при создании стоп-заявки установить "Выполнение тейк-профита по рыночной цене" и "Выполнение стоп-заявки по рыночной цене". Подскажите, пожалуйста, пример строки кода, используя, например bid.band или другую ф-цию.
Возможно, Ваш кусок кода тоже в цикле. После отправки заявки на снятие изменения в самой таблице происходят не сразу. Изменения еще не произошли, а Вы по следующему шагу цикла(который Вами не представлен) видите, что заявка еще активна. Хотя заявка на снятие уже отправлена на предыдущем шаге. Попробуйте после DeleteProfitByNumber(emit, class, keyNumber, file, prevString) поставить задержку с ожиданием в таблице заявок реакции на эту функцию.
Между определением кол-ва бидов и обращением к нужно строке за ценой проходит время, поэтому лучше сделать проверку на не пустую строку 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;