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

по

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

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

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

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

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

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


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

Поставить QUIK на сервер?

Вчера дома, пока был на работе, в очередной раз вырубили электричество, на компе работали роботы (((
Особых потерь из-за этого не было, но всё же неспешно думаю о перебазировке квика и роботов на сервер. В связи с этим вопросы к знающим людям.
1) ОС на сервер обязательно ставить Windows Server? Или можно установить и Windows 7, 8, 10?
2) Какие нюансы работы QUIK на сервере?
3) Какие есть книжки (ресурсы в инете) по управлению этим хозяйством?

Робот не быстрый, скорость не нужна, нужна надёжность связи.


Про собеседования и работу

Тема актуальная, поэтому тоже дам несколько советов соискателям

Скажу сразу, это как отношения с женщинами. Очень много общего. И данную аллегорию я буду использовать часто. :)

1. Уверенность, причем внутренняя уверенность, что в вас нуждаются не меньше чем вы в компании. Отчаяние, страх — все это чувствуется подсознательно. Как обрести эту уверенность — есть несколько вариантов. Самый простой — это наличие существующей работы, откуда вас не увольняют. Вы ничего не теряете на собеседовании! Вы пришли проверить рынок, посмотреть. Похожее ощущение дают альтернативные офферы. Основной драйвер уверенности — ваше чувство собственной компетенции. Когда я приходил 10 лет назад на аналитика, имея два сданных уровня CFA, и меня спрашивали, могу ли я пройти тест сделанный по 1му уровню — я улыбался, и понимал, что заведомо превышаю то, что нужно компании. 

2. Подготовка. Вам нужно постараться выяснить, что хочет компания. Какие ключевые компетенции от вас ждут. Вообще, подготовка — это очень важно. Проявляя знания о менеджменте, собственнике, чем занимается компания, какие-то ключевые проекты — вы производите хорошее впечатление. Худшее, что можно сделать — это быть человеком, который пришел просто потому что ходит по разным квази-подходящим вакансиям. Работодатель — это как женщина. Вам нужно показать, что вы именно ее хотите, и полунамеками объяснить почему.

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

20 лет спустя...ч.6 (заключительная)

Предыдущие части:
  1. smart-lab.ru/blog/307322.php
  2. smart-lab.ru/blog/307366.php
  3. smart-lab.ru/blog/308100.php
  4. smart-lab.ru/blog/309140.php
  5. smart-lab.ru/blog/309519.php
  6. Допматериал. Биткоин
В 2012 году рынок изменил свой характер. В первом квартале имея очень неплохую промежуточную прибыль я потерял 2/3 ее к экспирации. В принципе уже в 2011 я начал замечать, что рынок меняется, но там был бурный август-сентябрь и сделать вывод об изменении характера было нельзя. Что же изменилось? Уменьшилось колличество «черных лебедей», и, как следствие, рынок поменял способ реагирования на них. Такие изменения для меня были очень неприятны. После августа 2011 я принял решение торговать с ограниченным ГО, но даже такая торговля стала затруднительной. В результате во втором квартале я получил очень большой дневной убыток (ну ладно, ладно, раскрою вам тайну, любопытные вы мои — 8 млн. р).

Это событие послужило последней каплей — я задумался что делать дальше. Интуиция (или 16 летний трейдерский опыт, если угодно) подсказывала, что такой рынок может продлиться года полтора-два. Менять стратегию — сбивать прицел, ну его нафиг. В моем подходе большая доля чистого ощущения риска  - когда его прикрывать, когда добавлять, так что очень не хотелось потерять это ощущение. Я было подумал, что надо взять отпуск на эти пару лет, тем более что было много идей, которые надо было бы проверить путем чисто математических исследований. Но я поступил неправильно… продолжил торговать по старой методе, дабы не пропустить тот момент когда рынок снова поменяется. В принципе, при сниженных рисках, метода выдерживает неудобный рынок и, если повезет, даже может немного заработать, ну например 30% годовых. 

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

Очень подробно разжёвано для чайников по LUA часть1!

    • 19 ноября 2015, 06:38
    • |
    • aura
  • Еще

Скрипты на языке Lua

Написанный на Lua скрипт не имеет какой-либо специальной функции, с которой начиналось бы его выполнение. Скрипт можно рассматривать просто как набор команд (инструкций), который выполняется, начиная с первой инструкции.

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

a = 1; b = 2

a = 1 b = 2

a = 1;

b = 2;

a = 1

b = 2

Работа с переменными в Lua

Переменные используются для хранения значений в процессе выполнения скрипта.

Имена переменных в Lua

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



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

Лучшая книга про биржу, которую я читал

Рецензия на книгу «Flash Boys» — Майкл Льюис (Скачать)
Лада (см. первую рецензию) кратко пересказала о чем книга, так что мне остается только добавить что это очень полезная и неплохо написанная книга на сверхактуальную тему. Предыдущим творчеством М.Льюиса я честно говоря не был впечатлен. Но эту очень рекомендую.Кстати, программиста Алейникова выпустили из тюрьмы, по сути признав что сидел ни за что.

Правильный трейдинг. Суть.

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

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

Всех людей на планете в контексте их отношений с биржевой торговлей можно разделить на 4 ключевые группы: 
1) Трейдеры- люди, обеспечивающие своими действиями монотонное увеличение капитала путем торговли проверенных на истории алгоритмов. 
2) Участники торгов-люди, совершающие покупки/продажи на бирже вне рамок проверенных и подтвердивших свою успешность алгоритмов. 

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

Thinkorswim настройки и работа с вочлистами.

Разные, мелкие фичи, которые облегчают работу.

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