Избранное трейдера Петр Петров

по

Справочник Lua для Quik

    • 09 сентября 2017, 22:26
    • |
    • Dzam
  • Еще

Справочник Lua для Quik

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


( Читать дальше )
  • обсудить на форуме:
  • Quik Lua

список акций разрешённых для коротких продаж на рынках европы и америки

Ситуация достаточно вялая.Звонишь брокеру он проверяет где он может найти интересуюшие акции для шорта.
Статистика 20:1.Из 20 акций, только одну удаёться зашортить.
Вопрос знатокам? Где познакомится с полным списком акций разрешённых для шортирования.


10 советов 40-летнего 20-летним

не мое, но в свете постов о здоровье от 50-летных, думаю, актуально

10 советов 40-летнего 20-летним.

Достигнув сорока начинаешь поражаться, сколько же людей даже не дожило твоего возраста. Илья Ильф умер в 39. Максим Горький в 37. Да много кто умер.
Дожив до сорока начинаешь задумываться, достиг ли ты всего чего хотел, и много ли ты успел сделать.
Ты поражаешься, что Александр Македонский до твоего возраста не дожил, но уже успел завоевать полмира, оставив тысячелетние наследие. Осознавая свои достижения, ты понимаешь, что великие люди в твоем возрасте тебя превзошли многократно. Читая книги начинаешь ловить себя на мысли, что автор тебя явно младше (и думаешь, ну чему этот сопляк может тебя научить?).

Анализируя свой опыт хочется кое что посоветовать нынешним 20-летним с высоты, так сказать, прожитых лет.

Итак, 
1. Перестань бухать. Перестань курить. Как бы круто тебе это сейчас не казалось, бухать и курить это не айс. Больше того, я скажу тебе то, что может показаться банальностью, но бухать и курить крайне вредно для здоровья. Да, сейчас здоровье у тебя железное и никак тебя не беспокоит. Но будь уверен, что если продолжишь бухать/курить, через 20 лет ты поймешь, что здоровье свое ты загубил безвозвратно. Помни, что даже пиво ведет к выработке не свойственного тебе женского гормона эстрогена. К каким последствиям это приводит нагуглишь сам. Или можешь посмотреть на большинство нынешних сорокалетних. Хочешь быть таким — продолжай.



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

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

Про ликвидность на рынке еврооблигаций

Ликвидность в еврооблигациях, если сравнить с любой ходовой бумагой, очень низкая. Объем торгов нестабильный. Бывает 2 месяца объем за день от 0 до 10 штук, а потом в один день 40'000 штук, причем цена не практически не сдвинулась:

Про ликвидность на рынке еврооблигаций

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

Могу дать следующие рекомендации:

1)   Чем ближе к закрытию (18:40) тем полнее стаканы на еврооблигациях и уже спреды. Поэтому для ознакомления открываем стаканы после 18. Вы можете увидеть там как пустоту, так и некоторое количество заявок (см. нестабильность), но те что ближе к спреду редко объемом больше 50, чаще 10-30.

Вот некоторые вечерние стаканы:

 Про ликвидность на рынке еврооблигаций



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

Итоги эксперимента.Формула справедливой цены фьюча.

    • 15 июня 2017, 16:27
    • |
    • God
  • Еще
Вчера я решил провести эксперимент по оценки примерного уровня компетенции пользователей смартлаба. Итог оказался даже хуже чем я ожидал. Я думал, что найдется хотя бы один человек, знающий больмение правильную формулу, ну или хотя бы сумевший загуглить её. Но все оказалось куда хуже и нет ни одного хотя бы примерно правильного ответа. Варианты, которые писали в комментариях, меня неплохо повеселили подняв настроение на вечер. Особенно доставляют попытки впихнуть в формулу размер ГО и брокерскую комиссию)) 
Ну а теперь, как обещал, внимание правильный ответ :
Ограничимся формулой для акций, валюты и облигаций(нормальных, не мосбиржевских), потому что для других видов фьючей ценообразование заметно сложней.
FP = S * e ^ ((r1 — r2) * t) — D
где FP — справедливая цена фьючерса.
S — цена базового актива на споте.
r1 — средняя за период до поставки безрисковая ставка, по которой можно занимать валюту, в которой прайсится актив.
r2 — средняя за период до поставки безрисковая ставка, по которой можно разместить актив.
t — оставшийся срок до поставки актива по фьючерсу.
D — квазидивидентные гепы, которые случатся с активом до момента его поставки по фьючерсу.



ВОТ ВАМ ЕЩЕ ОДНА ИДЕЯ, NEW LOW PATTETN!!!

Приветствую!!!

Если еще не надоел со своими Паттернами :)

Для начала рекомендую ознакомиться с моей старой статьей :Pattern искусственного обвала цен Buy&Sell
И еще обратить, Ваше внимание вот на эту статью :Лучший месяц или день? Пример фьючерс на австралийца или AUDUSD
Мы приближаемся хорошей возможности не много подзаработать :)

Сегодня хочу рассказать еще об одном интересном Паттерне называться NEW LOW PATTETN.
Эта модель хорошо работала в прошлом и почему бы ей не работать и в будущем ?

Вы скорее всего торговали эту комбинацию и были не на той стороне …. Вы вероятно поймали стоп, когда эта модель давала сигнал на покупку!

У большинства всегда есть аргумент что за нашими стопами охотятся или что рынки сфальсифицированы.

Я никогда не соглашался с подобным мышлением… Я думаю, что рынки делают то, что они собираются делать. Наверняка, публика становится очень эмоциональной, когда цены идут до новых минимумов и выходят из своих позиций. Умные деньги, видя, что это происходит, входят в рынок с длинной стороны… вот и появляется такой эмоциональный паттерн. Я назвал это Новый Лоу Паттерн. Он основан на сценарии, который я только что изложил. 
ВОТ ВАМ ЕЩЕ ОДНА ИДЕЯ, NEW LOW PATTETN!!!



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

Оттачивание алгоритма и фильтрация разных рыночных ситуаций

Приветствую всех!

 

Данная статейка просто изложение в тексте моих мыслей при создании алгоритма. Пусть это будет продолжение предыдущей статьи о том как собирал свой велосипед. 

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

Итак теперь график эквити выглядет так 

Оттачивание алгоритма и фильтрация разных рыночных ситуаций

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



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

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