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

по

Торговый робот на Lua для QUIK.

    • 27 декабря 2018, 09:39
    • |
    • XXM
  • Еще

4 года и 4 месяца прошло с выхода поста «Торговый робот на LUA для QUIK» (https://smart-lab.ru/blog/200767.php) про конструктор Lbot. За это время он повзрослел, лишился графического интерфейса и… превратился в младшего брата для Lbot3D. И если раньше для Lbot была пробная версия (с одним инструментом и одним лотом), то теперь, фактически, сам превратился в пробную версию для Lbot3D и, с этого дня, предоставляется в свободное пользование с полным функционалом:

Торговый робот на Lua для QUIK.

Скачать Lbot180.zip можно тут: drive.google.com/open?id=1DL9jGEBm2Uhk89PcQdlK-ObaOe2zihnx
INI-файл написан для демо-QUIK на 3 инструмента — Сбербанк, Газпром и Лукойл. Стратегия на Газпроме — безиндикаторная, на Сбербанке — на скользящих средних, на Лукойле — на пересечениях MACD.

encoding = "UTF-8"
FREQUENCY = 1000
account = NL0011100043, 10110
PositionSize = 300000
xy = 421, 0, 859, 118
;-------------------------------------------------------------------------------
[GAZP]
Security = GAZP, QJSIM, Gazp_moex
WorkSize = 3		//  рабочий объем, в штуках;
LossLimit = 100		// ограничение на убыток по стратегии
OpenSlippage = 10	// допустимое проскальзывание на сделке, в количестве минимальных шагов цены;
OpenLong =  {Close, 1} < {High, 2}	// цена 'close' предыдущей 'полной' свечи превысила 'high' предшествующего ей бара;
OpenShort = {Close, 1} > {Low, 5-2}	// цена 'close' предыдущей 'полной' свечи принизила 'low' 5-2 баров;
StopLoss = 2
TakeProfit = 3, 1, 1
EOD = 18:29:00	//закрытия позиции в указанное время.
autoBot = Y
[SBER]
Security = SBER, QJSIM, Sber_moex
WorkSize = 10
LossLimit = 100
OpenSlippage = 10
OpenLong	= {Ema1} > {Ema2}
CloseLong	= {Ema1} < {Ema2}
OpenShort	= {Ema1} < {Ema2}
CloseShort	= {Ema1} > {Ema2}
autoBot = Y
[LKOH]
WorkSize = 2
Security = LKOH, QJSIM, Lkoh_moex
LossLimit = 225
OpenSlippage = 10
OpenLong	= cross(macd_Lkoh.0, macd_Lkoh.1)
OpenShort	= cross(macd_Lkoh.1, macd_Lkoh.0)
;OpenLong =  {Close, 1} < {Low, 5-2}
;OpenShort = {Close, 1} > {High, 2}
StopLoss = 30
TakeProfit = 50, 10, 10
autoBot = Y


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

Торговая система BWS

    • 04 декабря 2018, 07:40
    • |
    • AlexChi
  • Еще

Торговая система BWS

Введение

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

         Если вы уже давно торгуете на фондовом рынке, то наверняка заметили, что одни и те же бумаги растут сильнее рынка, а другие все время стоят на месте или даже падают. Примеров можно привести много: это и ВТБ, который разместился на IPO в 2007 году по 13.6 копеек, а сейчас стоит менее 4 копеек, это и Газпром, который когда-то в 2008 году стоил более 300 рублей, а сейчас, спустя 10 лет, стоит в два раза меньше. Да и каждый из вас без труда может привести множество подобных примеров. В то же время есть бумаги, которые выросли за это время в несколько раз, оставаясь лучшими много лет подряд.



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

Мои сигналы и опционы

Моя задача на текущий момент состоит в том, чтобы спуститься на ТФ — 1мин. Но на этом путь есть ряд объективных сложностей, которые предстоит преодолеть. Связаны они с появлением трудностей физического плана. Элементарно не успеваешь. На 5мин уже и то бывает сложновато.

Почему стоит такая задача? Потому что чем меньше ТФ, тем больше потенциальная прибыль, меньше стопы, больше возможностей брать определенные поставленные цели, меньше время, которое мы проводим в позиции. Как уже говорил, береговая линия Великобритании Англии при увеличении масштаба стремится к бесконечности.

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

Недавний (я бы даже сказал текущий) пример.

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

Классическая скальперская формация

Всем привет, записал небольшую сделку. Рыночная ситуация, которая возникает по несколько раз на дню. И хотел бы немного пояснить. Часто тут в комментах люди пишут, что скальпингом невозможно брать хорошие, сильные движения. И вот тут очень важный момент. Люди не понимают, что тех анализ — это бутафория. Вы просто цепляетесь за кусок графика и дальше от этой исходной точки выстраиваете свою торговлю и просчитываете риски. Те, кто это понимают — зарабатывают свои 7-10% в месяц, те кто ищут мега-супер-пупер формации, которые скрывали от вас долгие годы — теряют.
Торгуя скальпингом, я с огромной долей вероятности могу определить, что будет с ценой в ближайшие 10-15 минут. И это не просто ставка, это понимания рынка, хоть и в рамках очень маленького промежутка времени.

Сделка на проедание плотности


Всем привет, записал небольшое видео классической скальперской сделки на проедание плотности.
Здравая критика приветствуется.


Настройка ИТС Квик для интрадей на ФОРТС , продолжение части1.

Главный принцип  и идея : минимизировать количество окон и таблиц, а также оптимизировать параметры самих таблиц. Убрать море ненужной визуальной информации, но оставить всё что необходимо и расположить эргономично, удобно.
Итак, после удаления всех ненужных вкладок и окон в одной оставшейся нужно настроить кое-какие параметры через меню «система».
. Нажимаем система-настройки-основные- программа + и выпавшем меню — панели инструментов.Снимаем все лишние галки! Вот так :
Настройка ИТС Квик для интрадей на ФОРТС , продолжение части1.

Получение данных 
Настройка ИТС Квик для интрадей на ФОРТС , продолжение части1.

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

Интрадей на ФОРТС через ИТС Квик. Подготовка рабочего места , интерфейс . ч.№ 1.

Хотел поделиться своими мыслями по настройкам, по функционалу . Для этого запилил видео, но получилось корявенько . Поэтому   начну выкладывать краткий текст со скринами. А далее отредактирую видео и возможно опубликую . 
Для торговли интрадей необходимо минимум два монитора, либо один очень большой  с разрешением выше стандартного 1920 х 1080 .
Для начала настроим  главное окно, и очень важную вкладку на нём. назовём её «фортс „

1. Загружаем ИТС, ключи, согласно инструкциям вашего брокера. 
2. Удаляем все вкладки кроме одной, и очищаем её от таблиц , 
Интрадей на ФОРТС  через ИТС Квик. Подготовка рабочего места , интерфейс . ч.№ 1.

продолжение следует 







  • обсудить на форуме:
  • QUIK

Опционы для Гениев (ехал грека через реку)

Мы смотрели на кучу распределения и думали, как из нее сетку ордеров построить.  Для этого нам надо построить функцию. Это такой график. Есть три способа его построить. Первый описан здесь http://mathprofi.ru/funkcia_raspredeleniya_dsv.html. Второй я описывал в своих топиках и выкладывал экселовские файлы. Мы будем использовать самый гениальный, третий способ. Так как мы уже договорились и поняли, что все распределение учтено улыбками, то мы можем взять любую опционную программу и построить график. Я воспользуюсь smart-lab.ru/blog/388853.php  от FateevVV (за что ему отдельное спасибо)

 Опционы для Гениев (ехал грека через реку)
Для этого надо записать на ЦС две позиции, проданный колл и проданный пут по 100 штук и выбрать на графике «Дельта». По горизонтальной оси у нас цена БА. А по вертикали как раз то, что мы искали. Так видно, при цене 110000 у нас сработает 20й sell limit. Что тут главное, что надо заметить. Если взять интервал 2500 пунктов от текущей 112500 то ставится 30 ордеров. А между 105000 и 102500 только 10 ордеров. От 107500 до 105000 будет 20 ордеров. Думаю, вас в школе учили про абсциссы и ординаты. Что тут еще интересно. Я не буду загаживать топик скриншотами, просто поверьте или скачайте программу, прикрутите к Квику и проверьте. При изменении волатильности, времени, улыбки, дельта тоже будет меняться. За десять дней до экспирации от 112500 до 110000 потребуется 60 ордеров в сетке. А между 105000 и 102500 только два.



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

Чайник чайнику о программировании в Квике на языке Opile

Что нужно, чтобы начать работу с алгоритмическим языком Qpile в Квике.  
 
1. Описание языка: можно найти по ссылке zarchive.zerich.com/dist/8_%D0%AF%D0%B7%D1%8B%D0%BA_QPILE.pdf
 
2. Первоначальная чайная (для чайников) пошаговая процедура создания простейшей таблицы
 
(Я сам чайник — описываю, чтобы и самому лучше понять)
 
Читать нужно тем, кто не смог создать свою первую программируемую таблицу в Квике. Это первоначальная процедура создания простейшей таблицы, которая опущена в справочнике  
и соответственно справочник по языку Qpile не всегда можно понять не программисту.  
Если кто-то из опытных людей прочитает, то хотелось бы услышать как можно упростить создание описанной таблицы, и что в описании
не правильно.  
 
Итак, начинаю чайную процедуру.
 
 
Нужно сформировать тело программы
 
PORTFOLIO_EX Вася; «Заголовок» – наименование таблицы и определение основных параметров
 
DESCRIPTION Вася;        «Описание программы»

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

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

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