Избранное трейдера Fedor Bobkov
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

Введение
Сегодня я расскажу, что необходимо для создания и применения высокочастотных стратегий на российском рынке. Постараюсь этот рассказ проиллюстрировать примерами из нашей практики.

Продолжим полемику про опционы. Нужна ли нам там математика. Из последних СЛ блогов можно сделать вывод что не нужна. Наверное, так оно и есть. Стоимость опциона равна стоимости БА плюс еще несколько иксов и игреков. У меня сложилось впечатление, что некоторые не понимают о чем эти иксы. Несмотря на то, что особенно ободряет, они справляться без использования элементарных математических моделей. А это дает уверенность в неуклонном росте ликвидности и благосостояния. Я начну еще раз с азов. Мы не станем использовать БШ, как то и без него торговали опционами, отбросим распределения и так по простому. И что бы Игорь Суздальцев не мучил себя прочтением книжек про опционы. Вы сами решите насколько это надо.
Так как на пальцах это показать сложно, я приложу файлик в экселе на который буду ссылаться. https://cloud.mail.ru/public/9Yjq/4iHvfeftA А сей час хочу определиться с терминами и понятиями, откуда ноги растут.
Откройте первый лист по названию «сигма» и постарайтесь понять первое: Все правила и расчеты по опционам не как не касаются цены БА. За основу расчетов берутся приращения, они же доходности, они же ретёрн, они же процентики которые вы видите на первой странице СЛ. Стоимость опциона равна цене БА (это одна нога), а вторая это буковки и функции. Откуда они берутся? По науке, это логарифм закрытия текущей цены, минус логарифм закрытия вчера. По правилам натурального логарифма это логарифм сегодня/вчера. Полученный результат надо перевести в проценты, что бы он получил удобоваримый вид, тем которым мы пользуемся. (Столбец С это цена, Столбец G это то самое). Если вы не слышали про натуральный логарифм, то можете, как в школе учили, от сегодня отнять вчера и разделить на сегодня (столбец М). Получится, почти, то же самое. Вот именно этим мы и торгуем. Я сделал график «Доходность». Из этого графика видно как синюю линию колбасит вокруг нулевой отметки. Здесь вполне наглядно видны места, где стоит покупать или продавать. Арбитражерам такие графики снятся по ночам. Но не все сразу.
Второе понятие, которое все любят, это волатильность, она же стандартное отклонение, она же сигма, она же дисперсия, она же мера риска. (как ее только на называли). В нашем случае это HV историческая волатильность усредненная на 5 периодов. Она не имеет ни чего общего с ATR CCI Стохастиком и даже с Болинжером Бенсом. Потому что считается не от цены БА, а от приращений (доходности) к БА. Сама цена БА рассматривается как константа. Глядя на график, весьма сложно, в уме прикинуть какая HV там получается, если вы не можете взять (в уме) логарифм одного числа, вычесть другой логарифм, перевести в проценты, возвести это в квадрат, потом извлечь квадратный корень, найти арифметическое средние 5 или 60 значений… Если вы не Владимир Твардовский, то лучше использовать калькулятор «эксель».
Сын, ты должен обязательно прочитать эту книгу, даже если подумаешь, что те идеи, о которых написано ниже, тебе подходят.

5+! Совершенно случайно попавшая в мои руки книга и влияние, которое ее идеи могут оказать в том числе и на мою жизнь огромно. Вы помните, я ни раз говорил, что “смартлаб” по сути начался полгода спустя после случайной покупки книги Кейта Ферацци “Никогда не ешьте в одиночку”?
Эту книгу я купил в числе всех остальных бизнес-книг в Metro, когда они продавались со скидкой 50%. Когда я взял ее читать, я даже не посмотрел на название и первые несколько страниц искренне думал, что читаю книгу Пинтосевича. Их там просто целая серия, как оказалось, разных авторов, с одним названием и одинаковыми обложками…

Так вот я бы дал этой книге рейтинг 100 из 100. В этой книге всего 1 супер-идея. Эту идею я и сам вынашиваю последние года полтора. С одной стороны идея эта очевидна вроде и так, но чтобы поверить в неё настолько, чтобы воплотить её в жизнь, пожалуй, надо прочитать эту книгу.
Несколько месяцев назад я спрашивал в фейсбуке
А ведь наверняка существует какая-то очень простая мысль, до которой я пока еще не додумался, применив которую я мог бы существенно улучшить свою жизнь.Так вот теперь я получил, похоже, ответ… Вот она эта идея:
Чтобы добиться значительно более высоких результатов, надо сосредоточиться всего на одной вещи. Это очень тяжело признать и еще тяжелее сделать, но чтобы стать по-настоящему продуктивным, вам придется отказаться от всего остального, кроме этой одной вещи.