Quik Lua

Сайт продукта: https://forum.quik.ru/forum10/
Lua — язык программирования, который используется в программировании торговых роботов под популярный в России терминал Quik.
  1. Аватар Rostislav Kudryashov
    Удобство использования визуального интерфейса IUP в Quik Lua
    Не так давно я сетовал на неудобства IUP smart-lab.ru/blog/1212710.php
    Это «не точно». На самом деле есть возможность вывешивать из скрипта main() в Quik Lua немодальные окна IUP.
    require("iuplua")
    local interrupted
    
    function OnStop()
      interrupted = true
    end
    --[[
    function sleep(n) -- standalone
      if n > 0 then
        os.execute("ping -n "..
          tonumber(n) .." localhost > nul")
      end
    end
    --]]
    function main()
      local btn1 = iup.button { title = "Show Dialog", }
      function btn1:action()
        local r = iup.Alarm("", "Main Title doesn't update!", "Exit")
        if r == 1 then
          interrupted = true
        end
      end -- btn1:action()
    
      local btn2 = iup.button { title = "Show menu", }
      function btn2:action()
        local item = iup.item { title = "Exit", }
        function item:action()
          interrupted = true
        end
    
        local menu = iup.menu {
          iup.item { title = "Dialog title doesn't update!",
          active = "NO", }, item
        }:popup(iup.MOUSEPOS, iup.


    Авто-репост. Читать в блоге >>>
  2. Аватар Rostislav Kudryashov
    Кто использует в Lua библиотеку визуального интерфейса IUP внутри корутин (coroutines)?
    В руководстве IUP есть два места упоминания слова coroutine
    To use IUP inside coroutines, define the global attribute «IUPLUA_THREADED».

    Неудобство использования IUP в том, что он используется в модальном режиме. Т.е. вывесив окно IUP, в Lua надо ждать, пока пользователь закроет это окно. До этого момента получить что-либо в Lua из IUP невозможно.
    Использование корутин предполагает, что вызывающая корутину программа может вернуть временно себе управление, не дожидаясь завершения вызванной корутины. Т.е. до закрытия окна IUP, так что скрипт main() в Quik Lua может выполняться с учётом параллельных манипуляций пользователя в окне IUP.

    Однако не удаётся найти примеры такого использования корутин с IUP.
    Кто-нибудь может чего-то добавить?

    Авто-репост. Читать в блоге >>>
  3. Аватар Rostislav Kudryashov
    Алготрейдинг. Как в Quik'е из скрипта Lua достать столбцы Таблицы торгов по английским названиям
    Вдруг потребовался «Класс базового актива» для опциона. И ни в одном руководстве его нет — только «Код базового актива».
    И вспомнил! Надо вывести через DDE Таблицу торгов в Excel с птичкой «Формальные заголовки» в диалоге «Вывод через DDE-сервер».

    Авто-репост. Читать в блоге >>>
  4. Аватар AlexGood
    Друзья и коллеги, всем привет! Есть индикатор на LUA, в блокноте изменил цвет линий RGB, на двух ценовых графиках в КВИК теперь выдает новый цвет, на двух остался предыдущий, как цвет мог остаться?

    Авто-репост. Читать в блоге >>>
  5. Аватар Михаил Михалёв
    Я самый ленивый трейдер.
    Мне лень сделать несколько кликов, чтобы найти инструмент, открыть окно создания заявки, ввести данные… ох, я даже уже устал писать про этот процесс. А ещё же надо стопы расставить. А перед эти вообще понять, стоит ли соваться в этот рынок или посидеть на заборе.

    Короче говоря, решил это дело оптимизировать, потому что типовая рутина меня печалит. Делал как надстройку над Quik. Сначала поэкспериментировал на lua. Ничего кроме культурного шока от этой затеи не получил.

    Решил делать на python. Написал на C++ мост lua-python, который позволяет прокидывать именованные и анонимные колбэки туда-сюда. Потом ещё приделал hot-reload, чтобы после изменений в python коде ничего не перезапускать. Кровушки, конечно, они мне попили, эта троица: qlua, плюсы и питон.

    В общем, что-то рабочее уже получилось:
    Я самый ленивый трейдер.

    Фичи:
    • Деньги на споте и срочке показываются прогресс барами, учитывая ликвидную стоимость и ГО позиций
    • Деньги на споте можно парковать и распарковывать в фонды ликвидности в один клик. Запаркованные деньги показываются на прогресс баре синим цветом.


    Авто-репост. Читать в блоге >>>
  6. Аватар evg_gen +100(100)
    как отличить норм облиг от структурки?QUIK lua
    пишу скрипт для квика по выбору/обработке облигаций
    и нашел у ВТБ хренову тучу структурок которые торгуются ..
    хотел было руками отфильтровать — но там много получается..
    может кто знает — есть какой-то признак в свойствах облигации что она структурная, чтобы в скрипт вписать фильтрацию…

    Авто-репост. Читать в блоге >>>
  7. Аватар Ivan Afonkin
    Ivan Afonkin,
    и если передалать так:
    ma_1 = func(i, {Period=96, Metod = EMA, VType=CLOSE}, ds)
    ma_2 = func(i, {Period=48, Metod = EMA, VTyp...

    Ivan Afonkin,
    ОТВЕЧАЮ САМ СЕБЕ. Может кому то и пригодиться.
    Победил вот как :
    вместо
    func = MA()
    сделал так
    func = MA()
    func2 = MA()

    а ниже

    ma_1 = func(i, {Period=48, Metod = EMA, VType=CLOSE}, ds)
    ma_2 = func2(i, {Period=96, Metod = EMA, VType=CLOSE}, ds)

    и всё заработало. Спасибо Форум.
  8. Аватар Ivan Afonkin
    Мужики, ХЭЛП.
    Честно, мозг закипел. Решил тут воспользоваться уже прописанными Индикаторами от производителя из LuaIndicators. Но при их тес...

    Ivan Afonkin,
    и если передалать так:
    ma_1 = func(i, {Period=96, Metod = EMA, VType=CLOSE}, ds)
    ma_2 = func(i, {Period=48, Metod = EMA, VType=CLOSE}, ds)
    т.е. расчет двух МА с разным периодом
    снова всё ломается.
    в чём причина?
  9. Аватар Ivan Afonkin
    Мужики, ХЭЛП.
    Честно, мозг закипел. Решил тут воспользоваться уже прописанными Индикаторами от производителя из LuaIndicators. Но при их тестировании, выяснилось, что PSAR точно дает данные как на графике, а вот МА() — врет безбожно, причем так что ума не дам.
    Вот короткий пример:

    dofile(getWorkingFolder().."\\LuaIndicators\\LuaIndicators\\MA.lua")
    dofile(getWorkingFolder().."\\LuaIndicators\\LuaIndicators\\PSAR.lua")

    is_run = true

    function main()

    while is_run do

    func = MA()

    funcSAR = PSAR()

    t_id = AllocTable()
    AddColumn(t_id,1,«Price»,true,QTABLE_INT_TYPE,10)
    AddColumn(t_id,2,«MA»,true,QTABLE_INT_TYPE,10)
    AddColumn(t_id,3,«MA2»,true,QTABLE_INT_TYPE,10)
    AddColumn(t_id,4,«SAR»,true,QTABLE_INT_TYPE,10)

    CreateWindow(t_id)
    SetWindowCaption(t_id,«MA»)
    ds = CreateDataSource(«SPBFUT», «IMOEXF», INTERVAL_H1)
    sleep(500)
    for i=1,ds:Size() do
    ma_1 = func(i, {Period=96, Metod = EMA, VType=CLOSE}, ds)
    ma_1_1 = func(i-1, {Period=96, Metod = EMA, VType=CLOSE}, ds)

    TIME = ds:T(i).hour

    SAR = funcSAR(i, {Step = 0.002, MaxStep = 0.2}, ds)

    tmp=InsertRow(t_id,-1)
    SetCell(t_id,tmp,1,tostring(ds:C(i)),ds:C(i))
    SetCell(t_id,tmp,2,tostring(ma_1),ma_1)
    SetCell(t_id,tmp,3,tostring(ma_1_1),ma_1_1)
    SetCell(t_id,tmp,4,tostring(SAR),SAR)

    end

    sleep(10000)
    end
    end

    function OnStop()
    is_run = false
    --DestroyTable(t_id)
    return 1000
    end
    =======================================================================
    Результат вычисления МА() за i и i-1 вообще с потолка, т.е. ma_1_1 совсем не равно предыдущему значению m_1. Да и просто m_1 — не равно значению с графика. А вот если убрать расчет ma_1_1, то m_1 — правильно расчитывается — совпадает с данными графика !!!
    В чем подвох? и как победить ?
  10. Аватар econopulse
    Скрипт для мониторинга крупных сделок: автоматизация процессов с QLua
    В мире трейдинга важно уметь быстро и точно анализировать информацию о сделках, особенно когда речь идет о крупной работе на рынке.
    Мы рады представить вашему вниманию скрипт, который поможет вам эффективно отслеживать и обрабатывать данные о крупных сделках с использованием QLua. 

    Как это работает?

    В таблице обезличенных сделок отображаются сделки, которые были в наличии в стакане заявок. Например, если в стакане по цене 120 было 15 лотов, а по цене 121 — 10 лотов, а вам необходимо купить 25 лотов, то в списке обезличенных сделок будут показаны две сделки — по 120 и по 121. 

    Ключевые возможности скрипта:

    — Определяет рыночные сделки, совершенные одним игроком, и группирует их в одну сделку. Это позволяет увидеть реальный объём активности одного трейдера на рынке.

    Скрипт для мониторинга крупных сделок: автоматизация процессов с QLua

    — Фильтрует мелкие сделки и отображает только крупные транзакции, задавая шаг фильтрации в 1 млн. рублей.

    — Отслеживает только те инструменты, которые находятся в вашем портфеле, что позволяет сосредоточиться исключительно на значимых для вас сделках.

    Авто-репост. Читать в блоге >>>
  11. Аватар Михаил Понамаренко
    Дубликатор сделок QUIK-QUIK LUA

       В середине 2015-го года я сделал простую, но достаточно функциональную утилиту для копирования сделок на языке программирования QPILE, потому, как новый язык программирования QLUA тогда имел много багов и недоработок. Программа оказалась популярна среди частных управляющих, как альтернатива сервисам автоследования COMON, EasyMANi и пр.

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

        Почти четыре месяца назад, 18 декабря, начал разработку новой программы для копирования сделок для QUIK. Предыдущую программу на QPILE я написал менее, чем за месяц. Сначала рассчитывал сделать за пару месяцев, но проект оказался сложнее раза в два, чем предполагал. Ушло более 100 часов работы над программным кодом. Потом, часов 10 на описание. Пишу программы не каждый день и в своё удовольствие.



    Авто-репост. Читать в блоге >>>
  12. Аватар autotrade
    Рассказ о том как написать свой индикатор в Quik
    1. Сначала придумываем идею.
    Ну, например, у нас будет какая-то загадочная кривая пересекаться с ценой и таким образом будет давать сигнал на покупку или продажу.
    Делаем для нее функцию: my_function

    Пример скрипта:
    --[[
    Название индикатора на русском для справки
    --]]
    Settings={
    Name="my_ind",
    prf=0, -- =1 - показать профит		
    sign=0,	-- =1 - показать сигнал	
    SLP = 1.0, -- стоплосс 
    tar = 0.03, -- тариф %
    Param=10, -- Параметр индикатора
        line=                                     
                    {  
    					{  
                            Name = "cur1",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(0,0, 0)
                        },
    					{  
                            Name = "cur2",
                            Type =TYPE_LINE,
                            Width = 2,
                            Color = RGB(255,0, 0)
                        },					
    					{  
                            Name = "TRIANGLE_DOWN",
                          


    Авто-репост. Читать в блоге >>>
  13. Аватар А.К.
    Рабочий код LUA для QUIK по расчету теор цены опциона на Мосбирже
    Код взял с сайта bot4sale.ru/

    Спасибо автору за публикацию. Дублирую здесь с некоторыми комментами.
    Публикую как есть, за ошибки отвественности нет, не является рекомендацией!

    LUA код считает цену опциона по формуле БлэкаШоулза.

    function cnd(x)
    
    -- taylor series coefficients
       local a1, a2, a3, a4, a5 = 0.31938153, -0.356563782, 1.781477937,-1.821255978, 1.330274429
       local l = math.abs(x)
       local k = 1.0 / (1.0 + 0.2316419 * l)
       local w = 1.0 - 1.0 / math.sqrt(2 * math.pi) * math.exp(-l * l / 2) * (a1 * k + a2 * k * k + a3 * (k^3) + a4 * (k^4) + a5 * (k^5))
       if x < 0 then w = 1.0 - w end
       return w
    end
    
    -- The Black-Scholes option valuation function
    -- is_call: true for call, false for put
    -- s: current price
    -- x: strike price
    -- t: time
    -- r: interest rate
    -- v: volatility
    function black_scholes(is_call, s, x, t, r, v)
       local d1 = (math.log(s / x) + (r + v * v / 2.0) * t) / (v * math.sqrt(t))
       local d2 = d1 - v * math.sqrt(t)
       if is_call then
          return s * cnd(d1) - x * math.exp(-r * t) * cnd(d2)
       else
          return x * math.exp(-r * t) * cnd(-d2) - s * cnd(-d1)
       end
    end
    
    Проверено вчера на путах сишки. Расчет совпал с табличными значениями «теор цена» на июньских, сентярьских, декабрьских досках опционов.

    Авто-репост. Читать в блоге >>>
  14. Аватар Amexx
    Добрый день. Помогите исправить код. Ошибок нет, но в списке индикаторов отсутствует,
    — Название индикатора local IndicatorName = «L1m»


    — Параметры индикатора
    local Price = 0
    — Тип цены (0 — Close)
    local Length = 0
    — Период
    local barscount = 50
    — Количество баров для расчета


    --Коэффициенты для разных таймфреймов
    local k1, k2, k3, k4 = 0, 0, 0, 0


    — Буферы для хранения данных
    local Buf0 = {}
    — Основной буфер 1
    local Buf4 = {}
    — Основной буфер 2
    local Buf1 = {}
    — Буфер для невязки 1
    local Buf2 = {}
    — Буфер для abs невязки 1
    local Buf3 = {}
    — Буфер для цены 1
    local Buf5 = {}
    — Буфер для невязки 2
    local Buf6 = {}
    — Буфер для abs невязки 2
    local Buf7 = {}
    — Буфер для цены 2


    — Функция для получения текущего таймфрейма
    function getInterval()

    — Получаем текущий таймфрейм графика

    local interval = getParamEx(«TQBR», «SBER», «INTERVAL»).param_value
    return interval

    end


    — Функция инициализации индикатора
    function OnInit()

    — Установка параметров в зависимости от таймфрейма

    local interval = getInterval()
    if interval == «M1» then
    Length = 11; k1 = 0.1; k2 = 0.9; k3 = 0.05; k4 = 0.5

    elseif interval == «M5» then
    Length = 7; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    elseif interval == «M15» then
    Length = 5; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.7

    elseif interval == «M30» then
    Length = 7; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    elseif interval == «H1» then
    Length = 7; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    elseif interval == «H4» then
    Length = 7; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    elseif interval == «D1» then
    Length = 6; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    elseif interval == «W1» then
    Length = 4; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    elseif interval == «MN1» then
    Length = 3; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.9
    else

    — Если таймфрейм не распознан, используем значения по умолчанию

    Length = 7; k1 = 0.2; k2 = 0.9; k3 = 0.05; k4 = 0.8

    end


    — Инициализация буферов
    for i = 1, barscount do

    Buf0[i] = 0
    Buf4[i] = 0

    Buf1[i] = 0
    Buf2[i] = 0

    Buf3[i] = 0
    Buf5[i] = 0

    Buf6[i] = 0
    Buf7[i] = 0

    end


    — Логирование для отладки
    message(«Индикатор инициализирован. Таймфрейм: »… interval)


    return true
    end


    — Функция расчета индикатора
    function OnCalculate(index)

    if index <= 3 then return end


    — Получение цены закрытия

    local close_price = getPrice(index)


    — Расчет скользящей средней

    local ma = calculateMA(index)


    — Расчет невязки

    local def = ma — (Buf0[index + 1] or 0)

    local prog = (Buf1[index + 1] or 0) + 0.5 * ((Buf1[index + 1] or 0) — (Buf1[index + 2] or 0))

    Buf1[index] = prog + (def — prog) / Length

    local def1 = ma — (Buf4[index + 1] or 0)

    local prog1 = (Buf5[index + 1] or 0) + 0.5 * ((Buf5[index + 1] or 0) — (Buf5[index + 2] or 0))

    Buf5[index] = prog1 + (def1 — prog1) / Length


    — Расчет абсолютной невязки

    local adef = math.abs(def)

    local adef1 = math.abs(def1)

    Buf2[index] = (Buf2[index + 1] or 0) + 0.5 * ((Buf2[index + 1] or 0) — (Buf2[index + 2] or 0))

    Buf6[index] = (Buf6[index + 1] or 0) + 0.5 * ((Buf6[index + 1] or 0) — (Buf6[index + 2] or 0))


    — Адаптивные параметры

    local k5, k6, k7, k8 = 0, 0, 0, 0
    if Buf2[index] ~= 0 then

    k6 = math.abs((Buf1[index] or 0) / Buf2[index])

    k5 = k1 * k6

    k6 = k2 * k6
    end

    if Buf6[index] ~= 0 then

    k8 = math.abs((Buf5[index] or 0) / Buf6[index])

    k7 = k3 * k8
    k8 = k4 * k8
    end


    — Расчет значений индикатора

    local del = ma — (Buf3[index + 1] or 0)

    Buf0[index] = (Buf3[index + 1] or 0) + del * k5

    Buf3[index] = Buf0[index] + k6 * (Buf0[index] — (Buf0[index + 1] or 0))


    local del1 = ma — (Buf7[index + 1] or 0)
    Buf4[index] = (Buf7[index + 1] or 0) + del1 * k7

    Buf7[index] = Buf4[index] + k8 * (Buf4[index] — (Buf4[index + 1] or 0))


    — Отображение индикатора

    AddLine(Buf0[index], «Buf0», RGB(255, 255, 255), 1, 1)
    — Белая линия

    AddLine(Buf4[index], «Buf4», RGB(0, 191, 255), 1, 1)
    — Голубая линия

    end


    — Функция расчета скользящей средней

    function calculateMA(index)

    local sum = 0
    for i = index — Length + 1, index do
    sum = sum + getPrice(i)
    end
    return sum / Length
    end


    — Функция получения цены

    function getPrice(index)
    if Price == 0 then
    return getClose(index)
    — Цена закрытия
    else
    return (getHigh(index) + getLow(index)) / 2 — Средняя цена
    end
    end
  15. Аватар econopulse
    Упрощаем инвестирование: Lua-индикатор для определения уровней на графиках QUIK!

    Сегодня представляю вам свой Lua-индикатор для торговой платформы QUIK, который поможет вам визуализировать ключевые уровни сопротивления и поддержки на графиках.

    Упрощаем инвестирование: Lua-индикатор для определения уровней на графиках QUIK!

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

    Вы также можете адаптировать скрипт под свои требования — он открыт для редактирования!

    Проверьте сами! Откройте любой график на любом таймфрейме, закройте глаза и нарисуйте «горизонтальную линию». Удивитесь, насколько точно вы определили уровень, когда откроете историю графика!

    Лично я не трейдер в классическом смысле, а больше инвестор. Использую уровни только на недельном таймфрейме для ребалансировки своего портфеля.

    Цветовая кодировка уровней:

    — Зелёная линия — уровень поддержки.
    — Красная линия — уровень сопротивления.
    — Серая линия — предыдущий уровень, от которого идёт тренд.



    Авто-репост. Читать в блоге >>>
  16. Аватар Rostislav Kudryashov
    Алготрейдинг. Скрипт Lua для выгрузки истории котировок из Quik'а
    Сайт finam.ru и mfd.ru перестали быть полезными для выгрузки истории котировок.
    Это скрипт
    -- График должен быть открыт в Quik'е хоть раз за сессию
    Class = "SPBFUT" -- "CETS_MTL" "CETS"
    SecId="BRK4" -- "NGJ4" "GLDRUB_TOM" "USD000UTSTOM" "SiZ3"
    Intrvl = INTERVAL_H1 -- D1 -- M5
    Header = "<TICKER>;<PER>;<DATE>;<TIME>;"..
      "<OPEN>;<HIGH>;<LOW>;<CLOSE>;<VOL>"
    Period = "60" -- Дневки - 0; W1, MN1 - недопустимо
    
    function Log (i)
      local t = DS:T(i)
      local ymd = string.format ("%04d%02d%02d", t.year, t.month, t.day)
      if not (IniDt <= ymd and ymd <= FinDt) then return end
      local hms = string.format ("%02d%02d%02d", t.hour, t.min, t.sec);
      local str = string.format ("%s;%s;%s;%s;%.4f;%.4f;%.4f;%.4f;%.0f\n"
        ,SecId, Period, ymd, hms
        ,DS:O(i), DS:H(i), DS:L(i), DS:C(i), DS:V(i))
      F:write (str)
    end -- Log()
    
    function OnInit (scriptPath)
      qu = require ("QuikUtil(qu)") -- lu,qc,tu
      ScriptDir, ScriptName = lu.


    Авто-репост. Читать в блоге >>>
  17. Аватар 2153sved
    Вопрос по квику
    Подскажите, кто пользуется скриптами в lua
    При чистке dat и log а также при перезагрузке компьютера в таблице «Доступные скрипты» всё пропадает.
    При сохранение руками в info wnd также данные этой таблицы не сохраняются.

    Есть ли какие-то варианты сохранить данные скриптов в этой таблице?

    Авто-репост. Читать в блоге >>>
  18. Аватар Rostislav Kudryashov
    Можно бесконечно долго смотреть на .. две вещи
    … как растёт рублёвое золото GLDRUB_TOM и серебро SLVRUB_TOM.
    Оказалось, что если с начала 2019 среднегодовой рост 20% и 23% соответственно, то с начала 2024 это уже 34% и 57% годовых. Серебро обгоняет золото.
    Я даже для удобства написал для Quik'а скрипт на Lua
    function OnInit (scriptPath)
      lu = require ("LuaUtil(lu)")
      ScriptDir, ScriptName = lu.SplitPath (scriptPath)
      DataPath = ScriptDir .. ScriptName ..".dat"
      message (DataPath)
    end -- OnInit()
    
    function dtToStr (dt)
      return type (dt) ~= "table" and "nil" or
        string.format ("%4d.%02d.%02d", dt.year, dt.month, dt.day)
    end
    
    function main()
      os.execute ("notepad.exe ".. DataPath)
      dofile (DataPath)
      DS, err = CreateDataSource (ClassCode, SecCode, INTERVAL_D1)
      if not DS then
        message ("err\n".. err)
        return
      end
      local ini, fin = 1, DS:Size()
      for i = 1, fin do
        local dt = dtToStr (DS:T(i))
        if dt >= IniDate then
          ini = i
          break
        end
      end
      local finPrice = DS:C(fin)
      local finDate  = DS:T(fin)
      local iniPrice = DS:C(ini)
      local iniDate  = DS:T(ini)
      local iniTime = os.


    Авто-репост. Читать в блоге >>>
  19. Аватар cryptonex
    Программисты Lua!
    Во- первых с праздником!
    Во-вторых, очень нужна помощь.

    Отправка из квика в телеграм канал оповещения.
    На Lua.
    На php знаю как а на луа опыта нет

    Авто-репост. Читать в блоге >>>
  20. Аватар Rostislav Kudryashov
    Эврика! Зачем кодировать сложно, когда можно просто
    До сих пор для ввода данных в скриптах Quik Lua я использовал библиотеку IUP. Довольно громоздкая процедура только для того, чтобы получить фиксированные значения переменных. Но если эти значения никак не опираются на внутренние таблицы Quik'а, для их ввода проще использовать вызов текстового редактора. Например вот так

    local dp = glb_ScriptDir… glb_ScriptName ..".dat"
    os.execute («start /w /b notepad »… dp)
    dofile (dp) — Data

    ...
    Эврика! Зачем кодировать сложно, когда можно просто
    Сначала редактируем значения переменных скрипта, затем загружаем их в память.

    Авто-репост. Читать в блоге >>>
  21. Аватар econopulse
    Инвестору: Структурируйте свой портфель с помощью нового Lua-скрипта для QUIK
    Инвестору: Структурируйте свой портфель с помощью нового Lua-скрипта для QUIK

    Как опытный инвестор, вы знаете, что эффективное управление портфелем — ключ к успеху на финансовых рынках. Представляю вашему вниманию новый Lua-скрипт для пользователей торговой платформы QUIK, который поможет вам структурировать свой инвестиционный портфель и отслеживать все необходимые данные в удобном интерфейсе.



    Авто-репост. Читать в блоге >>>
  22. Аватар Gambler <osaengine.ru>
    Создание Торговых Стратегий с Помощью ИИ: Легче, Чем Печь Блины
    Алгоритм субботняшний

    1) Зайти на chatgpt.com/

    2) Написать вопрос

    Создание Торговых Стратегий с Помощью ИИ: Легче, Чем Печь Блины

    3) Получить ответ

    -- Настройки
    SEC_CODE = "SBER" -- Код инструмента
    CLASS_CODE = "TQBR" -- Код класса инструмента
    SHORT_MA_PERIOD = 10 -- Период короткой скользящей средней
    LONG_MA_PERIOD = 50 -- Период длинной скользящей средней
    QTY = 1 -- Количество лотов
    
    -- Переменные
    short_ma = {}
    long_ma = {}
    prices = {}
    position = 0 -- Текущая позиция: 0 - нет позиции, 1 - лонг, -1 - шорт
    
    -- Функция для расчета скользящей средней
    function calculate_ma(prices, period)
        local sum = 0
        for i = #prices-period+1, #prices do
            sum = sum + prices[i]
        end
        return sum / period
    end
    
    -- Функция для обработки новых тиков
    function OnAllTrade(alltrade)
        if alltrade.sec_code == SEC_CODE and alltrade.class_code == CLASS_CODE then
            table.insert(prices, alltrade.price)
            if #prices >= LONG_MA_PERIOD then
                table.insert(short_ma, calculate_ma(prices, SHORT_MA_PERIOD))
                table.


    Авто-репост. Читать в блоге >>>
  23. Аватар econopulse
    Автоматизированная тепловая карта рынка: скрипт Lua для QUIK
    Данный скрипт, разработанный на языке программирования Lua для терминала QUIK, представляет собой тепловую карту рынка российских акций. Основные функциональные возможности программы:
     
    1. Сортировка данных:

    — По временному интервалу

    — По алфавиту
    — По процентному изменению от предыдущего закрытия свечи на выбранном интервале
    Автоматизированная тепловая карта рынка: скрипт Lua для QUIK


        — По капитализации компании



    Авто-репост. Читать в блоге >>>
  24. Аватар evg_gen +100(100)
    QUIK lua помощь нужна
    можно ли в lua прописать сортировку в таблице?
    скажем мне нужны ТОЛЬКО заявки по покупкам, и если несколько покупок по одной бумаге, то отсортировать и их?

    Авто-репост. Читать в блоге >>>
  25. Аватар Алексей Греднев
    Добрый вечер. Кто-нибудь может мне дать ссылку на пример qlua скрипта для Квик с работой советника с индикатором Fractals. github.com/OlegBirykov/ParabolicSAR/blob/master/library.lua — здесь я нашёл интересный пример на Parabloic SAR и RSI
Чтобы купить акции, выберите надежного брокера: