Избранное трейдера vito333

по

Почему лонг надо торговать на споте, а шорт на фьючерсе

Сразу оговорюсь, что утверждение, вынесенное в заголовок, не касается внутридневных операций, речь идет о позициях от нескольких дней до нескольких недель.  Итак перед вами график подневной доходности простейшей синтетической облигации «лонг  Сбербанк — шорт ближайший фьючерс на Сбербанк» с учетом расходов на перевкладывания из фьючерса во фьючерс за день до экспирации, дивидентов и средств ГО и вариационной маржи, необходимых для поддержания шортовой позиции.

Почему лонг надо торговать на споте, а шорт на фьючерсе

Он означает разницу в доходности (к номиналу) между «купил и держи» акцию сбера (с учетом дивидендов) и «купил и держи» ближний фьючерс на сбер или, если перевернуть формулу разницу в доходности (опять же к номиналу) «продал и жди» ближний фьючерс на сбер и «продал и жди» акцию сбера без учета платы за шорты(!). В принципе в этом графике для «купил и держи» нет ничего удивительного, так как обладатель такой позиции во фьючерсе может легко компенсировать эту разницу, разместив средства, свободные от ГО и вармаржи под безрисковую ставку (кроме «скачка» на графике под стрелкой, о котором ниже).  А что делать держателю шорта на споте? У него ведь нет свободных средств, да и еще к тому же эта отрицательная для него разница совсем не учитывает комиссию брокера за шорты. Получается «двойной удар» по счету.

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

Общий взгляд на РФР на год вперед

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

Я сам портфель еще не собрал — ибо пока ДОРАХА.

Что у меня в фокусе внимания на текущий финансовый год:
(скринов с графиками не будет — мне лень. Кому интересен мой взгляд — сам откроет графики)

Будут расти на отраслевых результатах:

Распадская
— уже начался рост. Надо пользоваться каждым откатом.

Соллерс - в котировках не учтен рост рынка автомобилей.

Разгон под дивиденды — повторение прошлого года под копирку:

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

Золотые правила откатов.

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

Для примера взяты последние данные Сбербанка, в часовом формате(1 свеча — 1 час)

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

На самом деле длинна отката, время отката, а самое главное, процентное соотношение отката к основному движению могу о многом сказать.

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



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

Обратный пропорциональный спред - мощь и красота

Для спецов в опционах сегодня я могу поделиться опытом использования обратного пропорционального спреда. За последнее время это наиболее популярная конструкция в моей торговле (направленная торговля опционами), и расскажу почему.

 

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

Не буду рассказывать теорию, а поделюсь практикой.

Вообще я читал в западных источниках, что такая конструкция подходит, когда вы ожидаете например резкий рост на БА, но его вероятность  — невысокая. Тогда типа покупай такую конструкцию за практически 0 – в случае роста цены на БА вы получаете хорошую прибыль, а если его не происходит – то цена опциона не меняется да и вы ничем не рисковали, в смысле не было ваших расходов. Например, это подходит для биотеха, если ждете прорыва у какой-то компании, выдачи разрешения FDA и т.п.



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

Код робота на 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

Управление бюджетом и просадкой нескольких роботов на одном счёте

    • 19 июля 2017, 12:19
    • |
    • П М
  • Еще
Для начала загадка: предположим есть у вас 3 робота, с просадками 30%, 50% и 70%, ну естественно они прибыльные и profit factor что-то там порядка 1.7. При этом эти данные для полного рефинанса и на интервале в 2 года. И надо вам получить
а) максимальное использование средств портфеля
б) максимальное рефинансирование
в) суммарную просадку не более 13%

загадка в том, как это правильно сделать?

Я назвал это загадкой, а не вопросом, потому что я наконец-то понял как, спустя несколько лет. До этого я пытался выжать из роботов максимум, и использовал как мне казалось передовую технологию: отдавал роботам ~90% от доступного бюджета, таким образом чтобы роботы имели возможность выбирать весь бюджет (0.9 + 0.09 + 0.009 — типа того), с целью, естественно — максимального возможного разгона депозита. получалось кто первый встал, того и тапки. Для двух роботов всё просто, а когда их было штук 7, то уже были всякие сложности.

Иногда у меня неплохо получалось, в 2014м я довольно мощно разогнал робота со 184 тыс до 1300 тыс с января по сентябрь. Потом ещё немного заработал. А потом получаться уже перестало. И дальше я занимался решением разного рода «философских» проблем, типа почему на истории миллиарды, а в реале просадка, и почему роботы пилятся быстрее, чем зарабатывают.

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

Скорость серверов Открытия

Мой друг несколько лет назад написал программу на Луа. Она выставляет в КВИК и сразу снимает 20 заявок. Это происходит по очереди, одна заявка за другой. Робот замеряет сколько времени ушло на выставление и сколько времени на снятие. Заявки ставятся далеко от рынка, поэтому сделок не происходит.
Вот сегодняшний тест серверов брокера Открытие. Я арендую виртуалку с московским IP, так что все заявки выставляются из Москвы.
Речь про эти сервера, которые можно выбирать при залогинивании в КВИК.
Скорость серверов Открытия
Тесты проводились для ММВБ. Это важное уточнение, потому что на срочке заявки летят быстрее.
-1-
Выделенный сервер с повышенной скоростью и мощным железом. Он платный. С него торгует мой робот, которому нужна скорость.
Вот тест сервера:
Скорость серверов Открытия

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

Самый Быстрый брокер? (тест скорости серверов брокеров)

    • 07 июля 2017, 20:03
    • |
    • MBaum
  • Еще

    Коллеги по цеху, считаете ли Вы важным показатель Скорости обработки ваших заявок (так называемый раунд-трип), то есть время с момента отправки вашей заявки на биржу до совершения сделки и получения обратной связи?

    Наверняка многие ответят положительно, так как этот показатель весьма важен, особенно для внутридневной торговли и алготрейдинга!

    Но и для инвесторов совершающих сделки более размеренно этот показатель может иметь существенное значение в случае закрытия позиций по стопу в условиях сильного движения против Вас (пример: открытие нашего рынка ГЭПом вниз в понедельник 3 марта 2014). Ведь в такой ситуации в лучшем положении окажется тот, у кого быстрее обработается стоп-заявка.

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



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

"Тихая гавань" на российском рынке

Индекс ММВБ -1.2%, мой трендовый лонг-онли портфель — только -0.3%. В том числе за счет того, что примерно на треть купил в него ETFов от FinEx. Удивляюсь, почему бумаги так не расторгованы — ведь это же самый дешевый способ получить international exposure и диверсифицировать ваш рублевый портфель от нефти и Russia risk'а, не прибегая при этом к помощи трэшовых брокеров!

P.S. Нет, FinEx не платили мне за этот пост. Его цель — обратить внимание ширнармасс на интересные инструменты, почему-то не пользующиеся спросом.

"Тихая гавань" на российском рынке




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

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