Блог им. kurd |Удобство использования визуального интерфейса 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.


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

Блог им. kurd |Кто использует в 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.
Кто-нибудь может чего-то добавить?
  • обсудить на форуме:
  • Quik Lua

Блог им. kurd |Алготрейдинг. Как в Quik'е из скрипта Lua достать столбцы Таблицы торгов по английским названиям

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

Блог им. kurd |Алготрейдинг. Скрипт 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, H4, H2 - недопустимо

function Log (i)
  local t = DS:T(i)
  local ymd = string.format ("%04d%02d%02d", t.year, t.month, t.day)
  local hms = string.format ("%02d%02d%02d", t.hour, t.min, t.sec);
  if not (IniDt <= ymd and ymd <= FinDt) or
     not (IniTm <= hms and hms <= FinTm) then return end
  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.


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

Блог им. kurd |Скрипты Lua в Quik'е могут строить свою доску опционов - как от Мосбиржи

В скриптах напрямую доступны все данные Quik'а, кроме греков с доски опционов. Но есть возможность рассчитывать их по формуле Блэка-Шоулза, исходя из доступных значений базы, страйка, дюрации и волатильности.
Чтобы удостовериться в совпадении греков с доски и расчётных, пришлось в скрипте отваять на Lua C API сервер DDE для приёма экспорта от доски опционов. И вот картинка
Скрипты Lua в Quik'е могут строить свою доску опционов - как от Мосбиржи
Разница в самом главном Греке — Дельте — менее 1%.
Через Lua в Quik'е доступны все возможности Windows.
local Titles, Entries, Desk = {}, {}, {}
local Wn1_Hndl
local Wn1_Field1, Wn1_Field2, Wn1_Field3, Wn1_Field4, Wn1_Field5
   = "Код CALL", "Страйк", "Дельта CALL", "Дельта расч", "Теор. расч"
   
function OnInit (scriptPath)
  qu = require ("QuikUtil(qu)") -- qc, lu, tu
  blk = require ("BlackScholes(blk)")
  glb_ScriptDir, glb_ScriptName = lu.SplitPath (scriptPath)
  message (glb_ScriptName .." started")
  server = require ("OptionDesk")
end -- OnInit()

function OnStop (signal)
  if Wn1_Hndl then DestroyTable (Wn1_Hndl) end
  StopFlag = true
  return 1000 -- 1 sec
end

local function ShowWin (cols)
  for k = 1, #Desk do
    local calCode = Desk[k][Entries[Wn1_Field1]]
    if calCode:sub (3,3) == "0" then
      calCode = calCode:sub (1,2) .


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

Блог им. kurd |"Усердие всё превозмогает. Иногда даже рассудок" (Козьма Прутков). О выявлении крупных сделок

В источнике smart-lab.ru/blog/760357.php код QLua и картинка из Quik'а.
Возможно, смысл в том, чтобы отловить сделки крупных игроков. Но склеивание в одну «крупную сделку» всех обезличенных сделок одного направления, пришедших в одну миллисекунду или несколько подряд, вряд ли служит цели. Это заявки разных игроков. Ведь уловка китов, прибегающих к «Айсберг-заявкам», в том и состоит, чтобы расщепить свою крупную заявку во времени.
Так что если кто хочет схватить такого кита за руку, может попробовать выявлять последовательности тиков одного объёма и направления через равные интервалы времени.
Но!
1) Точно ли  все «Айсберг-заявки» формируются равными объёмами и через равные интервалы времени? Это было бы довольно глупо.
2) Даже если такая глупость существует, к любому тику с заявкой кита может прилепиться много заявок мелкоты. Это сильно затруднит выявление регулярных «Айсберг-заявок».
3) Самые киты входят-выходят на рынке не одной «Айсберг-заявкой» и даже не в один день! А то и ещё и через день — по обстановке. Шансов опознать именно их заявки среди прочих — ноль.
4) В самом ли деле так важно знать сделки крупных игроков? Крупняк никогда не проигрывает?

NB Почему эти вопросы не пришли в голову никому из заинтересованных комментаторов?
Включая торговый терминал, не забудьте включить голову.
  • обсудить на форуме:
  • Quik Lua

Блог им. kurd |Все ли знают, что в Quik'е у каждого скрипта main() свой отдельный Windows-поток (thread)?

Пишу потому, что к большому моему удивлению открыл, что весьма активные писатели Смарт-лаба этого не знают. В главном потоке программы Quik работают только функции обратного вызова типа OnTransReply, OnTrade и индикаторы. Кстати, OnTrade срабатывает не только по заявкам из скрипта, но и поданным интерактивно.

Дело обработчиков событий не обрабатывать, но регистрировать их.
Неверные представления о потоках в Quik'е вынуждают этих писателей городить абсурдный обмен данными между Quik'ом и внешними приложениями. Тогда как вся информация по событиям может быть обработана средствами QLua во вторичных скриптовых потоках без помех для главного потока Quik'а.

Хотя QLua обладает весьма эффективными средствами взаимодействия с любым приложением Windows, не так просто придумать повод для обращения QLua за посторонней помощью. Например, сохранять на диске текущие данные QLua может массой способов от простейшего io.read/write до SQLite.
Количество библиотек для QLua просто изумляет.

NB. Известная проблема скриптовых языков, что ошибки-описки в именах функций и переменных влекут трудно диагностируемые сбои работы, решается двумя простейшими средствами.

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

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