ticker = {"VTBR"}
lot = {"1"}
trans_id = {os.time()+1}
account = "xxxxxx"
class_code = "yyyy"
client_code = "zzzzzzzz"
LastStatus = {nil}
run = true
function main()
TransOpenPos()
while run do sleep(1)
end
end
function OnStop()
run = false
end
function TransOpenPos()
for j = 1, #ticker do
local Transaction={
ACCOUNT = account;
CLIENT_CODE = client_code;
CLASSCODE = class_code;
SECCODE = ticker[j];
ACTION = 'NEW_ORDER';
OPERATION = 'S';
TYPE = 'M';
PRICE = 0;
QUANTITY = lot[j];
TRANS_ID = tostring(trans_id[j]);
}
local Res = sendTransaction(Transaction)
if Res ~= '' then message('TransOpenPos(): Ошибка отправки транзакции: '..Res) else message('TransOpenPos(): Транзакция отправлена')
end
end
end
function OnTrade(trade)
for j = 1, #ticker do
if trade.trans_id == trans_id[j] then
sleep(100);
message('OnTrade(): По транзакции №'..trade.trans_id..' успешно совершена сделка №'..trade.trade_num..' по цене '..trade.price..' объемом '..trade.qty)
qty_trades = getNumberOf("trades");
num_trade = 0;
for i = 0, qty_trades - 1 do
trade_find = getItem("trades", i);
if trade_find.sec_code == ticker then
num_trade = trade_find.trade_num
end
end
message("Номер сделки в торговой системе - "..trade.trade_num);
sleep(100);
end
end
end
Работает нормально, только после выполнения кода почему-то повторяются сообщения, которые находятся внутри functon OnTrade(trade). См. вложенный файл с серией сообщений после выполнения кода. Подскажите, пожалуйста, с чем это связано и как исправить.
Подскажите, пожалуйста, как получить данные из колонки "Доступно" из таблицы "Позиции по инструментам" для режима торгов Т2 (см. вложенный скриншот). Через getDepo не получается:
BlaZed написал: instruments={{"class1","sec1"},{"class2","sec2"},{"class3","sec3"},{"class4","sec4"}} for _,val in ipairs(instruments) do message(val[1].." "..val[2]) end
Не смог понять, как работает pair или ipairs, если много массивов... Поэтому сделал так:
Код
function main ()
ticker = {"AFKS", "AFLT", "AGRO"}
lot = {"1", "1", "1"}
pricestep = {"0.001", "0.01", "0.2"}
trans_id = {os.time()+1, os.time()+2, os.time()+3}
for i = 1, #ticker do
ds = CreateDataSource("TQBR", ticker[i], INTERVAL_D1);
sleep(400)
CandleNum = ds:Size()
priceO = ds:O(CandleNum)
orderprice = priceO * 1.05 - priceO * 1.05%pricestep[i]
message ("Тикер "..ticker[i]..". Количество лотов: "..lot[i]..". Шаг цены: "..pricestep[i]..". Номер транзакции: "..trans_id[i]..". Цена: "..orderprice)
end
-- и дальше код ........
end
Есть такой код Lua, который работает только по одному инструменту: при запуске в Quik смотрит цену открытия и закрытия, и если цена закрытия становится больше цены открытия на 5%, то покупает по рынку 1 лот.
Подскажите, пожалуйста, что добавить в скрипт, чтобы можно было запустить его один раз, чтобы постоянно мониторил цену, пока не отключишь его. А если необходимо сканировать несколько инструментов, например, SIBN, SBER, как нужно изменить скрипт?
Код
stopped = false
function OnStop()
stopped = true
return 5000
end
function main()
ticker = "SIBN"
ds1, err = CreateDataSource("TQBR", ticker, INTERVAL_D1);
sleep(400)
CandleNum = ds1:Size()
PriceC = ds1:C(CandleNum)
PriceO = ds1:O(CandleNum)
if PriceC > PriceO * 1.05 then -- Если цена закрытия становится больше цены открытия на 5%, то покупаем по рынку 1 лот
A = {
ACTION = 'NEW_ORDER',
ACCOUNT = 'xxxxxxxxxxx',
OPERATION = 'B', -- 'B' - покупка, 'S' - продажа
CLASSCODE = 'TQBR',
SECCODE = ticker,
PRICE = tostring(0),
QUANTITY = tostring(1), -- количество лотов
TRANS_ID = tostring(1000), -- идентификатор транзакции, чтобы программа распознавала транзакции, когда много сделок
TYPE = 'M'
}
Err_A = sendTransaction(A)
message("error: "..Err_A)
end
end
Я начал изучать Lua на прошлой неделе, поэтому мой уровень почти нулевой. Буду благодарен, если дадите какие-либо наводки, что изучать.
nikolz написал: если 10 или 100 то она не работает, надо изменять последнюю цифру.
Правильно, последнюю цифру меняю в зависимости от количества символов. string.sub(Название переменной,1,3) - оставляет 3 символа, начиная с 1-го слева, включая запятую (точку). string.sub(Название переменной,1,5) - оставляет 5 символов, начиная с 1-го слева, включая запятую (точку).
Спасибо за y=string.sub(x,1,string.find(x,'.')+3).
Скажите, пожалуйста, может, есть где-либо в открытом доступе код робота Qpile, который бы оповещал о достижении определенных значений RSI, заданных в коде. Всегда пользовался приложением "Альфа-инвестиции", где есть конструктор роботов (на C#), что очень удобно: любой пользователь, не знакомый с программированием, может создавать роботов. Однако, с переходом на Quik возникла описанная задача.
Скажите, пожалуйста, может, есть где-либо в открытом доступе код робота Lua, который бы оповещал об определенных значениях RSI (по любому инструменту). Всегда пользовался приложением "Альфа-инвестиции", где есть конструктор роботов (на C#), что очень удобно: любой пользователь, не знакомый с программированием, может создавать роботов. Однако, с переходом на Quik возникла описанная задача.