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

по

Код робота на 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. Бесплатная программка для трейдера

Написал небольшой помощник для трейдера. Он посылает СМС, когда цена достигнет определенного уровня.  У некоторых брокеров такая фича встроена в QUIK. Но у многих ее и нет. Так что думаю, что будет полезно. Скачать можно тут  https://yadi.sk/d/yp1NKqV_3JszLC




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

Как вы учили иностранный (английский) язык?

Всем привет. У меня есть знания английского на уровне университета, но их не хватает для того читать (смотреть) контент на английском. Хочу поднять знания до уровня Intermediate. Стоит ли идти на курсы? Понятно, что многое зависит от желания, но, все же, дадут ли занятия с преподавателем результат. Или лучше вместо того, чтобы платить за курсы год — съездить на месяц за границу.

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

Акции, которые не боятся кризисов: США

Подборка американских компаний, которым нипочем рыночные катаклизмы. Они все так же устойчиво «делают своё дело», платя дивиденды и повышая котировки.

Акции, которые не боятся кризисов: США

Ключевой мерой независимости цены акции от общеэкономического климата является коэффициент Beta (β). Он показывает, насколько цена акции коррелирует с ценами большинства акций на рынке или с общерыночными фондовыми индексами типа S&P 500 или Russell 3000.

Рисковые инвесторы, которые умеют предсказывать поведение рынка, предпочитают волатильные акции с большими β>1. Но для большинства не слишком профессиональных инвесторов удобнее активы с β~0, так как из них легко собрать так называемый бета-нейтральный портфель, способный давать стабильный постоянный прирост порядка 10% годовых, не реагируя на кризисы.

В этом обзоре мы расскажем об американских акциях с малыми β. Причём таких, которые не просто независимы от рынка, но и показывают стабильный многолетний рост котировок. Мы расскажем об акциях, которые сильнее всего подорожали за 10 лет при соблюдении следующих дополнительных условий.



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

Практика направленной торговли опционами на акции. Часть 3. Управление позицией

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

 

Лучшее управление позицией – это заключать только прибыльные сделки, и не делать убыточных. Я серьезно. И так и пытаюсь действовать.

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

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

 

Управление позицией – это то, чего не бывает c акциями. Что ты будешь делать, если ты купил акцию и играешь на её повышение, а цена упала? Закрывать или усредняться, больше ничего. Если усредняться, так это по сути не управление позицией, а открытие новой сделки по тому же тикеру, с новой ценой. Ведь на риски и профит по ранее открытой позиции ты никак не повлиял, вместо этого ты открыл новую сделку по тому же тикеру. И еще непонятно, хорошо это или плохо. А важно, что это действие потребовало добавления капитала, т.е. начиная с определенного момента падения и оно станет недоступным, с точки зрения риск-менеджмента. Итого ты фактически можешь только закрыть позицию – признать убыток, и ничего больше. Или тебе надо для работы с акциями делать что-то фьючем или опционами, в общем опять же приходим к опционам.



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

Инвестиционный план Олега Клоченка на 2017-2018 годы

Тезисно перессказываю, оригинал тут.

Олег Клоченок, частный инвестор

  • Доходность ОФЗ = 2x инфляция, депозиты и дивдоходность ММВБ > инфляции
  • Деньги дорогие, => деньги будут дешеветь => рынок дешевый.
  • Либо должны упасть доходы у компаний, чтобы пришло в равновесие, но даже если доходы упадут в 2 раза, все равно акции будут недороги
  • Собственный портфель впервые с 2009 года на 90% акциях.
  • Если будет падать рынок, буду снова покупать.
  • два сценария на будущий год: (1) рост индекса на 2600-2800, на фоне падения стоимости долга, или (2) колебания между 1600 и 2100, на фоне «международного кризиса»
  • ценовых ориентиров нет
  • в кэше сейчас находится страшнее чем в акциях

Что покупать в случае коррекции:
В первую очередь, следить собираюсь, если рынок пойдет на 1500-1600 по широкому индексу ММВБ, за ГМК Норникель, ВСМПО Ависма, Росагро, Фосагро, Мосбиржа, ЛСР. Кроме того, Газпром, Роснефть, Мечел пр., ФСК, Русал, Ленэнерго пр. присутствуют в моем портфеле в заметных количествах, так что тоже приглядывать буду волей-неволей. Если цены будут существенно ниже текущих – я буду добирать акции этих списков, вероятно.

Подробности на 2 вебинарах в июне-июле. Цена 6000 руб.
http://roundabout.ru/4

Презентации с конференции смартлаба

Silent Hamster (со стейтментом!)

Андрей Карабъянц
 (рынок газа и нефти)

Роман Андреев
(психотрейдинг)

Элвис Марламов (что купить на коррекции)

Игорь Лахуин
(облигации)

Павел Крапчитов (идеи для роботов на TSlab)

Кирилл Фомичев
(внебиржевой рынок)

Анатолий Радченко (в 10 раз за 10 лет)

QPILE. Брент в рублях

    • 25 апреля 2017, 20:55
    • |
    • gardist
  • Еще
Изучаю QPILE. Первый скрипт- брент в рублях:
PORTFOLIO_EX BRENT_RUB;
DESCRIPTION Нефть в рублях;
CLIENTS_LIST  ALL_CLIENTS;
FIRMS_LIST ALL_FIRMS;

 
PROGRAM
         ' =========Пользовательские настройки=============
         INSTRUMENT_BRENT="BRK7" ' код инструмента BRENT
         INSTRUMENT_USDRUB="USD000UTSTOM" ' код инструмента USDRUB_TOM

         CLASSCODE_FUT="SPBFUT" ' код группы
         CLASSCODE_ETC="CETS" ' код группы

         PriceBrent = 0 + GET_PARAM(CLASSCODE_FUT,INSTRUMENT_BRENT, "OFFER")
         PriceUSDRUB = 0 + GET_PARAM(CLASSCODE_ETC,INSTRUMENT_USDRUB, "OFFER")

         BRENT_RUB=PriceBrent*PriceUSDRUB

         ' ===============СЕРВЕРНЫЕ ДАТА И ВРЕМЯ===============
         SERVERDATE=GET_INFO_PARAM("TRADEDATE")  ' дата сервера в формате DD.MM.YYYY
         SERVERTIME=GET_INFO_PARAM("SERVERTIME") ' время сервера в формате HH:MM:SS
         DATETIME(SERVERDATE,SERVERTIME) ' вызов функции даты-времени

         ' ===============ДАННЫЕ В ТАБЛИЦУ===============
         OUTPUT_BRENT=CREATE_MAP()
         OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"BRENT_RUB" , BRENT_RUB)
         OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"SERVERTIME" , SERVERTIME)
         OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"SERVERDATE" , SERVERDATE)
         OUTPUT_BRENT=SET_VALUE(OUTPUT_BRENT,"INSTRUMENT" , INSTRUMENT_BRENT)

         DELETE_ALL_ITEMS()

         ADD_ITEM(1,OUTPUT_BRENT)

         ' ===============ФУНКЦИИ===============
         ' ФУНКЦИЯ СЕРВЕРНЫХ ДАТЫ И ВРЕМЕНИ
         FUNC DATETIME(FSERVERDATE,FSERVERTIME)
                 CURYEAR=SUBSTR(FSERVERDATE,6,4) ' текущий год в текстовом формате
                 CURMONTH=SUBSTR(FSERVERDATE,3,2) ' текущий месяц в текстовом формате
                 CURDAY=SUBSTR(FSERVERDATE,0,2) ' текущий день в текстовом формате
                 CURDATE=CURYEAR & CURMONTH & CURDAY ' дата в текстовом формате
                
                 CURHOUR=SUBSTR(FSERVERTIME,0,2) ' текущие часы в текстовом формате
                 CURMIN=SUBSTR(FSERVERTIME,3,2) ' текущие минуты в текстовом формате
                 CURSEC=SUBSTR(FSERVERTIME,6,2) ' текущие секунды в текстовом формате
                 CURTIME=CURHOUR & CURMIN & CURSEC ' время в текстовом формате
         END FUNC

END_PROGRAM

PARAMETER SERVERDATE;
PARAMETER_TITLE Дата;
PARAMETER_DESCRIPTION Дата;
PARAMETER_TYPE STRING(10);
END
 
PARAMETER SERVERTIME;
PARAMETER_TITLE Время;
PARAMETER_DESCRIPTION Время;
PARAMETER_TYPE STRING(10);
END

PARAMETER BRENT_RUB;
PARAMETER_TITLE Нефть (руб.);
PARAMETER_DESCRIPTION Нефть (руб.);
PARAMETER_TYPE STRING(10);
END

END_PORTFOLIO_EX

ссылка на скрипт

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

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

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

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


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


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