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

по

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

Торговый робот QUIK + WEALTH LAB. Урок 16. Первая торговая система. Аналог TSLAB

Изучаем WEALTH LAB. Продолжаем. Урок 16.

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



Робот: блеск и нищета жесткого алгоритма

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

Робот: блеск и нищета жесткого алгоритма

Робот старательно 10 месяцев зарабатывал бабки, намолотив свыше 8000%.
Потом год сливал с просадкой 82.5% от достигнутого максимума.
Потом снова начал зарабатывать и чем это закончится пока неясно.

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

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


Несколько коротких мыслей по поводу "Продажа опционов. Реально ли получать 30-40% годовых с низким риском?" и обсуждения.

    • 02 апреля 2017, 10:06
    • |
    • doctor
  • Еще
Вот этот пост.

Правильная мысль — находится как можно меньше времени в сделке!

Для этого нужно понимать, зачем Вы в нее вошли :) А так как опционы — это торговля волатильностью, то и отталкиваться надо от этого. Делаете ставку на падение волатильности, ну так и закрывайте позицию, если она (волатильность) упала на прогнозируемую величину. Если начала расти, то закрывайте, если видите, что прогноз не правильный. Или корректируйте, если считаете, что это временное явление. Тоже самое и с покупкой волатильности.

Покупать и продавать волатильность можно и ПРИ ВЫСОКОЙ И ПРИ НИЗКОЙ волатильностях. Просто стратегии будут разные, и очень часто — не книжные. Как выбирать? Подсказка — разное распределение риска между гаммой и вегой.

Хотите добавить в конструкцию дельту, добавляйте. Отличие опционов от базового актива — возможность использовать не только дельту, «которая сейчас», но и дельту, «которая потом».

Рабочая ли стратегия по продаже краев? Однозначно, рабочая. Но при определенных условиях. Есть ли менее рискованные подобные стратегии? Да, есть.

И как и при любом трейдинге, риск-менеджмент нужен всегда.

Удачной торговли волатильностью!

Как я открывался у американского брокера

Поломки на бирже, рост тарифов, и наконец инициатива нашего ЦБ подтолкнули меня уйти к американцам. Так как торгую я через Волфикс, то брокера я нашел легко, просто на странице партнеров выбрал АMP Futures. Далее, перейдя к ним на сайт, полазил по нему, обратил внимание справа снизу на иконку Помощь. Оказалось что у них есть русскоязычная поддержка.Вступил с ними в переписку по почте, в результате которой получил пакет документов: анкету для заполнения на английском и русском языках, после заполнения анкеты, соответственно подождал и получил номер договора, а вместе с ним письмо подтверждение опять же на английском и русском языках, реквизиты для пополнения. Распечатал их и отправился в банк Открытие.

С сотрудниками банка возникли некоторые трудности, частично описанные в предыдущем посте. По факту схема выглядит так:
В Банке Открытие открывается счет в долларах, что бы выводить с валютной секции доллары, потом с этого же счета отправлять их в Америку, и на этот же счет с Америки выводить доллары, заводить их на биржу и переводить в рубли.А так же дебетовая карта, что бы получить доступ к интернет банку, через который осуществляются эти переводы за исключением международного. У Открытия брокера выбирается

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

Одиннадцать признаков начавшейся игры на понижение (квинтэссенция практики!)

НОВОЕ ВИДЕО-ОГОНЬ ОТ ИВАНА ЧУРИЛОВА!

Одиннадцать признаков начавшейся игры на понижение (квинтэссенция практики!)

Вашему вниманию предлагается ознакомительное видео в продолжение моего первого большого видео «Малоизвестные приемы биржевой торговли. Часть I».

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

Кстати, 6 и 10 сентября пройдут  два вебинара в связке, на основе вышеуказанного большого видео. Очень рекомендую, мы разберем больше примеров, чем в видео, я дам больше пояснений, добавлю интересные наблюдения. И после этого уже многое из большого видео можно будет успешно применять на практике.

Информация о том, как принять участие, будет в описании к этому видео  и в первом комментарии к нему.

Это было такое интро, ну а теперь к сути.

Как продают акции на растущем рынке и как продают во время игры на понижение



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

Тренажер по трейдингу - полезное приложение!

Установил себе в смартфон это бесплатное приложение — очень полезная вещь! Можно тренироваться когда угодно и где угодно!
play.google.com/store/apps/details?id=net.atozapps.www.tradertrainer&hl=ru
Миллион разных рынков и таймфреймов, можно добавлять индикаторы, кому это необходимо для торговли.
Тренажер по трейдингу - полезное приложение!

Может кто-то знает что-то подобное в лучшем исполнении, то пишите в комментарии.

Делюсь рабочим паттерном на пробой уровня

    • 27 августа 2016, 18:41
    • |
    • void
  • Еще
Всем привет!

Решил поделиться одним паттерном, который встречается довольно часто и весьма неплохо отрабатывает.
ВНИМАНИЕ! Все описанное ниже не является торговой рекомендацией. Используйте эти материалы на свой страх и риск.

Сам я никогда не использую паттерны или модели в их классическом понимании. Для меня существует лишь один паттерн — ложный пробой, который я использую в зависимости от рыночного контекста. В рыночном анализе я учитываю все движения (волны, импульсы) и их зависимость друг от друга. Иногда комплекс таких движений образует повторяющиеся модели, одну из которых я привел ниже.

Делюсь рабочим паттерном на пробой уровня

Далее примеры, как эта модель работает в реале. Австралийский доллар:


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

Гарантированно профитная стратегия

Представляю вашему внимаю древнюю как мир гарантированно профитную стратегию. Она была профитной и 100 лет назад (из «Воспоминания биржевого спекулянта» Лефевра), профитна сейчас, и я почти уверен что и через 100 лет она будет профитной тоже. Причина? — Большинство биржевиков эту стратегию не используют! Даже если знают о ней. Парадокс.

Ну для начала я должен вас подготовить. Что лучше совершить 1 сделку, которая дает 200% прибыли, или сделать 100 сделок, которые в сумме дают те же 200% прибыли? Вам, как и большинству очень хочется себя поистязать, себя помучать, вы считаете что деньги надо заслужить адским трудом, а не заполучать их лежа на диване ничего не делая. Увы, финансовые рынки это мир наоборот, тут чаще всего выгоднее ничего не делать, а не сверлить график круглосуточно.

Лично я бы предпочел открыть одну позу 1 раз за 2 года, взять свои «безрисковые» 200%, и закрыть. Чем те же 2 года круглосуточно сверлить график и то и дело портить себя лосями настроение.

Я думаю все мы хотели бы знать рыночную закономерность, которая работает в 70% случаев на всех рынках. А как вам закономерность которая работает в 97% случаев! :)

Нет, я не про то что «Все рынки всегда растут». Хотя это тоже верно, но я про другое.

Когда цена на любой актив пересекает старый исторический максимум она:
1) Дает более 100% роста в более чем 90% случаев на почти любом активе
2) Более чем в 90% случаев цена НЕ ВОЗВРАЩАЕТ на уровень исторического максимума в первый год (тут ставят стоп, который не сработает почти никогда).



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

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