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

по

Торговая стратегия - Ишимоку без секретов

Ишимоку — комплексная стратегия, предложенная Гойчи Хосода (Goichi Hosoda). Комплексная означает, что она может использоваться самостоятельно без других индикаторов. Ишимоку — стратегия следования тренду, что значит, что на не будет ловить вершины и днища, но будет говорить нам, что мы в тренде (не в коррекции). Эта стратегия в точности показывает точки входа и выхода! У нас есть несколько методов.

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

Перейдем к делу.

Ишимоку имеет 5 линий:

  1. Тенкан Сен (Tenkan Sen)
  2. Киджун Сен (Kijun Sen)
  3. Чикоу спан (Chikou Span)
  4. Сенкоу Спан А (Senkou Span A)
  5. Сенкоу Спан В (senkou Span B)

1. Тенкан сен (формула (HH + LL)/2 за последние два периода)

Для нас это очень важная линия, мы открываем позиции только в соответствии с ней!
Торговая стратегия  - Ишимоку без секретов


2. Киджун сен
 (формула (HH+LL)/2 за последние 26 периодов)



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

Про Quik, про карман, про лимитные и стоп-заявки

Здравствуйте дорогие мои! Вы наверно уже соскучились?
Хочу поделиться с вами классной штукой в квике под названием «Карман».
Уверен, что не все знают про эту функцию.

Quik карман

Для чего нужен карман?

Представьте, что вы хотите купить ценную бумагу по определенной цене. Пусть это будет всеми известный Газпром. Вы хотите купить акцию Газпрома по цене 100р. Текущая цена болтается в ценовом коридоре 120-130.

Вы выставляете рыночную заявку на покупку в стакан по цене 100р. Так как за весь день цена не доходит до уровня 100р, то на следующее утро ваша заявка снимается. И так повторяется изо дня в день, т.к. Вы упорный и терпеливый и вот уже полгода ждете свой Газпром по 100.

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

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

ОБЗОР VWAP (VOLUME WEIGHTED AVERAGE PRICE)

VWAP — это внутридневный расчет, используемый в основном HFT алгоритмами и институциональными трейдерами для оценки того, где акции торгуются относительно среднего значения объема за день. Внутридневные трейдеры также используют VWAP для оценки направления рынка и фильтрации торговых сигналов. Перед использованием VWAP, необходимо понять, как он рассчитывается, как его интерпретировать и использовать, а также какие недостатки у этого инструмента.

Как рассчитывается VWAP?

VWAP (Volume Weighted Average Price) — это аббревиатура от Средневзвешенной цены по объему. На первый взгляд, вы можете думать, что VWAP — это всего лишь индикатор средней цены. Но VWAP — это нечто большее.

Индикатор скользящей средней чаще всего основан только на одной цене (закрытия) актива, и он никогда не даст вам точной информации об истинной средней цене. Чтобы определить истинную среднюю цену акции (или другого актива), вам необходимо фактическое количество транзакций по целому ряду цен. Это то, что может делать VWAP.



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

OptionSmile 2.0 beta открыта для тестирования

    • 16 августа 2017, 13:01
    • |
    • ataden
  • Еще
Всем добрый день.

От нас давно не было новостей, т.к. наша команда была занята разработкой новой версии платформы.
Кто не знаком с платформой OptionSmile, приглашаю на русскоязычный сайт www.optionsmile.ru с описанием методики, видео-презентациями и пр., или читайте здесь, на смартлабе.

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

Какие новые возможности появились в платформе:
  • Можно выбирать конкретную дату экспирации по каждой бумаге. Система сама ежедневно обновляет данные о доступных датах экспирации на биржах  - по некоторым высоколиквидным бумагам даты добавляются биржами по несколько раз в неделю. В интерфейсе после выбора любой даты будет рассчитано количество торговых дней до экспирации с учетом выходных и праздников — по торговому календарю той страны, в которой торгуются эти опционы. Раньше нужно было самостоятельно искать доступные даты экспирации и высчитывать количество торговых дней до них.
  • Путы и колы теперь считаются одновременно, диапазон денежности можно указывать отдельно для каждой стороны.
  • На графике цен базового актива отображаются выбранные интервалы дат для фильтрации. Удобно визуально контролировать те периоды, которые попадут в историческую выборку.
  • Все отфильтрованные даты, которые после наложения всех фильтров в итоге попали в выборку для расчета справедливых цен опционов, также видны на графике цен базового актива. Например, можно контролировать, не попали ли они все в какой-то один уникальные период в истории. В идеале режим рынка, который мы хотим анализировать, должен быть более-менее распределен в истории и встречаться неоднократно.
Эти небольшие, но полезные функции после бета тестирования будут доступны в основной версии. Однако в системе появились еще две большие функциональности, которые потребовали существенной переработки всей начинки «под капотом»:

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

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

Торговая система с возвратом к среднему

Торговая система с возвратом к среднему

Статья с сайта www.miltonfmr.com, из которой можно взять некоторые приемы, пригодные даже для использования в высокочастотной торговле.

Многие трейдеры, создающие и правильно применяющие торговые системы с возвратом к среднему, получают хорошую прибыль. Факты говорят о том, что рынки двигаются в соответствии с паттернами, одним из которых является цикличность. Простыми словами, все, что двигалось вверх, должно пойти вниз и наоборот. Ничто не движется в одном направлении вечно. Применительно к рынкам, у нас есть два возможных исхода — тренд, либо определенный торговый диапазон с возвратом к среднему. В прошлых наших исследованиях было показано, что гэп на открытии определяет тренд на остаток дня в 30% случаев. Это значит что из 20 торговых дней мы имеем 6 трендовых дней без возврата к среднему. С другой стороны у нас есть 70% движения цены, которая имеет тенденцию к возврату к среднему значению несколько раз за день. Важно отметить, что эти 70% относятся к внутридневному движению цен.



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

Фундаментальный анализ или какую страну "профукали".

Перечень сведений, запрещенных к опубликованию в открытой печати, передачах по радио и телевидению», 1976 год.
Фундаментальный анализ или какую страну "профукали".
Среди секретного:
Численность населения, начиная с 1975 года.
Численность рабочих и служащих по народному хозяйству.
Прием, выбытие, текучесть рабочих.
Общее количество научных учреждений.
Данные о партийном, комсомольском и национальном составе военнослужащих.
Сведения о военных парадах.
Сведения по выборам в Верховный Совет СССР.
Сведения о количестве воинских автомобильных подразделений, участвующих в уборке урожая.
Сроки подготовки прапорщиков (мичманов) и старшин.
Сведения о низком политико-моральном состоянии военнослужащих.
Сведения о чрезвычайных происшествиях, авариях и катастрофах в Вооруженных Силах СССР.
Денежное довольствие, нормы материального обеспечения и снабжения военослужащих.
Размеры пенсий офицерам.

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

10 заповедей успешных инвестиций Уоррена Баффета

Уоррен Баффет – самый известный и богатый в мире инвестор, который сделал свой капитал, инвестируя в акции. По версии Forbs, Баффет располагается вторым в списке миллиардеров планеты – после Билла Гейтса. Его состояние ныне составляет 46 млрд долларов…

Первый принцип Уоррена Баффета:

Инвестирование состоит в том, чтобы вложить деньги сегодня и завтра получить больше денег…

Уоррен Баффет всегда вёл достаточно скромный образ жизни: вместо того чтобы жить в дорогих коттеджах и питаться в ресторанах, он каждую свободную копейку (то есть цент) вкладывал в акции. За 35 лет он увеличил сумму со 100 тыс. долларов на 200 000 процентов.

Второй принцип Уоррена Баффета:

Покупайте акции только тех компаний, чья продукция нравится вам лично…

Например, сотовая связь МТС, удобство банкоматов Сбербанка или обслуживание в аптеке 36,6… Баффет рассказывает, что по утрам он любил читать газету «Вашингтон пост», в итоге, купив пакет ценных бумаг за 100 млн долларов, он заработал 1 млрд долларов. В 4,5 раза он увеличил сумму, и купив 9-процентный пакет акций компании, изготавливающей его любимую бритву «Жиллет».



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

Ушел на CME.

Нашим рынком нахавался на три жизни вперед уже… торговать тут просто нечем.

В пятницу отправил документы на оформление счета на СМЕ, вчера утром вывел ВСЕ бабки от российского брокера, вчера же отправил их в штаты.... 

И ВЧЕРА УЖЕ СДЕЛАЛ ПЕРВУЮ СДЕЛКУ.

На мосбирже счет ДОЛЬШЕ ОТКРЫВАТЬ!

Терминал остался тот же, что и был на российском рынке)))

Ушел на CME.

Пинг на америку 150-200 млс… сцуко, у вас в конченом квике такой пинг по умолчанию и даже больше)))))

Минимальное депо, кстати, 30000 рублей))) или 500$, почти как на форекс зайти, и плечо почти такое же)

Народ! че ссым? гоу грабить американских домохозяек! Введем им санкции-хуянкции)

QUIK, LUA, Робастность и прочее...

Зачитался, я тут на днях про робастную регрессию, и очень мне захотелось «пощупать» этого зверя хоть в каком нибудь виде на графике в Квике.

Выбрал наипростейшую — "Оценочная функция Тейла – Сена"
Эта оценочная функция может быть эффективно вычислена и она нечувствительна к выбросам. Она может быть существенно более точна, чем неробастный метод наименьших квадратов для несимметричных и гетероскедастичных данных и хорошо конкурирует с неробастным методом наименьших квадратов даже для нормально распределенных данных в терминах статистической мощности.
Метод признан «наиболее популярной непараметрической техникой оценки линейного тренда»
QUIK, LUA, Робастность и прочее...

Сказано — сделано.

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

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