Избранное трейдера Fedor Bobkov

по

Код робота на LUA для QUIK

В двух словах: робот анализирует спот, выставляет лимитные и стоп-лимитные заявки по фьючерсу. Делает пересчет сигналов по выбранному тайм-фрейму, снятие выставленных заявок, запись в файл текущего состояния, ведение логов, сообщения, запрос текущей позиции и пр. Из робота удалена алгоритмика вычисления сигнала и в текущем виде скрипт будет иметь сигнал на покупку на каждом баре.

Предназначается для новичков в алготрейдинге, что-то типа болванки.

Важно: выставление заявок я закомментировал, поэтому можете смело запускать этот скрит, он не натворит ужаса по счету.

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
  • обсудить на форуме:
  • Quik Lua

продолжение поста про зож

Ок, по просьбе трудящихся продолжаем нашу передачу на крипторадио про зож.  smart-lab.ru/blog/409478.php
всё основано на собственном опыте и в результате анализа десятков книг по теме.


1. Позитивчик.
Как-то не хочется заниматься миссионерством, но вообщем нужно мыслить позитивно. Как это делать это вопрос даже не на миллион баксов. Давно был такой фильм «секрет» — о силе наших намерений и позитива, возможно кому-то он покажется сладкой приторной фигнёй, ок, мне он тоже таким в своё время показался. Позитив не приведёт к исполнению всех желаний но в целом он улучшит качество жизни и здоровье значительно.

2. Стресс.
Существенная его часть возникает у человека по привычке и инерции, человек недооценивает его вредное воздействие и обществу выгодно чтобы человек был в стрессе. В стрессе он больше потребляет, больше делает всякой невыгодной для него и выгодной для общества фигни. Часто люди хвастаются тем что у них стресс и своим уровнем стресса, это считается похвально и круто. Также стресс действует наподобие наркотика и для кого-то только стресс мотивирует его что-то делать, но настоящая продуктивность и смысл жизни открываются когда стресса нет.  И чем снимать стресс его лучше не допускать.

( Читать дальше )

настоящий трейдер должен быть долгожителем

Когда у тебя появляется капитал и проверенная система то смысл долгожительства резко повышается. Также есть такой момент что первую половину жизни люди часто вынуждены тратить на всякую фигню и необходимые вещи, школа, универ, работка, баборабство, геймерство, накопление бабла и знаний. Получается что мало кто живёт полноценно до тридцатника, хмм, можно сказать что вообще мало кто живёт полноценно, но давайте сделаем вид что я этого не писал, ато за грустняшку плюсика не будет.


( Читать дальше )

Мой доклад на конференции 20.05.17 в Челябинске

Мой доклад на конференции 20.05.17 в Челябинске

Введение

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

Мой доклад на конференции 20.05.17 в Челябинске



( Читать дальше )

Журнал истории сделок и открытых позиций (обновление 1)

    • 18 января 2017, 01:10
    • |
    • nicolas
  • Еще
Если у кого-то были проблемы с регистрацией сделок на Едином счете в Открытии, скачайте обновленную версию плагина. К сожалению, у меня нет ЕДС, поэтому протестировать не могу :( Надеюсь на ваше понимание.
Внимание! Распаковывайте в отдельный каталог и оттуда переносите все файлы, кроме базы данных positions2.db, т.к. на github лежит пустая база!

https://github.com/9159340/TradeHistory

Попробуй!

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

• Попробуй не пить кофе и чай в течение двух недель.
Ты увидишь что тебя все радует, что ты спокойно засыпаешь и глубоко спишь, что у тебя разгладились напряженные или хмурые морщины лица и вся легкая (или тяжелая) нервозность ушла (или уменьшилась минимум вдвое).

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

• Попробуй не добавлять в пищу две приправы: соль и перец.
Ты увидишь, что наесться можно в 2-3 раза меньшим количеством еды. В течение 1-2 недель тело перестанет отекать, и через месяц ты заметно похудеешь (касается только имеющих лишний вес).

• Попробуй не пить лимонады и любые газированные напитки, купленные в магазине.

( Читать дальше )

Опционы по взрослому (приращение доходности)

Продолжим полемику про опционы. Нужна ли нам там математика. Из последних СЛ блогов можно сделать вывод что не нужна. Наверное, так оно и есть.  Стоимость опциона равна стоимости БА плюс еще несколько иксов и игреков. У меня сложилось впечатление, что некоторые не понимают о чем эти иксы. Несмотря на то, что особенно ободряет, они справляться без использования элементарных математических моделей. А это дает уверенность в неуклонном росте ликвидности и благосостояния.  Я начну еще раз с азов. Мы не станем использовать БШ, как то и без него торговали опционами, отбросим распределения и так по простому. И что бы Игорь Суздальцев не мучил себя прочтением книжек про опционы. Вы сами решите насколько это надо.

Так как на пальцах это показать сложно, я приложу файлик в экселе на который буду ссылаться. https://cloud.mail.ru/public/9Yjq/4iHvfeftA   А сей час хочу определиться с терминами и понятиями, откуда ноги растут.

Откройте первый лист по названию «сигма» и постарайтесь понять первое: Все правила и расчеты по опционам не как не касаются цены БА. За основу расчетов берутся приращения, они же доходности, они же ретёрн, они же процентики которые вы видите на первой странице СЛ. Стоимость опциона равна цене БА (это одна нога), а вторая это буковки и функции. Откуда они берутся? По науке, это логарифм закрытия текущей цены, минус логарифм закрытия вчера. По правилам натурального логарифма это логарифм сегодня/вчера. Полученный результат надо перевести в проценты, что бы он получил удобоваримый вид, тем которым мы пользуемся. (Столбец С это цена, Столбец G это то самое). Если вы не слышали про натуральный логарифм, то можете, как в школе учили, от сегодня отнять вчера и разделить на сегодня (столбец М). Получится, почти, то же самое. Вот именно этим мы и торгуем. Я сделал график «Доходность».  Из этого графика видно как синюю линию колбасит вокруг нулевой отметки. Здесь вполне наглядно видны места, где стоит покупать или продавать. Арбитражерам такие графики снятся по ночам. Но не все сразу.

Второе понятие, которое все любят, это волатильность, она же стандартное отклонение, она же сигма, она же дисперсия, она же мера риска. (как ее только на называли). В нашем случае это HV историческая  волатильность усредненная на 5 периодов. Она не имеет ни чего общего с ATR CCI Стохастиком и даже с Болинжером Бенсом. Потому что считается не от цены БА, а от приращений  (доходности) к БА. Сама цена БА рассматривается как константа. Глядя на график, весьма сложно, в уме прикинуть какая HV там получается, если вы не можете взять (в уме) логарифм одного числа, вычесть другой логарифм, перевести в проценты, возвести это в квадрат, потом извлечь квадратный корень, найти арифметическое средние 5 или 60 значений… Если вы не Владимир Твардовский, то лучше использовать калькулятор «эксель».  



( Читать дальше )

Обеспечиваем себе стабильный заработок в трейдинге

Хочу предложить собственный опыт и соображения на тему как все-таки обеспечить себе более-менее стабильный заработок в трейдинге если ты опытный трейдер и как начинающему трейдуну избежать основных ошибок при выборе чем торговать и набраться вершков перед тем как пуститься в авантюрное и захватывающее приключение под названием  — ТРЕЙДИНГ. По скольку трейдинг и инструменты для торговли — тема обширная и мои суждения не ориентированы на профессиональных трейдеров (вы итак все знаете), то я коснусь классических и распространенных финансовых инструментов, таких как акции, фьючерсы и опционы, обходя при этом инвестиции в бонды, депозитарные расписки, депозитные сертификаты и другое.
 
Все знают какие мысли в голове у новичка, когда он приходит на рынок — все там были. Начитавшись умных книг и насмотревшись захватывающих фильмов о молодых парнях, получающих баснословные прибыли — ведомая отвращением к физическому труду, но безумно любящая деньги молодая поросль стремится стать частью общества, разъезжающего по южным странам в кабриолете, не ударяя при этом пальца о палец.

( Читать дальше )

Портфель на 3 года. Ответ.

Отвечал на вопрос про инвестирование. Много получилось, решил отдельным постом вывесить. За «сумбурность» не серчайте. IMHO самое главное — 8 пункт!!!


1) Не платить никому за обучение! Все материалы есть. Читайте, например, Аленку капитал. Здесь тоже есть материалы, но очень мало и «загажены» неадекватными комментариями. Очень аккуратно мфд смотрите, там очень много развода! Даже у симпатичных вам людей не нужно все принимать на веру!

2) Никаких фортсов и прочего, если до сих пор вообще не имели дело с рынком! По какому принципу вы собираетесь покупать/продавать, например бакс или нефть? Слушать «аналитиков» и их рекомендации? Читать советы здесь? Да, есть жемчужины, не спорю, но большинство постов и комментариев — полный неадекват. 

3) С акциями дело проще обстоит. Если не суетиться и не продавать на просадках — денег вы не потеряете. Только время) Главное решить для себя — вы верите в рост российского рынка или нет? Фундаментально мы недооценены в разы. Но удастся ли реализоваться этому фундаменталу? Если верите — то покупайте смелее, «прилив поднимет все лодки». Даже если вы ошибетесь и купите не ту акцию — она все равно отрастет. Если не верите — ОФЗ, дивитикеры и ждите проливов.

( Читать дальше )

Хочу совершить прорыв - всего одна идея, которая может качественно изменить всю нашу жизнь

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

 

Эту книгу я купил в числе всех остальных бизнес-книг в Metro, когда они продавались со скидкой 50%. Когда я взял ее читать, я даже не посмотрел на название и первые несколько страниц искренне думал, что читаю книгу Пинтосевича. Их там просто целая серия, как оказалось, разных авторов, с одним названием и одинаковыми обложками…
Хочу совершить прорыв - всего одна идея, которая может качественно изменить всю нашу жизнь
Так вот я бы дал этой книге рейтинг 100 из 100. В этой книге всего 1 супер-идея. Эту идею я и сам вынашиваю последние года полтора. С одной стороны идея эта очевидна вроде и так, но чтобы поверить в неё настолько, чтобы воплотить её в жизнь, пожалуй, надо прочитать эту книгу.

Несколько месяцев назад я спрашивал в фейсбуке

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


( Читать дальше )

....все тэги
UPDONW
Новый дизайн