Избранное трейдера Маркин Павел

по

О «теореме Ферма» теории вероятностей или о нормальности «бытия» (много буков)

    • 16 октября 2018, 16:41
    • |
    • А. Г.
      Проверенный аккаунт
  • Еще

Не подумайте плохого в части нормальности, речь пойдет не о психиатрии, а об известном в теории вероятностей нормальном распределении

 О «теореме Ферма» теории вероятностей или о нормальности «бытия» (много буков)
 

А точнее даже не о нем самом, а об известной центральной предельной теореме (ЦПТ) применительно к ценам.  Что такое центральная предельная теорема в ее классическом виде?

Пусть нам дана некоторая сумма большого числа случайных величин Х=х1+…+хN где каждое слагаемое имеет конечную и ненулевую дисперсию (как мы увидим далее в приложении к ценам это условие выполняется). Человечество давно еще с 18 века (Муавр и Лаплас) заинтересовал вопрос распределения случайной величины Х или хотя бы его более-менее точного приближения.

Не будем слишком строги в определениях всяких сходимостей и их скоростей, а сформулируем классическую  ЦПТ в виде интуитивно понятного, но нестрогого термина «близости». Так вот, если xi – независимы (кто хочет может посмотреть строгое определение независимости, а для менее пытливых скажу только, что корреляция двух независимых случайных величин с конечными дисперсиями – нуль, хотя и обратное не верно), то распределение Х при достаточно больших N практически не отличается от нормального распределения со средним А и дисперсией D, где А – сумма средних x



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

Параметрическое оптимальное f при нормальном распределении: Разбор 3 главы книги Ральфа Винса “Математика управления капиталом”

Трейдинг

Продолжение краткого изложения книги Ральфа Винса “Математика управления капиталом” с комментариями DTI.

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

Читать обзор 1 | 2



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

Каким способом вы оцениваете волатильность

    • 15 января 2018, 09:09
    • |
    • П М
  • Еще
Продолжение темы про стопы, которую начал здесь

Вот наконец осенило, про два основных способа оценки волатильности:
1. Изменение цены от минимума до максимума или наоборот, за какой-то период — Симметричное измерение по типу Боллинжера, ATR и тп.
2. Изменение цены только в сторону против ]возможной[ позиции — Несимметричное измерение.

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

Если же вы рассчитываете волатильность по второй формуле, то в сильном тренде в % отношении волатильность ваша вычисленная будет падать. Значит стоп будет поближе. А риск будет меньше.

Вопрос, каким способом пользуетесь вы? Если сознательно предпочитаете первый, то почему?
По сути, пост — переосмысление текста по ссылке которую мне дали в предыдущей теме.
Долго же у меня заняло переосмысление.



Как в квике получить текущую позицию по бумагам

Коллеги! Помогите решить простую задачку.

Дано: имеются позиции по бумагам (TQBR).

Надо: получить текущую позицию по каждой бумаге при помощи LUA.

Пробовал пользоваться таблицами depo_limits, firm_holding и account_balance.

Хоть каких-то чисел добился лишь через таблицу depo_limits следующим кодом:
pos1={}
pos2={}
for j=0,getNumberOf("DEPO_LIMITS")-1 do
 pos1[#pos1+1]=getItem("DEPO_LIMITS",j).sec_code
 pos2[#pos2+1]=getItem("DEPO_LIMITS",j).currentbal
end
Проблема такого варианта в том, что он показывает ненулевые значения в currentbal только для позиций, которые были открыты ранее (возможно, по которым прошло +2 дня). По позициям, которые были открыты сегодня, он точно показывает 0.

Подскажите, как правильно решить эту задачку?

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

Мои 5 копеек о покупке торговых систем, признаки системы

    • 14 августа 2017, 14:32
    • |
    • Friend
  • Еще

Хочу вставить свои пять копеек в нашумевшую недавно тему о покупке систем у небезызвестного человека

  1. Хорошие системы продают, но мало, и дорого, цена в 500К это нормальная цена для хорошей системы
  2. Тест, который был представлен (судя по словам) всего 5-6 месяцев – на этом можно было дальше и не смотреть покупку такого робота. На этом этапе необходимо было спрашивать историю максимальной длинны, лучше за всю историю. И смотреть как система себя вела при разных фазах рынка. А лучше сразу забить на систему такого рода.
  3. Слова о том, что выключать систему и включать в определенный момент рынка – вообще смешно. Это тогда и не робот уже.
  4. При покупке должно было говорится о примерном сроке работы системы, без каких-либо обновлений. Любой человек, который создает систему знает на сколько рынок должен поменяться что бы его система перестала зарабатывать.
  5. Система может сломаться 2 способами. Первый – просто перестать генерировать профит и уйти в боковик длинной в несколько лет, наиболее лучший способ поломки. Второй – начать лить безбожно – тогда явно подгонка.


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

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

Трендовость рынка

    • 12 мая 2017, 10:12
    • |
    • Laks
  • Еще

u=ln(S1/Sn)/lnN

S1 — максимум минус минимум за рассматриваемый период*N

Sn — сумма (high-low) N свечь

N- кол-во свеч

u > 0,5 — тренд

u<0,5 — не тренд



Трендовость рынка




Предсказание курса акций Газпрома с помощью нейронной сети на R

    • 07 мая 2017, 10:43
    • |
    • SciFi
  • Еще
В предыдущем посте я писал про вычисление косинуса угла с помощью нейронной сети на R. В этом посте я расскажу о том, как с помощью нейронных сетей можно предсказывать цены и насколько эти предсказания реализуются. 

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

Предсказание курса акций Газпрома с помощью нейронной сети на R
Синяя линия — это предсказание динамики. Нейронная сеть думала, что будет двойное дно, после чего цена пойдет примерно на 137. 

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

Предсказание курса акций Газпрома с помощью нейронной сети на R

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

Совет по кодингу

Господа робото-писатели, это вопрос к вам.
Я уже писал на смарт-лабе, что торгую по сигналам, которые возникают очень редко, а много сделок у меня потому что робот прочёсывает десятки инструментов.
И вот мне пришла в голову дикая, но прикольная мысль как увеличить число торгуемых инструментов.
Можно создавать синтетические пары! Например Никеле-Сбер: GMKN/SBER — сколько сберов надо отдать за один Норникель. Для пары GMKN/SBER можно построить свой синтетический график, этот график можно будет анализировать, накладывать на него индикаторы, получать сигналы, точки входа. Если GMKN/SBER будет расти, вы покупаете GMKN и шортите SBER, то есть открывате синтетическую позицию. А если вы верите в падение пары GMKN/SBER то надо зашортить ГМК и купить Сбербанк.
Таким образом можно на порядок увеличить количество ликвидных инструментов в арсенале трейдера. GAZP/SBER, ROSN/LKOH, MGNT/VTBR — сказка!!!
Но моих навыков программирования не хватает, чтобы это сделать.
Поэтому прошу подсказок.
1. По придуманной синтетической паре, например ROSN/VTBR надо построить график (сколько штук ВТБ надо отдать за 1 Роснефть).
2. Этот график надо проанализировать индикатором. Их любезно написал Сергей Горохов из Арка Технолоджиз. Вот ссылка на архив с кодами всех индикаторов.
ftp://ftp.quik.ru/public/INDICATORS.zip
3. Дальше просто. Блок анализа, блок торговли. Это я умею.
Прошу подсказок как это лучше реализовать.
Павел Маркин, буду очень признателен за советы. Маркин Павел



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

Юра investment banker VS Алексей Васильев (пари)

Всем доброго дня.

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

И так встречайте!

Юра investment banker

А теперь ближе к теме. Суть заключается в том, что Юрий утверждает, и уже вполне давно, что акции банка ВТБ не будут обновлять минимум, то есть уровень 0,0635, и достигнут уровня 0,0750 – 0,0800. Ниже цитата из его утверждения:

Ок, ради интереса на бутылочку хорошего пива пари))) Мой прогноз в ближайшие 3 мес не увидим ВТБ ниже 6,35, будет рост акций ВТБ к 7,5-8 копеек.

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



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

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