Избранное трейдера Игорь В.

по

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

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

Одной из самых «сильных», то есть дающих сильный сигнал, моделей в EWP является модель Диагональ, в частности речь, пойдет о конечной диагонали (Ending Diagonal). Данная модель чаще всего появляется в виде заключительной волны 5 в импульсе или волны C в зигзаге.

Диагональ – модель разворота. Часть 1.


Диагонали бывают двух типов, сужающаяся и расширяющаяся. Так как сама по себе Диагональ  появляется не так уж и часто по сравнению с импульсами. Например, если посмотреть статистику Rich Swannell  (см. таблицу, ниже, обозначение ED) то, можно увидеть, что данная модель появляется в импульсе чуть более 20% случаев, а на некоторых рынках и вовсе не дотягивает даже до 10%. 



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

Как я вылечил свою аллергию

По просьбе коллег попробую публиковать в своём блоге статьи про ЗОЖ.
У меня есть готовые статьи, ничего нового выдумывать не буду.
Вот эта статья написана в 2013г.
==
Предисловие к этой статье находится здесь 
Краткий вариант статьи — здесь


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

Реально страдал — ибо с весны до осени я истекал соплями, у меня чесались и гноились глаза (иногда я проснувшись утром не мог открыть глаза из-за слипшихся от гноя ресниц), я реагировал на запахи растений и на приближающиеся осадки (у меня закладывало нос так, что я даже не мог дышать от боли, из-за внутреннего давления, или начинал чихать раз по 30 подряд)

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

Фишечка-рюшечка для протоколов. Wireshark

Введение

      Для меня в свое время стало огромным сюрпризом, что WireShark поддерживает lua. Это открывает отличные возможности для анализа сетевого траффика. Наверняка, не все об этом знают. Поделюсь некоторыми возможностями.

Для кого и для чего

    Речь пойдет об анализе сетевого траффика. В первую очередь, анализом траффика, пользуются алгоритмисты и разработчики для прямого доступом к рыночным данным. На нашей бирже задействованы целый ряд протоколов, под UDP — это в первую очередь FAST (протокол распространения рыночных данных), под TCP — это транзакционные протоколы FIX, TWIME, мульти протоколы (рыночные данные + транзакции) Bridge, Plaza.
   У таких разработчиков и алгоритмистов должны частенько, или периодически, вставать вопросы, что там вообще происходит с торговыми роботами. Во сколько пришли на сетевую карту данные, во сколько отправил заявки, во сколько получил ответы и тд. Ставить временные метки внутри программы и выводить их на экран бывает не совсем то что надо. Во первых, это своего рода лишние задержки выполнения задач, а это уже отвлечение от боевых условий. Во вторых, если железо поддерживает, лучше всего брать временные метки у железа и смотреть во сколько приходят данные с самого сетевого кабеля и во сколько уходят данные в сам сетевой кабель. Это уже будет хороший и точный уровень расчетов.

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

Философия следования за ценой!

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

Вроде бы просто: Цена растёт мы покупаем, цена падает мы продаём — это принцип следования за трендом.
Цена падает и нащупывает поддержку, диапазон цен снижается, цена разворачивается и мы покупаем — это принцип контртренда.

Заранее, хочу сказать, что это моё личное мнение и оно естественно субъективно.
На точность и верность своего суждения, я не претендую!

Я торгую по сигналам закрытия предыдущего дня, т.е. у меня система запаздывает ровно на один день, точнее на одну свечу, по объективным причинам.
Я не торгую тренд или контртренд, а торгую движение самой цены.
Для меня это в своём роде определённая философия торговли.

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

Индикатор для парного трейдинга+рубле-бочка

    • 22 мая 2017, 17:17
    • |
    • Albus
  • Еще
Как и обещал, выкладываю простой индикатор для анализа двух инструментов. Его можно использовать для любых пар на свой вкус.
Вот например, Сбер обычный (вверху) против сбера привилегированного (посерёдке). Индикатор внизу — красный. Для его расчёта первый график поделён на второй.
Индикатор=SBER/SBERP
Индикатор для парного трейдинга+рубле-бочка
Дивиденды по ним одинаковые, ценообразование одинаковое, однако по странной воле рынка в эти дни Сбер обычный слишком дёшев против сбера привилегированного. Красный график утоптан вниз, а ведь ещё недавно был намного выше. Это не совет, но если (вдруг!) вы думаете, что эта несправедливость скоро выровняется, вам надо купить SBER и шортануть на такой же объём SBERP. А ещё лучше шортануть фьючерс на SBERP, чтобы не платить брокеру за акции взятые в долг.
----------
Итак, индикатор. Я дописал к коду комментарии, чтобы даже новичок не кодер мог разобраться.
Скачать индикатор.

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

Золото , инвестиционные монеты (ещё одна попытка ликвидации невежества)

Как не странно, но на Смартлабе (на смартлабе, Карл !) я столкнулся с таким явлением.
Какой-нибудь юзер пишет, что хочет вложить деньги во что-то ещё, кроме ценных бумаг.
Ему советуют разные варианты, и когда очередь доходит до физ золота — то либо сам юзер, либо другие участники обсуждения, начинают резко возражать «Не, не, там же НДС! 18%! Ужос !!!»
Раздаются робкие голоса, что НДС только на слитки, а на инвест монеты нет НДС.
Все удивляются, соглашаются, и на этом все расходятся.

А в другом топике ситуация повторяется один в один.
Что уже раздражает )))
Поэтому я сделаю попытку ликвидировать массовое невежество и обратить внимание смартлабовцев на такой привлекательный инструмент, как физ золото.

1 Инвест монеты не облагаются НДС
2 Инвест монеты надо покупать не в банках — а в конторах (см в гугле)
3 В конторах спред покупка\продажа 2-4% (бывает и хуже, но в такие конторы не надо ходить)(при походе в контору при себе нужно иметь паспорт)
4 Владение монетой более 3 лет не облагается НДФЛ (конторы выдают документ с датой при покупке монеты)

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

ТС "Расширялка VM": торговая система для любого трейдера

    • 30 апреля 2017, 09:24
    • |
    • VladMih
  • Еще
Решил поделиться частичкой того, чем сам пользуюсь — одним из сигналов моей рабочей торговой системы. Пусть не самым крутым (не сразу ж отдавать ключи от депозита), но рабочим даже в руках новичков — ИМХО это главное.
Вы новичок и ищете что-нибудь простенькое для начала?
Вы давно в трейдинге, но успеха нет?
Вы уже зарабатываете, но хотите диверсифицировать трейдинг?
В конце концов просто понимаете, что лишний сигнал не повредит?
Тогда этот пост для вас.

Идеология ТС в том, чтобы забрать ложный размах на якобы попытке разворота тренда. Одни скажут, что это в таких местах «кукл разводит и снимает стопы у тех, кто стоит в тренде», другие еще что-нибудь придумают, но факт в том, что достаточно часто можно брать деньги с продаж после того, как якобы начинается разворот на север. Важно чтобы при правильной общей направленности и относительно небольшом возрасте тренда пришел хороший сигнал нужного индикатора. Тогда мы будем в профите… вместе с куклом. ))

Уже с месяц прошел как ТС «Расширялка» выложена мною на форуме.
Там все правила + рекомендации + трейдинг реалтайм и статистика по нескольким инструментам + открыта дополнительная ветка «вопрос/ответ». Всё наработанное сюда не перенести, поэтому приглашаю за подробностями тех, кого заинтересует это видео (часть пятничного вебинара):



ТС работает на любом таймфрейме (использую от м5 до н4) и, надеюсь, на любом инструменте. Понятно, что я не все проверял, есть надежда, что с проверкой на мамбе помогут смартлабовцы.

ТС легко программируется. Если кто-нибудь возьмется, обещаю помочь советом. Их есть у меня кроме того, что опубликовано. Не то, чтобы секреты, скорей уловки для формализации под робота.

Подписывайтесь на мой Ютуб-канал. Киношками не завалю (уже несколько лет не делал видео), но идейку-другую иногда подкину.


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

Жизненные двустишья

    • 24 апреля 2017, 14:18
    • |
    • Al Best
  • Еще

Жизненные двустишья

   Жизненные двустишья (пожалуй надо выучить)


Не надо делать мне как лучше,
оставьте мне как хорошо
*
я не хотела вас обидеть,
случайно просто повезло
*
поскольку времени немного,
я вкратце матом объясню
*
башка сегодня отключилась,
не вся, конечно, — есть могу
*
следить стараюсь за фигурой,
чуть отвлекусь — она жуёт
*
шаман за скверную погоду
недавно в бубен получил
*
всё вроде с виду в шоколаде,
но если внюхаться — то нет
*
обидеть Таню может каждый,
не каждый может убежать
*
ищу приличную работу,
но чтоб не связана с трудом
*
мои намеренья прекрасны,
пойдёмте, тут недалеко
*
я за тебя переживаю —
вдруг у тебя всё хорошо
*
держи вот этот подорожник —
щас врежу, сразу приложи
*
я понимаю что вам нечем,
но всё ж попробуйте понять
*
о, приключеньями запахло,
спускаю [***] с поводка
*
мы были б идеальной парой,
конечно, если бы не ты
*
как говорится, всё проходит,
но может кое что застрять
*
кого хочу я осчастливить,
тому уже спасенья нет
*
а ты готовить-то умеешь?
— я вкусно режу колбасу
*
звони почаще — мне приятно
на твой «пропущенный» смотреть
*
зачем учить нас, как работать,
вы научитесь, как платить
*
характер у меня тяжёлый,
всё потому, что золотой
*
чтоб дело мастера боялось,
он знает много страшных слов
*
вы мне хотели жизнь испортить?
спасибо, справилась сама
*
её сбил конь средь изб горящих,
она нерусскою была
*
когда все крысы убежали,
корабль перестал тонуть
*
дела идут пока отлично,
поскольку к ним не приступал
*
работаю довольно редко,
а недовольно каждый день
*
была такою страшной сказка,
что дети вышли покурить
*
когда на планы денег нету,
они становятся мечтой
*
женат два раза неудачно —
одна ушла, вторая – нет
*
есть всё же разум во вселенной,
раз не выходит на контакт
*
уж вроде ноги на исходе,
а юбка всё не началась
*
я попросил бы вас остаться,
но вы ж останетесь, боюсь
*
для женщин нет такой проблемы,
которой им бы не создать
*
Олегу не везёт настолько,
что даже лифт идёт в депо
*
меня запомните весёлым,
а завтра я начну ремонт
*
зевну, укроюсь с головою,
будильник заведу на март
*
мы называем это жизнью,
а это просто список дел
*
всё то, что нас не убивает,
богаче делает врачей
*
и жили счастливо и долго...
он долго, счастливо она
*
я не туплю, а экономно
расходую потенциал
*
мне психиатр сказал: присядьте,
щас успокоюсь и начнём
*
в народ ходили депутаты
лишь только по большой нужде
*
сержант почти поймал бандита,
но тот по званью выше был
*
в постели ты великолепен,
все две минуты просто бог
*
пришла ко мне сестра таланта,
но не достала до звонка
*
я ненавижу власть и деньги,
когда они в чужих руках
*
Олег весь день крутил баранку,
потом не выдержал и съел…     ok.ru/video/271020656072


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