Ага, и при первом же использовании этот файл с dll в который средний пользователь QLUA заглянуть не сможет, кинет вам его логин и пароль))) А то оба файла pubrink и sebrink в фоном режиме)
Причина в том, что функции «KILL_ALL_ORDERS» – снять все заявки из торговой системы, «KILL_ALL_STOP_ORDERS» – снять все стоп-заявки, «KILL_ALL_NEG_DEALS» – снять все заявки на внебиржевые сделки и заявки на сделки РЕПО. не предназначены для использования в LUA.
Значит даже не предвидится реализации в рамках LUA этих удобных вещей? Ну, и вдогонку пару вопросцев тогда: как мне узнать, что стоп сработал? Если мне нужно менять что-то в Стопе, у меня нет другого выбора как: убить старый и запустить старый?
Ни dofile(), ни loadfile() не делают этого, пока сам не откроешь все свои модули (файлы) в окне "Доступные скрипты". Есть ли какая возможность или быть может я не правильно пользуюсь этими функциями?
я знаю этот термин. для того, чтобы переменная в Lua была локальной нужно указать LOCAL, но у меня переменная задана в файле, до описания функции, сам файл и функция в нём вызывается в основном цикле программы (уже в другом файле), вот я и задался вопросом - а переменная живёт или каждый раз заново создаётся? Выходит, раз не указано LOCAL - то живёт.
Вот такого рода код. Может быть я был не прав засунув что-то в функции обратного вызова?
Код
fut = "SIU5" --торгуемый фьючерс
range = 200
lots = 1 --количество торгуемых лотов
ID = 1 --Айди транзакций
totalnet = 0 --начальный размер позиции
dofile("transaction.lua")
dofile("candle.lua")
function OnAllTrade(AllTrades)
if AllTrades.sec_code == fut then
Price = AllTrades.price
posa = chemp(Price, range)
Class = AllTrades.class_code
end
end
function OnFuturesClientHolding(fut_pos)
if fut_pos.sec_code == fut then
totalnet = fut_pos.totalnet
PrintDbgStr("Changed position size to "..tostring(position))
end
end
function OnStop()
is_run = 0
end
function main()
while is_run == 1 do
if position > posa then
--ВЫХОДИМ ИЗ ЛОНГА; КОЛИЧЕСТВО В ЗАЯВКЕ = lots + totalnet
Qty = lots + totalnet
OrderSell (Price, ID, Class, Qty, fut)
ID = ID + 1
position = -1
PrintDbgStr("Перевернулись в шорт по цене "..tostring(Price))
elseif position < posa then
--ВЫХОДИМ ИЗ ШОРТА; КОЛИЧЕСТВО В ЗАЯВКЕ С УЧЁТОМ РАЗМЕРА ОСТАТКА ПО СЧЁТУ
Qty = lots - totalnet
OrderBuy (Price, ID, Class, Qty, fut)
ID = ID + 1
position = 1
PrintDbgStr("Перевернулись в лонг по цене "..tostring(Price))
end
sleep(100)
end
end
Николай Камынин пишет: Индекс РТС либо считается точно, либо в действительности считаете не индекс РТС, а какой-то свой индекс. Поэтому "почти точно" - почти тоже самое, что "почти беременная"
Так вся ирония в том, что формула проста как два пальца. Выходит либо транслируемый биржей индекс ложный, либо выложена не последняя редакция, либо где-то ошиблись в расчётах, так ведь опять же - там всё просто как 2 пальца.
Иногда передаваемый RTSI биржи сильно врёт. И что удивительно фьючерс на эти разводки вообще никак не реагирует. Почему я уверен, что врёт, потому что расхождение с кодом может быть из-за коэффициентов, т.е. отрисовывающий в реальном времени график не должен был бы расходиться на разную величину каждый раз. А иногда получается довольно сильное расхождение не на 0,5 а на целый пункт, например...
sam063rus пишет: а вообще - расчёт самостоятельно индекса ртс - дело неблагодарное, бо как зависит от кучи разных факторов, которые постоянно меняются и не предсказуемы. Сама методичка может измениться, могут быть приняты те или иные решения клиринговой палаты и т. п.
Благодарное или нет - а проверить надо. Все изменения должны быть официально выложены. Я тут посмотрел методику: http://moex.com/ru/index/RTSI/info/ И не совсем понимаю суть поправочного коэффициента D и почему ни в одной формуле не принимает участие Поправочный коэффициент Z?
Чот у меня разный код, разные результаты. Другой вариант кода вывел всё по нулям. Можно окончательный код, который вот приводит к результатам на картинке?
есть OnDisconnect() функция обратного вызова. Понаписали то... Блин, мне бы и е-мейла хватило, но библиотека забугорная, без русского хелпу. Мне, как непрограммеру долго придётся копаться. Спасибо за примеры!
swerg пишет: Функция assert() выдает сообщение об ошибке, если значение её первого параметра равно false (то есть nil или false ). из одного блога , нашёл гуглем за 30 сек. по запросу "Lua assert"
А "зарабобтало" у вас потому, что добавили getScriptPath() Беда в том, что QUIK из скриптов создаёт файлы в том каталоге, из которого вы последний раз открывали како-либо файл (со скриптом, згружали настройки - и т.п.), либо в каталоге самого квика.
При добавке getScriptPath() файл гарантированно создаётся рядом со скриптом - вот вы его и нашли. До этого он тоже создавался, но где - ответ даст только поиск по диску.
Спасибо! :) А я кинулся на оф. сайт, а там документалка на русском недоступна и про гугл даже не вспомнил.
Николай,Вам уже объяснили что информация в файле появится только после выполнения close() или flush() В Вашем коде нету flush() есть только close() который сработает в лучшем случае при остановке скрипта. Рекомендация остается прежней, добавьте команду file:flush() сразу после file:write
Я понимаю, что после выполнения close()! Поэтому посмотрел, увидел, что набежало пару нужных строк, жму стоп, останавливается скрипт И ТИШИНА. Даже файл не создан. Хотя команды всё выполнены и должен быть файл как минимум с одной строкой...
Выручайте, не могу понять почему не создаётся файл. Логику всех if then end проверил, о том что верно мне сообщают message(), но почему не создаётся файл я понять не могу. В прошлый раз, вынеся команды по файлу за пределы циклы while всё сработало, но теперь чуть более сложная схема и опять всё по нулям:
Код
boom = {}
ttime = {}
is_run = 1
candle = {}
range = 20
function OnStop()
is_run = 0
end
function OnClose()
candle.o = 0
candle.h = 0
candle.l = 0
candle.c = 0
end
function OnCleanUp()
candle.o = 0
candle.h = 0
candle.l = 0
candle.c = 0
end
function main()
file = io.open("res.txt", "w+t")
while is_run == 1 do
candle.o = 0
candle.h = 0
candle.l = 0
candle.c = 0
g = getNumberOf("all_trades")-1
for i=0, g do
boom = getItem("all_trades", i)
message("New Price get".." - "..tostring(boom.price),3)
if candle.c == 0 then
candle.o = boom.price
candle.h = boom.price
candle.l = boom.price
candle.c = boom.price
elseif boom.price > candle.h then
message(tostring(candle.l+range).." ".."High test",1)
if boom.price >= (candle.l + range) then
candle.h = boom.price
candle.c = boom.price
message("New Candle from new HIGH".." "..tostring(candle.o).." "..tostring(candle.h).." "..tostring(candle.l).." "..tostring(candle.c),2)
strin = tostring(candle.o)..","..tostring(candle.h)..","..tostring(candle.l)..","..tostring(candle.c)
file:write(strin.."\n")
candle.o = 0
candle.h = 0
candle.l = 0
candle.c = 0
else
message("GET NEW HIGH",3)
candle.h = boom.price
end
elseif boom.price < candle.l then
message(tostring(candle.h-range).." ".."Low Test",1)
if boom.price <= (candle.h - range) then
candle.l = boom.price
candle.c = boom.price
message("New Candle from new LOW".." "..tostring(candle.o).." "..tostring(candle.h).." "..tostring(candle.l).." "..tostring(candle.c),2)
strin = tostring(candle.o)..","..tostring(candle.h)..","..tostring(candle.l)..","..tostring(candle.c)
file:write(strin.."\n")
candle.o = 0
candle.h = 0
candle.l = 0
candle.c = 0
else
message("GET NEW LOW",3)
candle.l = boom.price
end
end
i=i+1
message("GET OUT FOR THE NEW ROUND",3)
sleep(100)
end
end
file:close()
end
ЧО НЕ ТАК ТО? P.S. идея в том, чтобы получить из потока сделок range барчики, например.
Дмитрий пишет: Николай Бехтерев , советую вам оформлять свой код с отступами внутри циклов, а чтобы эти отступы не пропадали при размещении сообщения на форуме - пользоваться кнопочкой "оформление текста в виде кода". Иначе бывает трудно сходу вникнуть в логику работы вашего алгоритма.
Просто ошибся с кнопкой при составлении вопроса, а редактировать сообщения на этом движке видимо никак.
function main() while is_run == 1 do file = io.open("res.txt", "w+t") g = getNumberOf("all_trades")-1 for i=0, g do boom = getItem("all_trades", i) message(tostring(boom.price),3) file:write(tostring(boom.price).. "\n") i = i+1 sleep(1000) end file:close() end end
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
Николай Бехтерев пишет: правильно ли я понимаю, что снять все стопы махом не получится?
Добрый день.
Да, верно.
Это так и будет или в планах есть реализация? Ещё вопрос, я выставлял стопы с условием "M" т.е. по рынку, но писал и цену, правильно я понял, что "М" не работает, если указана цена?
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
is_run = 1
fuc = "SiM5"
futures = {
firmid = '',
trdaccid = '',
sec_code = '',
startbuy = 0,
startsell = 0,
startnet = 0,
todaybuy = 0,
todaysell = 0,
totalnet = 0,
openbuys = 0,
opensells = 0,
cbplused = 0,
cbplplanned = 0,
varmargin = 0,
avrposnprice = 0,
positionvalue = 0,
real_varmargin = 0,
total_varmargin = 0
}
function OnStop()
is_run = 0
end
function pos(stroka)
local i = 0
while futures.sec_code ~= stroka do
futures = getItem("futures_client_holding", i)
i = i+1
end
return futures.totalnet
end
function main()
while is_run == 1 do
j = pos(fuc)
message(tostring(j),1)
sleep(1000)
end
end
Совершаю сделку в таблице "Позиции по клиентским счетам (Фьючерсы)" в колонке "План. чист. поз." горит единичка, код продолжает выкидывать мне в сообщениях "0". Другие цифры, маржу например, показывает правильно.
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
подсобите, не работает конструкция такого вида, табличку получаем нужную, это вижу по futures.sec_code но увидеть чистую позицию по фьючерсам: futures.totalnet не получается:
Код
function pos(stroka)
local i = 0
while futures.sec_code ~= stroka do
futures = getItem("futures_client_holding", i)
i = i+1
end
return futures.totalnet
end
function main()
while is_run == 1 do
j = pos(fuc)
-- One()
message(tostring(j),1)
sleep(1000)
end
end
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
Правильно я понимаю, что получить только с getItem позицию по фьючу не получится?, Предварительно нужно будет пройтись по количеству срок в "Позиции по клиентским счетам" с getNumberOf?
Спасибо за ответ. В результате мой код выглядит вот так:
Код
function main()
while is_run == 1 do
dt = os.date()
ddt = string.sub(dt, 10, 14)
if ddt == "20:45" then is_run = 0
end
sleep (1000)
end
end
Может кому пригодится. функция string.sub(dt, 10, 14) вырезает подстроку с 10 по 14 символ в строке, которую выдаёт функция os.date() получая как раз время в виде строки: "HH:MM" её и будем сравнивать с заданным заранее значением.