Избранное трейдера krit345
Пост немного не по теме трейдинга, скорее его надо задавать программистам, но среди трейдеров таких полно, может поделитесь опытом.
Многолетнее использование Lua в QUIK`е подтолкнуло к идее использовать скриптовый язык в других приложениях.
Из всего немногочисленного набора того, что есть для C# удалось найти:
— NLua — 18K скачиваний в NuGet
— LuaInterface -?
— NeoLua – 50k скачиваний в NuGet
— LuBox – 1k скачиваний в NuGet
Автор проекта LuaInterface давно не поддерживает проект и прямо говорит, что NLua успешно продолжает его дело.
NeoLua – наиболее популярен среди программистов в NuGet.
LuBox показался удобным и наиболее «молодым» проектом.
Кто-нибудь из смартлабовцев использовал какую-то из этих библиотек для встраивания Lua-скриптов? Поделитесь опытом использования: плюсы, минусы, баги.

В последнее время на «Форуме банковских аналитиков» всё чаще звучит имя «Промсвязьбанка».
А посему пришла пора изучить отчётность и этого банка. И, заодно, озвучить озабоченность аналитиков отдельными сферами его деятельности. Изучать будем консолидированную финансовую отчётность по МСФО на 31 декабря 2016 года.
Все цифры будут на эту дату, если не оговорено иное. Итак, «Промсвязьбанк» очень крупный, по российским меркам, банк. На 1 апреля 2017 года он занимал 9 место в рейтинге по активам, с активами в размере 1356,6 млрд рублей.
Но, при этом, несмотря на очень высокое место в таком рейтинге, его доля в активах российской банковской системы на ту же дату составляла всего 1,71%. Так что, системная значимость у банка, как в таких случаях пишут рейтинговые агентства – умеренная. Будет ли государство его спасать, случись что нехорошее – это очень большой вопрос. Банк, входящий в третью десятку по активам, недавно спасать не стали.



1. В рамках работы по выявлению клиентов, осуществляющих операции, отвечающие признакам транзитных,рекомендуем обращать внимание на клиентов, которые искусственно завышают размер уплачиваемых с банковских счетов (далее – счет) налогов и других обязательных платежей в бюджетную систему Российской Федерации с 0,5 % от дебетового оборота по счету в среднем до значения 0,9 % от дебетового оборота по счету либо до значений, незначительно его превышающих.



Приказом Банка России от 28.07.2017 № ОД-2138 с 28.07.2017 отозвана лицензия на осуществление банковских операций у кредитной организации ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО БАНК «ЮГРА» ПАО БАНК «ЮГРА» (рег. № 880, г. Москва).
Деятельность ПАО БАНК «ЮГРА» была ориентирована на привлечение денежных средств населения и их размещение в активы неудовлетворительного качества. При этом кредитная организация самостоятельно не создавала резервов на возможные потери, адекватных принятым рискам. Государственной корпорацией «Агентство по страхованию вкладов», на которую приказом Банка России возложены функции временной администрации по управлению кредитной организацией, проведено обследование финансового положения банка. Итогом проведенного обследования стало объективное отражение стоимости активов в отчетности кредитной организации, что привело к полной утрате ее собственных средств (капитала).
Седой сидел на открытой веранде крыши офисного центра и смотрел на Кремль. Долгожданное солнышко пригревало его. Седой щурился.
— Дождь пойдет, — заметив меня сказал он и кивнул в сторону стоящего рядом лежака, — садись, полялякаем
Седой в розовой тенниске, льняных брюках и мокасах на босу ногу выглядел отдыхающим на яхте олигархом. Если бы я не прошел только что через шумящий оупенспейс, то можно было подумать, что так и есть, только вместо моря за бортом — перерытая Москва.
— Активно у тебя там, — я кивнул в сторону офиса
— Ага. Копошатся трутни. Август на носу, — и Седой замолчал
я подождал секунд тридцать и, не выдержав, спросил:
— Ты же меня не за этим пригласил?
— Держи сока. Сочный!
Седой запустил руку куда-то под столик и достал из тени кувшин с апельсиновым фрешем. Сок, наливаясь, выплюнул кусочек льда и тот, плюхнувшись в стакан, оставил на тенниске Седого небольшое пятнышко. Прямо рядом с игроком в поло.

require"QL"
log = "sbrf.log"
seccode = "SRM6"
lots_in_trade = 80
accnt = ""
better = -5
chart = "sberbankxxx"
is_run = true
prev_datetime = {}
len = 100
basis = 9
k_bal = {0,1,2,3}
sell = false
buy = false
id = 0
first = true
function trade_signal(shift)
number_of_candles = getNumCandles(chart)
bars_temp,res,legend = getCandlesByIndex(chart,0,number_of_candles-2*len-shift,2*len)
bars={}
i=len
j=2*len
while i>=1 do
if bars_temp[j-1].datetime.hour>=10 then
sk=true
if bars_temp[j-1].datetime.hour==18 and bars_temp[j-1].datetime.min==45 then
sk=false
end
if sk then
bars[i]=bars_temp[j-1]
i=i-1
end
end
j=j-1
end
t = len+1
do_sell = false
do_buy = true
value = 0
if do_sell then value = 1 end
if do_buy then value = -1 end
toLog(log,"value="..value.." on candle: "..bars[len].datetime.year.."-"..bars[len].datetime.month.."-"..bars[len].datetime.day.." "..bars[len].datetime.hour..":"..bars[len].datetime.min.." O="..bars[len].open.." H="..bars[len].high.." L="..bars[len].low.." C="..bars[len].close.." V="..bars[len].volume)
return value
end
function mysplit(inputstr, sep)
if sep == nil then
sep = "%s"
end
local t={} ; i=1
for str in string.gmatch(inputstr, "([^"..sep.."]+)") do
t[i] = str
i = i + 1
end
return t
end
function OnInit(path)
log=getScriptPath()..'\\'..log
toLog(log,"==========OnInit: START")
toLog(log,"==========OnInit: FINISH")
end
function OnStop()
is_run = false
toLog(log,"==========OnStop: script finished manually")
end
function CheckBit(flags, bit)
-- Проверяет, что переданные аргументы являются числами
if type(flags) ~= "number" then error("Ошибка!!! Checkbit: 1-й аргумент не число!"); end;
if type(bit) ~= "number" then error("Ошибка!!! Checkbit: 2-й аргумент не число!"); end;
local RevBitsStr = ""; -- Перевернутое (задом наперед) строковое представление двоичного представления переданного десятичного числа (flags)
local Fmod = 0; -- Остаток от деления
local Go = true; -- Флаг работы цикла
while Go do
Fmod = math.fmod(flags, 2); -- Остаток от деления
flags = math.floor(flags/2); -- Оставляет для следующей итерации цикла только целую часть от деления
RevBitsStr = RevBitsStr ..tostring(Fmod); -- Добавляет справа остаток от деления
if flags == 0 then Go = false; end; -- Если был последний бит, завершает цикл
end;
-- Возвращает значение бита
local Result = RevBitsStr :sub(bit+1,bit+1);
if Result == "0" then return 0;
elseif Result == "1" then return 1;
else return nil;
end;
end;
function killorders(ccode,scode)
for i=0,getNumberOf("orders")-1,1 do
local t=getItem("orders", i)
if t ~= nil and type(t) == "table" then
if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then
local transaction={
["TRANS_ID"]=tostring(math.random(2000000000)),
["ACTION"]="KILL_ORDER",
["CLASSCODE"]=ccode,
["SECCODE"]=scode,
["ACCOUNT"] = accnt,
["ORDER_KEY"]=tostring(t.ordernum),
}
res=sendTransaction(transaction)
end
end
end
end
function killstoporders(ccode,scode)
for i=0,getNumberOf("stop_orders")-1,1 do
local t=getItem("stop_orders", i)
if t ~= nil and type(t) == "table" then
if( t.seccode == scode and CheckBit(t.flags, 0) == 1) then
local transaction={
["TRANS_ID"]=tostring(math.random(2000000000)),
["ACTION"]="KILL_STOP_ORDER",
["CLASSCODE"]=ccode,
["SECCODE"]=scode,
["ACCOUNT"] = accnt,
["STOP_ORDER_KEY"]=tostring(t.ordernum),
}
res=sendTransaction(transaction)
end
end
end
end
function main()
toLog(log,"==========main: START")
while is_run do
if isConnected() == 1 then
ss = getInfoParam("SERVERTIME")
if string.len(ss) >= 5 then
hh = mysplit(ss,":")
str=hh[1]..hh[2]
h = tonumber(str)
if (h>=1000 and h<1400) or (h>=1405 and h<1845) or (h>=1905 and h<2350) then
if first then
for ti = 50,2,-1 do trade_signal(ti) end
if buy and not sell then message(seccode.." Current state: green and buy",1) end
if sell and not buy then message(seccode.." Current state: red and sell",1) end
if buy and sell then message(seccode.." ERROR: green and red",1) end
if not buy and not sell then message(seccode.." WARNING: nothing",1) end
first = false
end
prev_candle = getPrevCandle(chart,0)
if not isEqual(prev_candle.datetime,prev_datetime) then
current_value = trade_signal(1)
if current_value ~= 0 then
optn = "B"
if current_value==1 then optn = "S" end
curvol=0
no=getNumberOf("FUTURES_CLIENT_HOLDING")
if no>0 then
for i=0,no-1,1 do
im=getItem("FUTURES_CLIENT_HOLDING", i)
if im.sec_code==seccode then
curvol=im.totalnet
end
end
end
trvol = -current_value*lots_in_trade-curvol
if trvol ~= 0 then
killorders("SPBFUT",seccode)
killstoporders("SPBFUT",seccode)
f = io.open(getScriptPath().."\\sbrf2_pos.txt","r")
sbrf2_pos=f:read("*n")
f:close()
f = io.open(getScriptPath().."\\sbrf3_pos.txt","r")
sbrf3_pos=f:read("*n")
f:close()
pr,n,l = getCandlesByIndex ("futsber", 0, getNumCandles("futsber")-1, 1)
local trans =
{
["ACTION"] = "NEW_ORDER",
["CLASSCODE"] = "SPBFUT",
["SECCODE"] = seccode,
["ACCOUNT"] = accnt,
["OPERATION"] = optn,
["PRICE"] = toPrice(seccode,pr[0].close+current_value*better),
["QUANTITY"] = tostring(math.abs(curvol-sbrf2_pos-sbrf3_pos)),
["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id)
}
id = id+1
--res = sendTransaction(trans)
message(seccode.." Send : " .. res, 2)
toLog(log,"Send: ".. res)
for btr=0,200,5 do
local trans =
{
["ACTION"] = "NEW_STOP_ORDER",
["CLASSCODE"] = "SPBFUT",
["SECCODE"] = seccode,
["ACCOUNT"] = accnt,
["OPERATION"] = optn,
["PRICE"] = toPrice(seccode,pr[0].close-current_value*btr),
["STOPPRICE"] = toPrice(seccode,pr[0].close-current_value*(btr+better)),
["QUANTITY"] = tostring(6),
["TRANS_ID"] = tostring(getTradeDate().month*100+getTradeDate().day+id),
["EXPIRY_DATE"] = "GTC"
}
id = id+1
--res = sendTransaction(trans)
message(seccode.." Send : " .. res, 2)
toLog(log,"Send: ".. res)
end
if current_value == 1 then
message(seccode..' RED: buy->sell',1)
toLog(log,"RED signal")
else
message(seccode..' GREEN: sell->buy',1)
toLog(log,"GREEN signal")
end
else
if current_value == 1 then
message(seccode..' RED: buy->sell',1)
toLog(log,"RED signal, but nothing to do")
else
message(seccode..' GREEN: sell->buy',1)
toLog(log,"GREEN signal, but nothing to do")
end
end
else
if buy and not sell then toLog(log,"Nothing to do. Current state: green and buy",1) end
if sell and not buy then toLog(log,"Nothing to do. Current state: red and sell",1) end
if buy and sell then toLog(log,"Nothing to do. ERROR: green and red",1) end
if not buy and not sell then toLog(log,"Nothing to do. WARNING: nothing",1) end
end
prev_datetime = prev_candle.datetime
end
end
end
end
sleep(5*1000)
end
toLog(log,"==========main: FINISH")
end
