Постов с тегом "lua": 325

lua


Скрипт для QUIK, показывающий, какое количество сделок у вас исполняется по рынку об встречные заявки, а также как изменится комиссия на срочной секции в случае принятия изменений тарифов.

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

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

Также скрипт покажет текущую биржевую комиссию и будущую в случае принятия указанных изменений. Если вы торгуете интрадей (скальперские сделки), то текущую комиссию надо разделить на два.

Напишите в комментариях, сильно ли изменится ваша комиссия?

function main()
  local Trades = {}
  local comission = 0
  SearchItems('trades', 0, getNumberOf('trades')-1,
    function (class_code, trade_num, flags, exchange_comission)
      if class_code == 'SPBFUT' or class_code == 'SPBOPT' then  -- Учитываем только сделки на срочной секции
        comission = comission + exchange_comission
        local t = {flags & 0x4, exchange_comission}
        if Trades[class_code] then
          Trades[class_code][trade_num] = t
        else
          Trades[class_code] = {[trade_num] = t}
        end
      end
      return false
    end,
  'class_code,trade_num,flags,exchange_comission')

  local total = 0
  local maker = 0
  local taker = 0
  local comission2 = 0
  SearchItems('all_trades', 0, getNumberOf('all_trades')-1,
    function (class_code, trade_num, flags, sec_code)
      if Trades[class_code] then
        local t = Trades[class_code][trade_num]
        if t then
          total = total + 1
          if flags & 0x1 ~= 0 then
            if t[1] == 0 then
              maker = maker + 1
            else
              taker = taker + 1
              comission2 = comission2 + t[2]
            end
          elseif flags & 0x2 ~= 0 then
            if t[1] == 0 then
              taker = taker + 1
              comission2 = comission2 + t[2]
            else
              maker = maker + 1
            end
          else
            comission2 = comission2 + t[2]
          end
        end
      end
      return false
    end,
  'class_code,trade_num,flags,sec_code')
  message(string.format('total:   %u\nmaker: %u\ntaker:  %u\n\ncomission\nсейчас:       %.2f\nскальпинг: %.2f\nстанет:       %.2f', total, maker, taker, comission, comission / 2, comission2 * 3))
end
  • обсудить на форуме:
  • QUIK

Алготрейдинг. Приостановка скрипта на определённый временной интервал

function main
	-- пример работы функции. Приостановка на клиринг
	local ServerTime = getInfoParam("SERVERTIME")
	local tTime = {"14:00:00","14:05:00"} -- время начала/окончания неторгового периода
	local result = diffTime(tTime[1], tTime[2])

	if ServerTime>=tTime[1] and ServerTime<=tTime[2] then
		message("Приостановка работы скрипта на ".. tostring(result).." сек.")
		sleep(result*1000) -- время приостановки в секундах. Время в Quik в миллисек., поэтому * 1000
	end
end

function diffTime(time1, time2)
-- возвращает разницу в секундах между time2-time1; либо 0, если time1 > time2
-- time1 = "14:00:00"
-- time2 = "14:05:00"
-- result = diffTime(time1, time2) -- = 300 секунд

local dt1 = {}
local dt2 = {}
local dTime1 = 0
local dTime2 = 0
local result = 0

	dt1.hour,dt1.min,dt1.sec = string.match(time1,"(%d*):(%d*):(%d*)")
	for key,value in pairs(dt1) do
		dt1[key] = tonumber(value)
	end

	dt2.hour,dt2.min,dt2.sec = string.match(time2,"(%d*):(%d*):(%d*)")
	for key,value in pairs(dt2) do
		dt2[key] = tonumber(value)
	end

	--часы*3600 + минуты*60 + секунды.
	dTime1 = dt1.hour*3600 + dt1.min*60 + dt1.sec
	dTime2 = dt2.hour*3600 + dt2.min*60 + dt2.sec
	result = dTime2 - dTime1

	if result <= 0 then
		return 0
	else
		return result
	end
end

Бен, это Данила. Бен, ай нид хелп! Колбеки пропали...

    • 08 февраля 2022, 12:23
    • |
    • Vkt
  • Еще
У меня отдельный скрипт ведет полный реестр колбеков за день.
OnOrder и OnTrade приходят,  OnTransReply нет.
Раньше были. В чем может быть проблема? Первый раз такое. Может сталкивался кто?
  • обсудить на форуме:
  • Quik Lua

Алготрейдинг. Получение имени запускаемого скрипта

— Функция возвращает имя запускаемого скрипта
— может пригодиться для логирования результата (лог_<имя_запускаемого_скрипта>)

scName=""

function OnInit(script_path)
    scName=tostring(get_file_name(script_path)) -- получение полного пути к исполняемому скрипту
end

function main()
    message("имя файла = "..scName)
end

function get_file_name (file)
    local file_name = file:match("[^\\]*.lua$") -- поиск в строке полного пути к файлу названия скрипта.lua
    return file_name:sub(0, #file_name - 4) -- обрезка '.lua' в конце строки
end

В Quik 9 автоматический сбор мусора в lua не работает?

Скрипт, нормально работающий в Quik 8.7, жрет и не освобождает память в Quik 9.2. Пришлось накостылить периодический вызов collectgarbage() в потоке обработчиков (вызов в потоке main() не помогает). Это норма в 9-м квике?

lua quik

Добрый день. Вопрос для программистов на lua. Я начал разбираться с написанием робота. Сам робот на простой ma10. Вход при пробитии закрытия свечи ma(закрытием снизу вверх — лонг, сверху в них — шорт). Выход по стопам, при этом после стопа входить в противоположную сторону по открытию следующего часа. И выход по пробитию закрытия свечи и ma.
1)Не могу понять в какую часть когда записать следующее условие: нужно что бы робот выходил при пробитии закрытия свечи ma и делал переворот.
2)Как прописать условие переворота, по открытию следующего часа, переворота при выбивании стопа.
3)Как прописать перенос сделок через ноч.



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

Quik: отлавливаем заявки на скорость с помощью Lua и колбэков

    • 08 октября 2021, 22:15
    • |
    • FatCat
  • Еще

Строя автоматизированную торговлю на базе Квик, нет-нет да и столкнёшься с ситуацией, когда отправленная заявка исполняется совсем не так быстро как хотелось бы. Удивляться тут нечему, производительность квиковских серверов брокера не резиновая, на всплесках нагрузки могут изрядно подтупливать. Что с этим делать?
Запилить торговую систему через прямое подключение к бирже задача совсем другого уровня сложности по сравнению с демократичным Квиком со встроенным языком Lua. Что же, будем выкручиваться с имеющимся инструментарием.

Для получения информации о выставлении или перестановке заявки можно использовать колбэки OnTransReply (со значением поля status = 3) или OnOrder. Сильно ли они отличаются между собой по скорости? Для ответа на этот вопрос я прикрутил логгирование задержек срабатывания этих колбэков от момента вызова функции отправки заявки на сервер до срабатывания соответствующего колбэка. Логгирование выполнялось на дельтахеджере и опционном котировщике. Данные собирались в течение месяца не первом сервере в Открывашке, сам Квик работал на VDS-хостинге.



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

Не знаю, почему автор молчит

    • 08 октября 2021, 11:57
    • |
    • Vkt
  • Еще
Есть реально полезная штука — фреймворк для торговых роботов
Оказывается существует новая версия:  github.com/ffeast/hacktrade
А я все на старой сидел, про которую узнал тут:   smart-lab.ru/blog/195508.php
Как можно использовать -  smart-lab.ru/blog/246568.php



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

Индикатор горизонтальной ширины канала за период

Ширина канала показана синим отрезком, канал строится за отрезок показанный зеленым цветом
по перегибам можно понять что тренд заканчивается
Индикатор горизонтальной ширины канала за период
Settings={
Name="Buy_osc_v01",
period=50,
delta=0,
lim=100.0,
line=                                     
                {  
					{  
                        Name = "cur1",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0, 0, 255)
                    },
					{  
                        Name = "cur2",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0, 0, 0)
                    },
					{  
                        Name = "cur3",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0, 0)
                    },
					{  
                        Name = "cur4",
                        Type =TYPE_LINE,
                        Width = 1,
                        Color = RGB(0,0, 0)
                    }

                }

}
--[[

описание свойств:
period - период, за каротрый делается расчет
delta - смещение назад 

назначение:
горизонтальная ширина канала 

использовался:
метод наименьших квадратов (аппроксимация линией)

--]]

function Init()
  
  return 2
end

function OnCalculate(index)
    
  sz = Size()
  n = Settings.period
  d = Settings.delta
  lim = Settings.lim
        	
   y = nil    
   if index-n-d > 0 then
    a1 = 0
	a2 = 0
	a3 = 0
	a4 = 0
    for i=index-n+1-d, index-d do  

	  a1 = a1+i*C(i)
	  a2 = a2+i
	  a3 = a3+C(i)
	  a4 = a4+i*i
	
    end  
	
	if((n*a4 - a2*a2) ~= 0) then
	 a = (n*a1 - a2*a3)/(n*a4 - a2*a2)
	 b = (a3 - a*a2)/n
    
	 c1 = 0
	 c2 = 0
	 n1 = 0
	 n2 = 0
     for j=index-n+1-d, index-d do  
      y = a*j + b
	  if C(j) < y then
	    c1 = c1 + (y -C(j))
		n1 = n1 + 1
	  end
	  if C(j) > y then
	    c2 = c2 + (C(j) - y)
		n2 = n2 + 1
	  end	  
     end	
	 
	 if n1 ~= 0 then
	   c1 = c1/n1
	 end
	 if n2 ~= 0 then
	   c2 = c2/n2
	 end		 
	 
	 if a==0 then
	   y = 0
	 else
	   y = (c1+c2)/a	
	   if y > lim then 
	     y = lim 
	   else 
         if y < -lim then 
		   y = -lim
         end   		 
	   end 	 
	 end 

	 
    end 
   end 	
   
   return y,0 
  
end



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