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

по

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

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

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

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


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

Моники для трейдера.

Закупил себе пару моников 4К на 43", доволен как слон, всем советую. Ваще бомбезные.

Моделька Dell P4317Q — это щя самый топ из доступных за вменяемые деньги, и денег хотят за них ваще не много, можно ниже полтоса найти.

Альтернатив на рынке сейчас нет. 

Тупо думал ставить две стойки по 4*24 в итоге взял эту парочку и она полностью заменяет 8 штук на 24"

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

Моники для трейдера.


Моники для трейдера.

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

Почему трейдер не писатель?

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

Секреты успеха – адекватный профессионал считает, что нет их. Ни секретов, ни успеха. Это простая механическая работа, при наличии ТС и дисциплины, вовсе не публичная профессия, где проявляется какой-то особый талант. Ну как дворник, или бухгалтер. И успеха нет – если вы каждый день ходите в офис и делаете стандартные отчеты, и кладете кирпичи на стройке это успех? Здесь также, взял простую стратегию, две, три и работаешь. Все очень рутинно. Представьте интрадейщика, пытающегося вести блог: Вышли из утреннего флета, зашел, стоп там-то. Прошли полцелевой зоны, перевел в б\у. Выбило на новости, обратный сигнал, перезашел, отработало»….Зашел, не отработало, убыток, сигналов на сегодня нет»… Пошли к уровню, перепродано, зашел в контртренд, обработало. Продолжается вчерашний тренд, зашел, добавил по ходу, первая сделка в б\у. Подтянул стоп, обе сделки выбило, день в б\у.



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

Бэктестинг: пересечение RSI разных периодов

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

Рассмотрим пересечение индикаторов RSI разных периодов. Алгоритмы пишем в Quantopian на Python.

В этот раз:

  • Попробуем быть на шаг впереди, используя 13-дневный и 65-дневный периоды RSI.
  • Попробуем использовать стандартные 14-дневный и 70-дневный периоды RSI.
  • Посмотрим на лучший период прошлого теста и используем 20-дневный и 100-дневный RSI.
  • Попробуем отфильтровать тренды с помощью скользящих средних.


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

Лень и праздность – залог здоровья!

Считает Петер Акст, знаменитый немецкий медик.

Так как посты про здоровье стали мега актуальными на СЛ, а эту тему запустил сам Тимофей, то считаю должным поделиться интересной статьей. Так что, его величество, РЕПОСТ.

Что за бред сивой кобылы, наверняка скажет продвинутый читатель. Совсем эти профессора сбрендили! Всем же хорошо известно: чтобы сохранить здоровье и продлить молодость, быть успешным в обществе и трудовом коллективе, надо пробегать по утрам несколько километров, а еще лучше – марафон по выходным! Упорно качать мышцы железом, тренажерами в фитнес-центре. И будет вам долгая, счастливая, жизнь!
С таким настроем я и стал перелистывать книгу Петера Акста «Ленивые живут дольше».

Читаю и глазам не верю: «Лень и праздность – залог здоровья». Чистое шарлатанство. Ну, профессор, погоди! Выведу тебя на чистую воду…

БАБИЙ ВЕК ДЛИННЕЕ МУЖСКОГО


Однако этот Акст оказался не прост. Под свое заявление подвел научную базу. Мол, еще в 1908 году физиолог Рубнер установил, что каждому существу вроде бы отпущено ограниченное количество жизненной энергии. Ересь, конечно! Типа забытой пресловутой теории, что каждому мужчине якобы природой дано определенное число половых актов. Недаром ихнего Рубнера быстро забыли. Однако в последнее время идея вновь обрела популярность. Еще один ученый немец, Принцингер, заново исследовал теорию жизненной энергии, которая официально именуется теорией обмена веществ. И установил: все живые существа, в зависимости от массы тела, обладают одинаковым запасом жизненной силы. Профессор приводит конкретные расчеты, тысячи килоджоулей на грамм массы тела. Человеку, вроде бы, отпущено природой вдвое больше энергии на единицу веса, чем большинству животных. Поэтому в принципе он может жить до 130 лет.

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

Plaza 2, Fast, Fix, TWIME. Вопросы чайника.

Повышаю уровень технической подготовки. По мотивам:

Plaza II
сайт биржи - http://www.moex.com/a582
форум биржи - http://forum.moex.com/viewforum.asp?f=12
Топики на смартлабе:
https://smart-lab.ru/blog/30661.php
https://smart-lab.ru/blog/360270.php
https://smart-lab.ru/blog/361797.php

Протокол FAST
сайт биржи - http://www.moex.com/s441
статья на хабре - https://habrahabr.ru/company/itinvest/blog/243657/

Протокол FIX
сайт биржи - http://www.moex.com/a554
Топик на смартлабе - https://smart-lab.ru/blog/310446.php

Протокол TWIME
форум московской биржи - http://forum.moex.com/viewtopic.asp?t=30534&topicdays=0&postorder=asc&start=0
Топик на смартлабе - https://smart-lab.ru/blog/357048.php

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

О психологии торговли

Ларри Вильямс формулирует свое самое важное правило следующим образом:

«Я верю, что моя текущая сделка будет убыточной, очень убыточной».

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

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


Видишь пять волн, жди разворот. Часть 1.

Из-за непредвиденно продолжившегося выходного, обзоры разместить сегодня не получится, но так как есть немного свободного времени, решил написать небольшую заметку в продолжение серии заметок о технической части EWP и применении её на практике. 

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

Импульс – это наиболее распространенный вид действующей волны, и так как импульс является основным паттерном в  EWP то, все, абсолютно все модели как начинаются с импульсов так ими и заканчиваются. Видишь пять волн, жди разворот. Часть 1.

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



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

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

Про мартингейл (ликбез)

Просто удивительно, какой процент участников смартлаба (см. опрос) считает, что мартингейлом можно получить прибыль.
Играем в бросание монетки. Орел = + 1 рубль, решка -1 рубль. Комиссии, спреды, свопы/контанго не учитываем.
Будем бросать 4 раза подряд. Сначала играем без мартингейла.

Рассмотрим сразу все возможные исходы партий.

 Про мартингейл (ликбез)

 Отметим, что средний итог всех партий = 0.

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

 Про мартингейл (ликбез)



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

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