Постов с тегом "qlua": 177

qlua


QLua скринер стакана. Или стакан к празднику!

Всем привет, и желаю здравствовать!
Вчера один наш коллега попросил решить простенькую задачу — отображать стаканный спред в моменте, то есть (best_ask_price+best_bid_brice)/2 с помощью луа-скрипта. Вот такой был диалог:
QLua скринер стакана. Или стакан к празднику!
Чего уж проще, выдался час свободного времени решил помочь. Но походу разработки, пришли идеи сделать, что-то типа скринера стакана с дополнительной информацией, которая, возможно будет полезна для анализа.
А идеи возникли следующие: добавить для мониторинга объем всех бидов и асков, разницу (дельту) между объемами покупок и продаж. Но это можно теперь наблюдать даже на графике в Квике(не прошло и 15-ти лет). А вот следующая идея показалась мне интересной. Рассчитывать в моменте VWP (Volume Weighted Price) цену взвешенную на объем для бидов и асков по отдельности. Чтобы было понятно о чем идет речь покажу это на примере стакана в Jatotrader для RIZ0:
QLua скринер стакана. Или стакан к празднику!

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

бюджетный вариант удаленного робота на виртуальном сервере (4)

в продолжение поста https://smart-lab.ru/blog/offtop/638196.php
напомню еще раз сам себе, чем я занимаюсь, для чего мне нужен виртуальный сервер. Идея простая — для того, чтобы использовать преимущества мобильной торговли, мне нужен софт (можно назвать его «советник»), которое будет посылать сигналы на телефон. Понятно, что для такой «простой» задачи не требуется «навароченное железо». Задачи следующие — считать данные о текущих ценах из терминала, сохранить их в БД, посчитать свои индикаторы, сравнить с выставленными уставками и сигнализировать об алармах по почте или через бота. Планируется получать сигналы не чаще 3-5 раз за одну торговую сессию.
Что я сейчас уже реализовал — подобрал дешевый VPS (55 р/месяц), установил XP и два терминала (QUIK и ALOR) от разных брокеров, написал и протестил программы, которые позволяют сохранять информацию о ценах в файлы(SQLite база данных), через которые потом другая прога — «советник», будет формировать сигналы. Этот софт я начал писать на Python 3.4 (так как 3.4 это последняя версия поддерживаемая ХР)

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

бюджетный вариант удаленного робота на виртуальном сервере (3)

в продолжение поста https://smart-lab.ru/blog/634376.php
Удалось найти провайдера с VPS (RAM 512M+установка своей OS) всего за 55 руб/месяц.
Поставил минимальную XP + QUIK 7.5 + ALOR + Python 3.4 + VS2010 + NET 4.0  и все это на 7 GB влезло.
Неделю уже в реале работает !

бюджетный вариант удаленного робота на виртуальном сервере (3)

Теперь надо попробовать со скриптами QLUA + Python 3 запустить…

qlua написать скрипт, вывод таблицы в csv файл

сейчас вывожу по dde в excel.
Можно через lua выводить выбранные таблицы в csv файлы с интервалом 5-10мин, сразу после запуска quik ?

ps кто может написать скрипт?
  • обсудить на форуме:
  • Quik Lua

QLua скринер, или то, о чём мечтал Weddy!

Всем, привет!
Мечты сбываются (и не только у Газпрома)! Weddy, надеюсь этим постом я полностью закрываю ваше ТЗ.
QLua скринер, или то, о чём мечтал Weddy!
Суть скринера в вышеизложенном пожелании. Т.к. первый и второй скринеры не удовлетворяли требованиям ТЗ Weddy.
Надеюсь, теперь все ок. Выглядит так:
QLua скринер, или то, о чём мечтал Weddy!

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

QLua скринер. Обновление.

Всем привет!
В продолжение топика «QLua скринер в 10 строк кода. Или „за базар отвечаю“, можно качать обнулённый обновлённый скринер.
Выглядит так в статике:
QLua скринер. Обновление.
А так в динамике.
Если в прошлом скринере отображалось изменение текущей цены от цен закрытия за соответствующее количество торговых сессий (список „срезов“ задается пользователем), то в этом будет две таблицы. Первая таблица — изменение текущей цены от предыдущих хаев (чуть не оговорился...) за N-торговых сессий, вторая — от предыдущих лоёв.
В первой таблице от минимумов выделена строка с длинными ОФЗ. Видно, что минимум цены за 30 торговых сессий был на прошлой сессии.
А во второй таблице, мы видим, что Яндекс и Магнит обновили сегодня свои максимумы за последние 90 торговых сессий.
Таким образом, техзадание (ТЗ) участника тусовки Weddy практически выполнено, остается доделать, как он просил, тот же функционал, только относительно списка заданных дат.

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

QLua скринер в 10 строк кода. Или "за базар отвечаю".

Всем привет!
Никогда не давайте обещаний которые не можете выполнить. Во-первых — это портит карму. Во-вторых, за сказанное нужно отвечать. В далеких (не очень) 90-х, если человек не держал слова, к нему приезжали «санитары» с электроприборами, типа дрель, паяльник, утюг — все перечислять не буду, чтобы не пугать читателя, т.к. пост многие найдут полезным не только для торговли, но и для написания собственного кода. Так вот, пообещал я человеку, дело было так:
QLua скринер в 10 строк кода. Или "за базар отвечаю".
Мой родной язык, помимо русского, Common Lisp. С недавних пор породнился с Питоном. А тут луа, да еще с Квиком вперемешку. Не фиг было обещания давать. Больше времени потратил на изучение структур данных луа и особенностей QLua. Сам код был написан за пару часов, как увидите ниже — чё там писать-то...
Как я обещал — пользователь Смартлаба Weddy получает код бесплатно, как и остальные участники тусовки. Ну а я, в качестве вознаграждения получаю приобретенный опыт. Проверял сегодня — работает с любым Квиком (6, 7, 8). Конечно дополнительных «наворотов» я не делал, как в идеале желал Weddy, но это уже детали.

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

Алготрейдинг. Получение данных свечей средствами QLUA и запись их в .CSV

Алготрейдинг. Получение данных свечей средствами QLUA

Очень часто бывает необходимо получить данные последних N-свечей различного интервала инструмента торговли. К сожалению, в справке QLUA нет достаточно полных примеров кода работы получения данных. В скрипте приведён пример получения данных интервала М1 инструмента BRN0 в формате <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>. Данные пишутся в CSV формат.
Почему просто не выводить по DDE график и обрабатывать его в чём-нибудь более приятном? Есть простые вещи, для которых нет необходимости в таких конструкциях (проанализировать резкое изменение объема, найти определенную формацию/комбинацию свечей, а затем вывести в quik сообщение).
-------------------------------------------------------------------------------------------------------
--- Функция получения результатов свечей в .CSV в виде:
--- <Инструмент> <Дата> <Время> <Цена_Open> <Цена_High> <Цена_Low> <Цена_Close> <Объем>
--- BRN0	1	20200605	200100	42.15	42.16	42.1	42.1	2150
-------------------------------------------------------------------------------------------------------
is_run=true

-- Параметры
tInstr="BRN0" --код инструмента/бумаги
classcode="SPBFUT" --код класса инструмента/бумаги, если нужен фондовый рынок - вводить TQBR вместо SPBFUT
iNterval=INTERVAL_M1 --таймфрейм
-- доступные таймфреймы указаны в справке Quik (qlua.chm в папке с quik) по поиску CreateDataSource
-- пример INTERVAL_H1
corrTime=3 --Время МСК. C сервера время приходит без корректировки.
pFile="w:\\temp" --путь, где будет создаваться файл
cBars=10 --сколько свечей надо вывести
--настройка параметров

function OnInit()
	out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
	is_run=(out_file~=nil)
	ds=CreateDataSource(classcode, tInstr, iNterval ) --создаем источник данных
	ds:SetUpdateCallback(NewChartData) --обновление последних данных
end

function strText(int)
	local m=tostring(int)
	local mLen=string.len(int)

	if mLen==1 then
		Output="0" .. tostring(m)
	else Output=m
	end
	return Output
end

function main()
	while is_run do
	local Size=ds:Size() --Получение количества всех свечей в источнике данных

	if cBars>Size then
		cBars=Size-1
	end

	for i=Size-cBars, Size, 1 do
		local O=ds:O(i) -- Значение цена открытия свечи
		local H=ds:H(i) -- Значение High для свечи
		local L=ds:L(i) -- Значение Low для свечи
		local C=ds:C(i) -- Значение Close для свечи
		local V=ds:V(i) -- Значение Volume для свечи
		local T=ds:T(i) -- Значение Time для свечи

		sTime=os.time(T)
		datetime=os.date("!*t",sTime)

		--вывод в файл
		out_file:write(tInstr..";"..tostring(iNterval)..";"..tostring(datetime.year)..tostring(strText(datetime.month))..tostring(strText(datetime.day))..";"..tostring(strText(datetime.hour + corrTime))..tostring(strText(datetime.min))..tostring(strText(datetime.sec))..";"..tostring(O)..";"..tostring(H)..";"..tostring(L)..";"..tostring©..";"..tostring(V).."\n")
		out_file:flush() --запись данных
	end
		out_file:close()
		sleep(1000)   -- приостановка на 1 секунду
		out_file=io.open(pFile .."\\"..tostring(tInstr)..".csv","w")
	end
end
  • обсудить на форуме:
  • Quik Lua

Замотала, эта Lua.

    • 29 мая 2020, 15:26
    • |
    • 3Qu
  • Еще
Давненько я не брал в руки шашки не писал индикаторов на Lua. Вчера ближе к ночи приспичило перенести старый отработанный индикатор с Python в терминал на Lua-QLua.
Взял, как водится, какой-то готовый, и начал его переделывать. Дел, в общем, немного, вместо одной линии нарисовать три, и оставив болванку везде поменять код. Python, в общем, похож на Lua (все языки программирования оч. похожи), а потому, берем код Python, в Notepad++ копипастим его в Lua индикатор, немного исправляем синтаксис, немного исправляем код под особенности индикаторов, и через 20 минут готово.
Пытаемся добавить на график. Счас! Индикатор вообще не виден.
Начинаем корежить код и танцевать с бубном. Че сделали, так и не поняли, но индикатор в меню настроек появился — победа! Но, не тут-то было. Однако, добавить не удается, тут же вылетает. Опять танцы с бубном.
Теперь добавляется, но Quik наглухо виснет и падает. Но, зато начал писать ошибку — строка 86, там какой-то nil. Какой еще nil, там строка, типа, buff[i] = a*b[i]^2 + c*d[i]^2. Да, сколько можно? Откуда там nil? Бредятина какая-то.

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

Мой первый робот(ещё в разработке)

Это мой первый робот.
Суть стратегии заключается в мониторинге текущей цены по выбранному инструменту и при значительном изменении цены в противоположном направлении, при подъёме или падении осуществляется ввод заявки на покупку или продажу соответственно.
Код ещё «сырой». Кому не сложно прошу выявить ошибки и предложить советы, рекомендации по оптимизации кода.
Отправка транзакций заменена на сообщения для отладки алгоритма без последствий для счёта.
На данном этапе условия для покупки и продажи не корректны, так как покупает и продаёт с не всегда указанным local Procent, уже голову себе сломал как это исправить.
Интересуют следующие вопросы:
1)Как сделать, чтобы не покупал пока есть открытая позиция?
2)Если возможно, как рассчитать издержки комиссий, чтобы при вычитании их не быть в минусе?
3)Правильная ли структура кода?

CLASSCODE="TQBR"

SECCODE="YNDX"

QUANTITY="1"



 tB = {
            ["CLASSCODE"]=CLASSCODE,
            ["SECCODE"]=SECCODE,
            ["ACTION"]="NEW_ORDER",
            ["ACCOUNT"]="СЧЕТ",
            ["CLIENT_CODE"]="КОД КЛИЕНТА",
            ["TYPE"]="M",
            ["OPERATION"]="B",
            ["QUANTITY"]=QUANTITY,
            ["PRICE"]="0",
            ["TRANS_ID"]="1"
      }

tS = {
            ["CLASSCODE"]=CLASSCODE,
            ["SECCODE"]=SECCODE,
            ["ACTION"]="NEW_ORDER",
            ["ACCOUNT"]="СЧЕТ",
            ["CLIENT_CODE"]="КОД КЛИЕНТА",
            ["TYPE"]="M",
            ["OPERATION"]="S",
            ["QUANTITY"]=QUANTITY,
            ["PRICE"]="0",
            ["TRANS_ID"]="1"
	  }



run=true
function main()

local Price="0"
local Procent=0.005

	 while run do
	         --Получение текущей цены по инструменту
		 local lastPriceT = getParamEx(CLASSCODE, SECCODE, "LAST");--Обращение к ячейке таблицы с ценой
                 local lastPrice = tonumber(lastPriceT.param_value);--Значение текущей цены
		 --Текущая цена получена в переменной - "lastPrice"
		 ----------------------------------------------------
		 --Преобразование Price в строчное значение
		 Price=tonumber(Price)
		 if Price==0 then Price=lastPrice                            --Если Price=0, то к Price присваивается lastPrice
		 end
		 Proc=(lastPrice-Price)/Price*100                            --Процент изменения в переменной Proc
		 ----------------------------------------------------
		 --Покупка
		 if Price < lastPrice then Price = lastPrice                 --Если Price больше lastPrice то, к Price присваивается lastPrice
			 elseif Proc>-Procent then message("Произведена покупка по цене="..tostring(lastPrice))   --sendTransaction(tB)-- --Иначе, если Proc>-0.005 то отправляется заявка на покупку
		 --Покупка произведена
		 ----------------------------------------------------
		 end
		 --Продажа
		 if Price > lastPrice then Price = lastPrice
		         elseif Proc>Procent then message("Произведена продажа по цене="..tostring(lastPrice))
		 --Продажа произведена
		 end
     sleep(5000)                                             --Прерывание скрипта на 5 секунд
	 end
end
function OnStop()
run=false
end

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