Избранное трейдера Petr S

по

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

Регулярное инвестирование - счет 6,700,000 рублей. Новые рекорды.

Всех приветствую! 

Подошел очередной месяц к завершению и очередные деньги были отравлены на брокерский счет. Рынок восстановил позиции после падения в мае-июне. Хочется больше драйверов для роста нашего ФР, но пока их нет. Дивиденды выплачены.

Что у меня?

1) Прошло почти 11 месяцев как я начал инвестировать в ФР. 6 сентября будет год.

2) За это время я проинвестировал 6,700,000 рублей, таким образом, за 1,5 прошедших месяца мне удалось направить 247,000 рублей на счет.

3) Сам счет сегодня ровняется 6,730,000 рублей увеличившись за 1,5 месяца более чем на 1 млн рублей благодаря росту рынку. Я в нуле. Рынок минус 5% за это время. 

4) ОПД (см мой профиль что это значит) сегодня составляет 89,000 рублей, что на 10 тыс больше чем 1,5 месяца назад, т.е. мой пассивный доход от возможных будущих дивидендов составляет 89,000 рублей в месяц. Цель на этот год прежняя — довести его до

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

НЕФТЬ.СОТы. Серия 1707. Один шаг до пропасти?

Сот отчет  за 27 июня. Вот эта неделя:
НЕФТЬ.СОТы. Серия 1707. Один шаг до пропасти?

Я фанат Фондов. Открываю монитор в шарфике с надписью Goldman Sachs, и бело-голубой шапочке. (Шутка)

 Можно считать что фонды успешно покрыли свою чудовищную лонговую  позу всего за 4 месяца! Суммарно по брент+лайт продали более 500тысяч контрактов. ($25млрд.)
Попутно  еще и  сквизанули хомячков, подогнав минимум цены  к дню экспирации июльского контракта.
НЕФТЬ.СОТы. Серия 1707. Один шаг до пропасти?

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

Работаем с площадью. Алгоритм на WelathLab

Работаем с площадью. Алгоритм на WelathLab
Работаем с площадью. Алгоритм на WelathLab


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

Первое, что пришло в голову – это использовать площади на графике. Изначально идея была такой:

  1. Строим кривую по хаям и по лоям
  2. С помощью интерполяции находим промежуточные значения нашей кривой для большей точности.
  3. Аппроксимировать получившуюся кривую.
  4. Взять интеграл от получившейся в третьем шаге функции.

По задумке получившееся значение должно было отражать глубину рынка, то есть насколько сильно ходит рынок от локального хая/лоя до хая/лоя внутри дня. Если же мы добавим сюда время (за сколько рынок сходил), то получим индикатор флэта (маленькое значение + большой временной промежуток).  По ходу построения индикатора возникали мысли о том, что всё это можно реализовать гораздо проще, и действительно – можно.
Работаем с площадью. Алгоритм на WelathLab



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

Pattern искусственного обвала цен Buy&Sell

Приветствую, уважаемые читатели сегодня хочу поделиться очередным интересным Паттерном.
Напоминаю, что все началось с этого поста :) Книга, которая изменит вашу торговлю!

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

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

Эта модель часто описывается в книгах.



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

Парный трейдинг: 3 из 3 способов поиска пар (EMA)

Это заключительная статья по автоматическому поиску пар для «Парного трейдинга» с помощью Python. Способ самый быстрый и самый эффективный. Хотя эффективность достигается уже благодаря анализу полученного набора пар.



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

Парный трейдинг: описание стратегии на Python

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

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

В статье рассмотрены:

  • Введение в корреляцию/коинтеграцию на простом примере.
  • Корреляция без коинтеграции.
  • Коинтеграция без корреляции. 


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

Газпром глобально

Есть господин Гусев В., который в каждом своем видео утверждает, что ЭТОГО НЕ СУЩЕСТВУЕТ :

Газпром глобально

Прям стоит на своем, что нет Каналов, нет Поддержек...

Их, которые на картинке… так вот — ИХ НЕТ ))))

Газпром глобально

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

2016г итоги... нытье...как страшно жыть...

    • 30 декабря 2016, 13:44
    • |
    • ves2010
  • Еще

0 много думал выкладывать итоги или нет… типа счет отожрался до 30ти мио с копейками… однако начинал с 1го мио… 10 лет назад… а спекулировать начал в 2010 с 60к руб стоп был 1000руб… и вот дошел до овер 30ти мио… вообщем мысль в том, что делая стабильно 20-30 % в год без больших просадок… придете к успеху, а деньги вас сами найдут...

 

1 На 2016 планировал напилить в районе 3.5-6мио чистыми. В реальности,  видел +6мио в прыжке в конце ноября… но откатило до +4ех с копейками… дальше будет нытье + нудятина и можно не читать… резалт очень средний… торговля не шла из-за техпроблем… где-то к августу  начал торговать всерьез… если учесть, что -1.7 мио это инфляция… и еще отнять НДФЛ -500к… то 4-1.7-0.5=1.8мио чистыми… (при чем расходы на торговлю составили более 1мио комиссов… и проскальзывания сожрали столько же примерно лям)… имхо просто чудом увидел профит… ах да… забыл… 1мио я поднял на облигациях… т.е от активных спекуляций я поимел 1.8мио-1=0.8мио чистыми заплатив за это рынку 1мио комиссов и 1мио проскальзываний… ну вообщем инфляцию отбил и то позитиф… но на самом деле т.к часть кэша у мя валюта то у меня в ней гдето -700к бумажного убытка который занижает резалт… (для тех  кто не знал… в айти валюту можно использовать под ГО )



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

Вот и я туда же, алгоритм на акциях

    • 22 декабря 2016, 14:48
    • |
    • Friend
  • Еще

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

Писал о данной системе я туттуттуттут, тут, тут, тут, тут, тут, тут, тут, тут

О данном алгоритме:
1. Дата создания первой вариации – конец 2014, начало первой эксплуатации 01.2015, начало трансляции которая идет по сегодняшний день – 06.2015. Перевод под версию программы 2.0 – 05.2016.



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

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