Постов с тегом "quik lua": 227

quik lua


Изучаем QLua: Относительный ATR

Доброго дня

Решил попробовать написать некоторые индикаторы для Quik.
Была прочитана книга по языку Роберту Иерузалимски «Программирование на языке Lua» и Документация по языку LUA в QUIK и примеры.
Надо заметить, что язык мне понравился. В нем так мало и так много одновременно!

Первый блин индикатор — что-то похожее на Волатильность Чайкина, только попроще.
Идея: хочется изучить циклы волатильности. За основу берем ATR. Но если рассматривать большие интервалы, то цена может гулять в больших пределах, соответственно приводим ее к текущей цене.
Сделал первый вариант, получил ошибки выполнения — надо добавить обработку ошибок.
Следующий вариант заработал, я посмотрел — очень большой разброс, надо добавить сглаживание. 
Добавил сглаживание, разброс стал поменьше, но все равно немного не то. Добавил отдельное сглаживание для диапазона и для цены (предполагая, что цена меняется медленнее чем периоды волатильности). Уже лучше.
А что если брать не цену закрытия, а например среднюю? Добавил, но оказалось что влияние мизерное.
В общем, уже можно поиграться. 
Исходник

Продолжаю эксперименты. 
  • обсудить на форуме:
  • Quik Lua

Как автоматизировать передачу однотипных заявок каждый день?

    • 09 января 2019, 12:21
    • |
    • Arti
  • Еще
Всем привет!
Скажите, как можно автоматизировать процесс массового создания заявок на покупку бумаг на Московской Бирже каждый день?
Специфика следующая: есть на мониторинге 10-20 корп. облигаций.
Для каждой бумаги есть цена и кол-во, которое я хочу купить (заявка), несколько ниже текущей рыночной цены. Заявки на покупку НЕ условные.
Цена и кол-во бумаг в моих заявках в теч. дня не меняются (для простоты).
На следующий день цена актуализируется (может поменяться) после ручного пересмотра. Но может и не поменяться. То есть опять нужно загрузить список из этих заявок.
Можно, конечно, каждое утро вручную заводить каждую из этих 10-20 заявок, но на это уходит минут 10 каждый день, плюс повышается вероятность ошибки/опечатки.
Список заявок могу вести в Excel.

Подскажите, можно ли либо сделать так, чтобы заявки на покупку на фондофом рынке МБ не отменялись после окончания сессии (либо автоматически пересоздавались), либо как-то упростить процедуру массового ввода заявок с помощью какого-нибудь механизма экспорта таблицы/списка заявок?

P.S. Работаю в Quik/WebQuik/ЛК Открытии.

Торговый робот на 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

Захват откатов скольжением.

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

          В программе Lbot3D появилась реализация вычисления скользящего экстремума в конкретной стратегии при наличии позиции. Слово «конкретной» звучит потому, что этот самый экстремум можно использовать в других стратегиях из портфеля стратегий. Согласен, это нужно не всем. Скорее так: мало кому он нужен. Тем не менее, продолжу.

          Допустим мы придумали стратегию на некотором активе, рассчитанную на тренд:
Покупаем на четверть портфеля. Если цена пошла против нас (пусть на 1%)- стопимся, но если в нашу сторону +1%, то в предположении, что мы тренде, выставим лимитированную заявку на покупку второй четверти на 0.5% ниже достигнутого экстремума: откат вероятен, и после того, как на откате вытряхнут часть пассажиров, (самых пугливых, самых недостойных :)), наш портфель зацепит еще несколько лотов и едем дальше, «на север». Но если первая четверть бумаг размещена в нашем портфеле на «долгосрок», то вторая четверть будет сразу же выставлена на продажу с профитом, например, в 1%.



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

Можно ли из LUA-индикатора получить идентификатор графика, в котором он работает?

Задача такая: получить(или посчитать) количество свечей в графике до отрисовки индикатора.
  • обсудить на форуме:
  • Quik Lua

индикатор на LUA

Добрый день всем!
Народ, кто может сделать индикатор на LUA для QUIK?

Aroon

Всем доброго дня! Друзья, есть у кого нибудь индикатор aroon на Lua. Или может как то его можно написать, где это можно сделать?
  • обсудить на форуме:
  • Quik Lua

Fn044.lua, версия 2.1

    • 29 октября 2018, 16:07
    • |
    • XXM
  • Еще

В своей торговле применяю комбинации рыночных и лимитированных заявок, (методику описывал ранее, "Настоящая торговая стратегия."  и "US500: Объемы больше, спреды уже!" ). Временами количество одновременно работающих стратегий зашкаливало за сотню и на некоторые из них не хватало денег под выставление заявок, они отключались, иногда ломая логику работы связанных с ней стратегий. В QUIK в таблице «Состояние счета» считается цифра — «Свободно» — свободные средства под заявки, но сходу вытащить ее из Lua у меня не получилось. И пришлось вписать расчет этой величины в робота.
Сегодня предлагаю вашему вниманию доработанный скрипт Fn044.lua (https://yadi.sk/d/O-6JzZdXkOxyow)
Fn044.lua, версия 2.1

в котором реализован расчет свободных средств для заявок на ФОРТС с учетом имеющихся контрактов и заявок.
Один в один вывести не получилось, как смог.
As is, и все такое!

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

QUIK: Бенчмарк ОФЗ к ставке ЦБ

    Может кому будет интересен скрипт на QLUA, который выступает простым бенчмарком ОФЗ с постоянным купоном к ставке ЦБ.
Основные параметры доходность и премия к ставке ЦБ, с учетом дюрации.
Скрипт не работает онлайн (оперативность тут не принципиальна), при запуске собирает параметры в таблицу и выводит на экран.
В дальнейшем планируется эти данные использовать для анализа премии доходности по дюрации для муниципальных и корпоративных облигаций к ОФЗ.

QUIK: Бенчмарк ОФЗ к ставке ЦБ


    Код скрипта на github (на github две версии одна в utf-8 для просмотра и основная версия в win1251, т.к. quik понимает только его):
github.com/trantor77/lua_scripts/boundsOFZ.lua

    Код скрипта:
--переменные
keyRateCB = 7.5
classCode = "TQOB"

function CreateTable()
    t_id = AllocTable()
    AddColumn(t_id, 0, "Бумага", true, QTABLE_STRING_TYPE, 15)
    AddColumn(t_id, 1, "Цена", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 2, "Доходность, %", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 3, "Дюрация, лет", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 4, "Купон, %", true, QTABLE_DOUBLE_TYPE, 15)
    AddColumn(t_id, 5, "Премия к ЦБ, бп", true, QTABLE_INT_TYPE, 15)
    AddColumn(t_id, 6, "Погашение", true, QTABLE_STRING_TYPE, 15)
    t = CreateWindow(t_id)
    SetWindowCaption(t_id, "ОФЗ")
end

function string.split(str, sep)
    local fields = {}
    str:gsub(string.format("([^%s]+)", sep), function(f_c) fields[#fields + 1] = f_c end)
    return fields
end

function getParamNumber(code, param)
    return tonumber(getParamEx(classCode, code, param).param_value)
end

function formatData(prm)
    return string.format("%02d.%02d.%04d", prm%100, (prm%10000)/100, prm/10000)
end

CreateTable()

arr = {}
sec_list = getClassSecurities(classCode)
sec_listTable = string.split(sec_list, ',')
j = 0
for i = 1, #sec_listTable do
    secCode = sec_listTable[i]
    securityInfo = getSecurityInfo(classCode, secCode)
    short_name = securityInfo.short_name
    if short_name:find("ОФЗ 26") ~= nil then
        j = j + 1
        r = {}
        r["short_name"] = short_name
        r["price"] = getParamNumber(securityInfo.code, "PREVPRICE")
        r["yield"] = getParamNumber(securityInfo.code, "YIELD")
        r["duration"] = getParamNumber(securityInfo.code, "DURATION")/365
        couponvalue = getParamNumber(securityInfo.code, "COUPONVALUE")
        couponperiod = getParamNumber(securityInfo.code, "COUPONPERIOD")
        r["coupon"] = ((365/couponperiod) * couponvalue)/10
        r["bonus"] = (r["yield"] - keyRateCB)*100
        r["mat_date"] = getParamNumber(securityInfo.code, "MAT_DATE")
        table.insert(arr, j, r)
    end
end

table.sort(arr, function(a,b) return a["duration"] < b["duration"] end)

for j = 1, #arr do
    row = InsertRow(t_id, -1)
    SetCell(t_id, row, 0, arr[j]["short_name"])
    price = arr[j]["price"]
    SetCell(t_id, row, 1, string.format("%.2f", price), price)
    yield = arr[j]["yield"]
    SetCell(t_id, row, 2, string.format("%.2f", yield), yield)
    duration = arr[j]["duration"]
    SetCell(t_id, row, 3, string.format("%.2f", duration), duration)
    coupon = arr[j]["coupon"]
    SetCell(t_id, row, 4, string.format("%.2f", coupon), coupon)
    bonus = arr[j]["bonus"]
    SetCell(t_id, row, 5, string.format("%.0f", bonus), bonus)
    mat_date = arr[j]["mat_date"]
    SetCell(t_id, row, 6, formatData(mat_date), mat_date)
end
  • обсудить на форуме:
  • Quik Lua

Напишу робота

    • 09 октября 2018, 17:34
    • |
    • Itself
  • Еще
Коллеги, добрый день!

Готов написать робота под вашу стратегию.

Требования:
1. Небольшое количество параметров (если вы оцениваете момент входа по 100500 критериям, это не особо интересно)
2. Четкая формализация
3. Подтвержденная доходность

Ограничения:
1. Qlua

Предпочтения:
1. Спот
2. Фьючи
  • обсудить на форуме:
  • Quik Lua

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